如何使用多个套接字服务器端接收UDP消息,以便过滤它们



我在UNIX上用C编写UDP服务器和客户端。我需要处理每个客户端在自己的线程在服务器上。在每个线程中,我只想接收来自相应客户端的消息。现在我正在使用recvfrom查看消息并检查消息是否为"我的"。

我听说有可能在同一个主机端口上监听多个套接字,并将它们每个连接到相应的客户端,这样它将只接收来自所述客户端的消息。这是我运行的代码,当我遇到新的客户端。然而,在第一个客户端连接消息之后,实际上是过滤的,但不仅在新套接字上,而且在主套接字上侦听新客户端,所以我不能连接新客户端。

void fun(int* sockfd, struct sockaddr_in* my_addr, struct sockaddr_in* cli_addr)){
if ((*sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
    ERR("socket");
}
int optval = 1;
bzero(my_addr, sizeof (*my_addr));
my_addr->sin_family = AF_INET;
my_addr->sin_port = htons(PORT);
my_addr->sin_addr.s_addr = htonl(INADDR_ANY);
if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof (optval)) < 0) {
    ERR("setsockopt");
}
if (bind(sockfd, (struct sockaddr*) my_addr, sizeof (*my_addr)) == -1) {
    ERR("bind");
}
if (connect(*socket, (struct sockaddr*) cli_addr, sizeof (*cli_addr)) < 0)
    ERR("connect");
}
}

有一个更好的(和工作)的方式来过滤UDP消息?

在我看来,你应该使用一个线程来接收和发送数据,然后分派给其他线程。

不需要多个套接字服务器端。一个套接字接收所有数据报,您通过提取源来处理它们,然后调度它。

你可以这样做:

数据报被读取:

  • 源是已知的,调用它的back
  • 源是未知的,创建一个新的线程,并为这个源注册一个回调。
  • 当你想"断开"一个客户端时,注销回调并删除线程。

请注意,通过"断开",我的意思是在您的应用程序的逻辑方式,因为UDP套接字没有连接。

最新更新