C UNIX-如何在服务器端使用多个套接字接收UDP消息以过滤它们?
我正在UNIX上用C编写UDP服务器和客户端。我需要在服务器上自己的线程中处理每个客户机。在每个线程中,我只希望接收来自相应客户端的消息。现在我正在使用recvfrom偷看消息,并检查消息是否是“我的” 我听说可以让多个套接字监听同一个主机:端口,并将它们中的每一个连接到相应的客户端,这样它将只接收来自所述客户端的消息。下面是我遇到新客户机时运行的代码。然而,在第一个客户端连接之后,消息实际上是经过过滤的,但不仅在新套接字上,而且在主套接字上侦听新客户端,所以我无法连接新客户端C UNIX-如何在服务器端使用多个套接字接收UDP消息以过滤它们?,c,multithreading,unix,udp,filtering,C,Multithreading,Unix,Udp,Filtering,我正在UNIX上用C编写UDP服务器和客户端。我需要在服务器上自己的线程中处理每个客户机。在每个线程中,我只希望接收来自相应客户端的消息。现在我正在使用recvfrom偷看消息,并检查消息是否是“我的” 我听说可以让多个套接字监听同一个主机:端口,并将它们中的每一个连接到相应的客户端,这样它将只接收来自所述客户端的消息。下面是我遇到新客户机时运行的代码。然而,在第一个客户端连接之后,消息实际上是经过过滤的,但不仅在新套接字上,而且在主套接字上侦听新客户端,所以我无法连接新客户端 void fun
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");
}
}
void fun(int*sockfd,结构sockaddr\u in*my\u addr,结构sockaddr\u in*cli\u addr)){
如果(*sockfd=socket(AF_INET,SOCK_DGRAM,0))=-1){
错误(“套接字”);
}
int optval=1;
bzero(我的地址,sizeof(*我的地址));
my_addr->sin_family=AF_INET;
my_addr->sin_port=htons(端口);
my_addr->sin_addr.s_addr=htonl(INADDR_ANY);
if(setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&optval,sizeof(optval))<0){
错误(“设置锁定选项”);
}
if(bind(sockfd,(struct sockaddr*)my_addr,sizeof(*my_addr))=-1){
错误(“绑定”);
}
if(connect(*socket,(struct sockaddr*)cli_addr,sizeof(*cli_addr))<0)
错误(“连接”);
}
}
是否有更好(且有效)的方法来过滤UDP消息?在我看来,您应该使用一个线程来接收和发送数据,然后发送到其他线程 不需要多个套接字服务器端。一个套接字接收所有数据报,您通过提取源来处理它们,然后发送它 你可以这样做: 数据报被读取:
- 来源已知,请调用您的backback
- 源未知,请创建新线程,并为此源注册回调
- 每当您想要“断开”客户机时,取消注册回调并删除线程