【问题标题】:C UNIX - How to use multiple sockets server-side to receive UDP messages in order to filter them?C UNIX - 如何在服务器端使用多个套接字来接收 UDP 消息以过滤它们?
【发布时间】:2013-06-02 20:49:15
【问题描述】:

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

【问题讨论】:

    标签: c multithreading unix udp filtering


    【解决方案1】:

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

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

    你可以这样做:

    数据报被读取:

    • 来源已知,请致电您的后台
    • 来源未知,创建一个新线程,并为此来源注册回调。
    • 当您想“断开”客户端时,取消注册回调并移除线程。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-17
      • 2017-09-04
      • 2016-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多