多播发送器/接收器程序中的bind()错误

时间:2015-04-30 07:19:46

标签: c sockets multicast

嗨,我正在编写执行以下操作的多播代码:

1)在命令行上使用组播组ip和端口。它加入组并等待消息。 2)它每隔15秒发送一个“hello-”+ time()来计算该组中存在多少成员。 3)收到“你好 - ”+时间()的任何成员,只是回应相同。 已发送问候的成员会在5秒内对收到的回复进行计数,并在屏幕上显示计数。

但我必须在一个文件中实现它。为了获得部分我正在接受一段代码

#define EXAMPLE_PORT 6000
#define EXAMPLE_GROUP "239.0.0.1"

####


    sockrecv = socket(AF_INET, SOCK_DGRAM, 0);
       if (sockrecv < 0) {
         perror("socket send");
         exit(1);
       }
       bzero((char *)&addrrecv, sizeof(addrrecv));
       addrrecv.sin_family = AF_INET;
       addrrecv.sin_addr.s_addr = htonl(INADDR_ANY);
       addrrecv.sin_port = htons(EXAMPLE_PORT);
       addrlenrecv = sizeof(addrrecv);

       if (bind(sockrecv, (struct sockaddr *) &addrrecv, sizeof(addrrecv)) < 0) {        
             perror("bind");
         exit(1);
          }    
          mreq.imr_multiaddr.s_addr = inet_addr(EXAMPLE_GROUP);         
          mreq.imr_interface.s_addr = htonl(INADDR_ANY);         
          if (setsockopt(sockrecv, IPPROTO_IP, IP_ADD_MEMBERSHIP,
                 &mreq, sizeof(mreq)) < 0) {
         perror("setsockopt mreq");
         exit(1);
          }

问题是测试它我必须在我的系统上运行多个副本。第一次运行正常程序

但是在第二次执行时,bind()调用会给出错误,因为套接字已经附加到该端口号

但如果程序必须从组接收消息,它已将套接字绑定到特定的IP和端口号。

那么如何在单个系统上测试呢??? ???

2 个答案:

答案 0 :(得分:1)

只有一个程序实例可以bind到EXAMPLE_PORT。当您的第一个实例正在运行时,您无法启动另一个实例,因为它将尝试绑定到已经在使用的EXAMPLE_PORT。因此,您看到绑定错误。

客户无需bind。您创建一个套接字并执行sendtorecvfrom您可以创建多个客户端实例。没问题。 (当然,应该限制可以创建多少socket

服务器需要bind。在系统中,您只能将一个UDP程序实例绑定到一个特定端口。

答案 1 :(得分:0)

完成所有操作后,您始终需要关闭套接字:

close(int sockfd);

否则端口会一直阻塞,直到连接到它的套接字超时(大多数在30到180秒之间)。