Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C UNIX-如何在服务器端使用多个套接字接收UDP消息以过滤它们?_C_Multithreading_Unix_Udp_Filtering - Fatal编程技术网

C UNIX-如何在服务器端使用多个套接字接收UDP消息以过滤它们?

C UNIX-如何在服务器端使用多个套接字接收UDP消息以过滤它们?,c,multithreading,unix,udp,filtering,C,Multithreading,Unix,Udp,Filtering,我正在UNIX上用C编写UDP服务器和客户端。我需要在服务器上自己的线程中处理每个客户机。在每个线程中,我只希望接收来自相应客户端的消息。现在我正在使用recvfrom偷看消息,并检查消息是否是“我的” 我听说可以让多个套接字监听同一个主机:端口,并将它们中的每一个连接到相应的客户端,这样它将只接收来自所述客户端的消息。下面是我遇到新客户机时运行的代码。然而,在第一个客户端连接之后,消息实际上是经过过滤的,但不仅在新套接字上,而且在主套接字上侦听新客户端,所以我无法连接新客户端 void fun

我正在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");
}
}
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
  • 源未知,请创建新线程,并为此源注册回调
  • 每当您想要“断开”客户机时,取消注册回调并删除线程
请注意,我所说的“断开”是指应用程序的逻辑方式,因为UDP套接字未连接