问题描述
当我通过广播低于code消息时,主机上的服务器也收到消息,我怎么能prevent主机接收其发送的信息?
是否有可能改变的东西在code,或者它会更好地使用像如果(STRCMP(主机IP == IP_of_the_package)== 0){<丢弃味精> }
?主机从DHCP获取IP,我怎么可以定义主机IP作为一个变量
我怎么能提取数据包的IP地址
?
无效boardcast_msg(字符*一塌糊涂){
INT袜子;
结构SOCKADDR_IN broadcastAddr;
字符* broadcastIP;
无符号短broadcastPort;
字符* sendString;
INT broadcastPermission;
INT sendStringLen; broadcastIP =255.255.255.255;
broadcastPort = 33333; sendString =混乱; / *字符串*广播/
如果((袜子=插座(PF_INET,SOCK_DGRAM,IPPROTO_UDP))小于0){
fprintf中(标准错误,套接字错误);
出口(1);
}
broadcastPermission = 1;
如果(setsockopt的(袜子,SOL_SOCKET,SO_BROADCAST,(无效*)及broadcastPermission,sizeof的(broadcastPermission))小于0){
fprintf中(标准错误,setsockopt的错误);
出口(1);
} / *构造本地地址的结构* /
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); / *广播sendString数据报给客户* /
如果(SENDTO(袜子,sendString,sendStringLen,0,(结构sockaddr *)及broadcastAddr,sizeof的(broadcastAddr))= sendStringLen!){
fprintf中(标准错误,SENDTO错误);
出口(1);
}}
禁用回,所以你没有收到自己的数据报文:
字符loopch = 0;如果(setsockopt的(SD,IPPROTO_IP,IP_MULTICAST_LOOP,
(字符*)及loopch,sizeof的(loopch))< 0){
PERROR(设置IP_MULTICAST_LOOP:);
关闭(SD);
出口(1);
}
从:<一href=\"http://publib.boulder.ibm.com/infocenter/iseries/v5r3/index.jsp?topic=%2Frzab6%2Frzab6x1multicast.htm\" rel=\"nofollow\">http://publib.boulder.ibm.com/infocenter/iseries/v5r3/index.jsp?topic=%2Frzab6%2Frzab6x1multicast.htm
When I broadcast a message by the code below, the server on the host machine also receive the message, how can I prevent host machine to receive the message that it sends?
Is it possible to change something on the code or would it be better to use something like if (strcmp(hostIP == IP_of_the_package) == 0) { <discard the msg>}
? the host machine gets IP from DHCP, how can I define hostIP as a variable
and How can I extract 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);
}
}
Disable loopback so you do not receive your own datagrams:
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);
}
这篇关于用C UDP广播的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!