0

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

4

1 回答 1

1

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

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

你可以这样做:

读取数据报:

  • 来源是已知的,调用你有它的backback
  • 源未知,创建一个新线程,并为此源注册回调。
  • 每当您想“断开”客户端时,请取消注册回调并删除线程。

请注意,“断开连接”是指您的应用程序的逻辑方式,因为未连接 UDP 套接字。

于 2013-06-06T18:53:16.140 回答