两个进程可以从同一端口接收UDP包吗



我正在编写一个从UDP服务器接收数据的客户端程序。

客户端向服务器的指定(ip,port(发送订阅请求,服务器开始向客户端的指定端口发送UDP包。如果某个包丢失,客户端会向另一个服务器发送请求,请求该包。

我的问题是,在我编译并运行客户端程序后,我可以启动同一客户端程序的另一个实例吗?

您可以运行同一客户端程序的多个实例。

但是,您不能在一台主机中同时为两个不同的UDP套接字绑定相同的UDP端口号(如果没有SO_REUSEADDR(。

因此,这些客户端实例应该使用不同的客户端UDP端口号。为客户端获取不同端口号的最佳方法是:让操作系统为客户端套接字分配可用端口号。

通常,当绑定套接字时,可以使用端口号0来完成:

struct sockaddr_in addr;
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = INADDR_ANY;
addr.sin_port = 0;
if (bind(sockfd, (const struct sockaddr *)&addr, sizeof(addr)) == -1)
{
perror("bind failed");
exit(EXIT_FAILURE);
}   

编辑:

为了接收UDP广播,可以在socket()bind()调用之间使用套接字选项SO_REUSEADDR

int val = 1;
if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val)) == -1)
{
perror("setsockopt failed");
exit(EXIT_FAILURE);
}
struct sockaddr_in addr;
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = INADDR_ANY;
addr.sin_port = htons(12345);
if (bind(sockfd, (const struct sockaddr *)&addr, sizeof(addr)) == -1)
{
perror("bind failed");
exit(EXIT_FAILURE);
}

这样,几个进程就可以绑定同一个端口来接收广播消息-->将向所有"听众"发送广播消息。