当我通过下面的代码广播消息时,主机上的服务器也会收到消息,如何防止主机接收它发送的消息?
是否可以更改代码中的某些内容,或者更好地使用if (strcmp(hostIP == IP_of_the_package) == 0) { <discard the msg>}
之类的内容?主机从DHCP获取IP,如何定义hostIP as a variable
以及如何提取IP addr of the packet
?
void boardcast_msg(char *mess){
int sock;
struct sockaddr_in broadcastAddr;
char *broadcastIP;
unsigned short broadcastPort;
char *sendString;
int broadcastPermission;
int sendStringLen;
broadcastIP = "255.255.255.255";
broadcastPort = 33333;
sendString = mess; /* string to broadcast */
if ((sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0){
fprintf(stderr, "socket error");
exit(1);
}
broadcastPermission = 1;
if (setsockopt(sock, SOL_SOCKET, SO_BROADCAST, (void *) &broadcastPermission,sizeof(broadcastPermission)) < 0){
fprintf(stderr, "setsockopt error");
exit(1);
}
/* Construct local address structure */
memset(&broadcastAddr, 0, sizeof(broadcastAddr));
broadcastAddr.sin_family = AF_INET;
broadcastAddr.sin_addr.s_addr = inet_addr(broadcastIP);
broadcastAddr.sin_port = htons(broadcastPort);
sendStringLen = strlen(sendString);
/* Broadcast sendString in datagram to clients */
if (sendto(sock, sendString, sendStringLen, 0, (struct sockaddr *)&broadcastAddr, sizeof(broadcastAddr)) != sendStringLen){
fprintf(stderr, "sendto error");
exit(1);
}
}
答案 0 :(得分:2)
禁用环回,因此您不会收到自己的数据报:
char loopch=0;
if (setsockopt(sd, IPPROTO_IP, IP_MULTICAST_LOOP,
(char *)&loopch, sizeof(loopch)) < 0) {
perror("setting IP_MULTICAST_LOOP:");
close(sd);
exit(1);
}
答案 1 :(得分:1)
您走在正确的轨道上,您需要查看收到的包裹是否来自您自己,然后将其丢弃。
获取本地主机地址的最简单方法是使用gethostname
和gethostbyname
。但是,如果您的主机有多个主机名或IP地址,这些将无法正常工作。搜索SO(或Google)以了解如何获取所有可能的网络地址。
答案 2 :(得分:-1)
您的计划的广播目的地端口应在您的计算机上被阻止,以避免接收自播。
在您的iptables
中,您可以删除在该端口上收到的(TCP
或UDP
)数据包。
答案 3 :(得分:-1)
recvfrom
会给你一个地址。使用它。
对于要匹配的地址,在许多系统(可能是您关心的系统)上,您可以使用getifaddrs
获取本地IP地址。但是这不在POSIX中。