1

当我尝试绑定多个套接字时,我在代码中发现了一个问题。我试着解释一下情况,我有一个由两部分组成的应用程序,一个是用 C 编写的,运行在 machine_1 上,另一个是用 Java 编写,运行在 machine_2 上。C 程序应该能够通过一个端口将 udp 数据包发送到正在侦听它们的 machine_2 上的 4 个端口。反之亦然,machina_2 应该通过一个输出端口将 udp 数据包发送到 machine_1 上的 4 个相应端口。

我遇到的问题在 machine_1 上:

  1. 我在那里有两个线程,一个处理到 machine_2 的传出数据,一个处理传入数据。在第一个线程(处理传出数据)中,我创建了 4 个套接字(具有 4 个不同的端口)来寻址 machine_2 上的相应套接字。在那个方向上工作得很好......
  2. 但是当我尝试为来自 machine_2 的传入数据创建套接字时,我想使用与 machine_2 上的传入数据相同的端口号,但是当我尝试绑定套接字时遇到了问题。给我: Address already in use错误。

我需要一些关于如何在 C 应用程序内的 machine_1 上为传出和传入端口设置套接字配置的帮助。也许还有一个关于如何使用该select()函数监听所有 4 个传入套接字的示例。

如果需要代码示例,我可以在此处添加它们,但正如我所说,它仅适用于 thread_1,它通过一个套接字处理传出数据到 machine_2 上的 4 个不同套接字。

在此先感谢您的帮助!

我希望所附的图片可以更多地解释这种情况,重要的是我想在两台机器上使用相同的端口号来接收数据。意味着 machine_1 上的 port_1 与 machine_2 上的 port_1 具有相同的端口号,依此类推...端口配置

4

2 回答 2

3

创建一个用于发送的套接字,然后创建四个用于接收的套接字,将接收套接字绑定到正确的本地端口。在传出套接字上使用 sendto 将内容发送到接收器。

select 的懒惰示例(可能有问题,但您应该了解总体思路):

fd_set fds;
int nfds = /* max(in_1, in_2, in_3, in_4) + 1 */;
while(1) {
    int ret = 0;
    FD_ZERO(&fds);
    FD_SET(in_1, &fds);
    FD_SET(in_2, &fds);
    FD_SET(in_3, &fds);
    FD_SET(in_4, &fds);
    ret = select(nfds, &fds, NULL, NULL, NULL);
    if(ret < 0) {
        break; /* something went wrong */
    } else if(ret == 0) {
        continue; /* nothing to do, try again */
    }
    if(FD_ISSET(in_1, &fds)) {
        handle_in_1();
    }
    if(FD_ISSET(in_2, &fds)) {
        handle_in_2();
    }
    /* ... */
}
于 2012-05-16T07:55:07.903 回答
1

我的建议是只使用 4 个插座。套接字是双向的(也就是说,如果你真的需要 4 个套接字,因为这是 UDP,一个套接字可能就足够了)。然后,您可以在多个线程之间共享套接字并对其进行读取或写入。您只需要确保同步需要同步的任何内容。

下面是一个关于如何使用 select 的示例:

http://www.lowtek.com/sockets/select.html

于 2012-05-16T07:55:38.587 回答