用C UDP广播 [英] UDP broadcast in C

查看:221
本文介绍了用C UDP广播的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

当我通过广播低于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);
}

from: http://publib.boulder.ibm.com/infocenter/iseries/v5r3/index.jsp?topic=%2Frzab6%2Frzab6x1multicast.htm

这篇关于用C UDP广播的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆