Я хочу отправить многоадресный отчет, а адрес источника - это адрес виртуального интерфейса, как это сделать? спасибо.
например:
Информация об интерфейсе:
eth0 Link encap: Ethernet HWaddr 00: 0C: 35: 00: 11: 22
адрес в сети Интернет: 192.168.126.100 Bcast: 192.168.126.255 Маска: 255.255.255.0
eth0: 111 Ограничение канала: Ethernet HWaddr 00: 0C: 35: 00: 11: 22
адрес в сети Интернет: 192.168.200.52 Bcast: 192.168.200.255 Маска: 255.255.255.0
Я хочу отправить многоадресный отчет, а адрес источника - 192.168.200.52, как это сделать?
Мой код:
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <net/if.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct sockaddr_in localSock;
struct ip_mreq group;
int sd;
int datalen;
char databuf[1024];
int main(int argc, char *argv[])
{
/* Create a datagram socket on which to receive. */
sd = socket(AF_INET, SOCK_DGRAM, 0);
if(sd < 0)
{
perror("Opening datagram socket error");
exit(1);
}
else
{
printf("Opening datagram socket....OK.\n");
}
/* Bind to the proper port number with the IP address */
/* specified as INADDR_ANY. */
memset((char *) &localSock, 0, sizeof(localSock));
localSock.sin_family = AF_INET;
localSock.sin_port = htons(4321);
localSock.sin_addr.s_addr = inet_addr("192.168.200.52");;
if(bind(sd, (struct sockaddr*)&localSock, sizeof(localSock)))
{
perror("Binding datagram socket error");
close(sd);
exit(1);
}
else
{
printf("Binding datagram socket...OK.\n");
}
/* Join the multicast group 226.1.1.1 on the local 203.106.93.94 */
/* interface. Note that this IP_ADD_MEMBERSHIP option must be */
/* called for each local interface over which the multicast */
/* datagrams are to be received. */
group.imr_multiaddr.s_addr = inet_addr("226.1.1.1");
group.imr_interface.s_addr = inet_addr("192.168.200.52");
if(setsockopt(sd, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *)&group, sizeof(group)) < 0)
{
perror("Adding multicast group error");
close(sd);
exit(1);
}
else
{
printf("Adding multicast group...OK.\n");
}
/* Read from the socket. */
datalen = sizeof(databuf);
if(read(sd, databuf, datalen) < 0)
{
perror("Reading datagram message error");
close(sd);
exit(1);
}
else
{
printf("Reading datagram message...OK.\n");
printf("The message from multicast server is: \"%s\"\n", databuf);
}
return 0;
}