2012-05-16 18 views
0

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

我的问题是上machine_1:

  1. 我有两个线程在那里,一个处理传出数据以machine_2和一个处理输入数据。在第一个线程中(处理传出数据),我创建了4个套接字(带有4个不同的端口)来寻址machine_2上的相应套接字。在这个方向正常工作...
  2. 但是当我尝试创建从machine_2输入数据的插座,我希望像我一样对machine_2输入数据使用相同的端口号,但后来我遇到的问题当我尝试绑定套接字时。给我: Address already in use错误。

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

如果来了代码示例需要,我可以在这里添加它们,但我说这只是工作它通过一个插座上machine_2 4个不同的插座处理传出数据的thread_1。

在此先感谢您的帮助!

我希望附加的图片可以解释更多的情况一点,重要的是我想在两台机器上的输入数据使用相同的端口号。意思是,机器_1上的端口_1具有与机器_2上的端口_1相同的端口号,等等...... port_configuration

+0

你能澄清一件事,你在创建线程1 4个插槽,另外4线程2? – Fred

+0

是的,这就是我想要做的。我想这就是问题所在,但我还没有解决方案。在Thr_1中,我创建了4个套接字来处理远程machine_2的套接字。在Thr_2中,我想在本地计算机上创建4个侦听传入数据包的套接字... – nyyrikki

回答

1

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

下面是关于如何使用选择一个例子:

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

2

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

懒惰的例子(可能是越野车,但你应该得到的总体思路):

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(); 
    } 
    /* ... */ 
} 
+0

+1用于为使用ip和端口对发送和使用sendto()提示单个fd。 – Alam

相关问题