我正在 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 消息?