嗨,我正在编写执行以下操作的多播代码:
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和端口号。
那么如何在单个系统上测试呢??? ???
答案 0 :(得分:1)
只有一个程序实例可以bind
到EXAMPLE_PORT。当您的第一个实例正在运行时,您无法启动另一个实例,因为它将尝试绑定到已经在使用的EXAMPLE_PORT。因此,您看到绑定错误。
客户无需bind
。您创建一个套接字并执行sendto
和recvfrom
您可以创建多个客户端实例。没问题。 (当然,应该限制可以创建多少socket
个
服务器需要bind
。在系统中,您只能将一个UDP程序实例绑定到一个特定端口。
答案 1 :(得分:0)
完成所有操作后,您始终需要关闭套接字:
close(int sockfd);
否则端口会一直阻塞,直到连接到它的套接字超时(大多数在30到180秒之间)。