C/如何为传入和传出数据绑定多个套接字
当我尝试绑定多个套接字时,我在代码中发现了一个问题。我试图解释一下这种情况,我有一个由两部分组成的应用程序,一部分是用C编写的,运行在机器_1上,另一部分是用Java编写的,运行在机器_2上。C程序应该能够通过一个端口将udp数据包发送到正在侦听它们的机器_2上的4个端口。反之亦然,机器2应通过一个传出端口向机器1上的4个对应端口发送udp数据包 我遇到的问题在机器1上:C/如何为传入和传出数据绑定多个套接字,c,sockets,C,Sockets,当我尝试绑定多个套接字时,我在代码中发现了一个问题。我试图解释一下这种情况,我有一个由两部分组成的应用程序,一部分是用C编写的,运行在机器_1上,另一部分是用Java编写的,运行在机器_2上。C程序应该能够通过一个端口将udp数据包发送到正在侦听它们的机器_2上的4个端口。反之亦然,机器2应通过一个传出端口向机器1上的4个对应端口发送udp数据包 我遇到的问题在机器1上: 我有两个线程,一个处理发送到机器2的数据,另一个处理传入数据。在第一个线程(处理传出数据)中,我创建了4个套接字(具有4个不
:地址已在使用中
错误select()
函数侦听所有4个传入套接字
如果需要代码示例,我可以在这里添加它们,但正如我所说的,它只适用于线程_1,该线程通过机器_2上的一个套接字到4个不同的套接字处理传出数据
提前感谢您的帮助
我希望随附的图片能更详细地解释这种情况,重要的是我想在两台机器上使用相同的端口号来接收数据。意味着,机器\u 1上的端口\u 1与机器\u 2上的端口\u 1具有相同的端口号,依此类推…创建一个用于发送的套接字,然后创建四个用于接收的套接字,将接收套接字绑定到正确的本地端口。在传出套接字上使用sendto将内容发送到接收器 select的惰性示例(可能有bug,但您应该了解其基本思想):
fd\u设置fds;
int nfds=/*最大值(in_1、in_2、in_3、in_4)+1*/;
而(1){
int-ret=0;
FD_零(&fds);
FD_集(在_1和fds中);
FD_集合(in_2和fds);
FD_集合(在_3和fds中);
FD_集合(在_4和fds中);
ret=select(nfds和fds,NULL,NULL,NULL);
如果(ret<0){
中断;/*出了问题*/
}else if(ret==0){
继续;/*无需执行任何操作,请重试*/
}
if(FD_ISSET(in_1和fds)){
在_1()中处理_;
}
if(FD_ISSET(in_2和fds)){
在_2()中处理_;
}
/* ... */
}
创建一个用于发送的套接字,然后创建四个用于接收的套接字,将接收套接字绑定到正确的本地端口。在传出套接字上使用sendto将内容发送到接收器
select的惰性示例(可能有bug,但您应该了解其基本思想):
fd\u设置fds;
int nfds=/*最大值(in_1、in_2、in_3、in_4)+1*/;
而(1){
int-ret=0;
FD_零(&fds);
FD_集(在_1和fds中);
FD_集合(in_2和fds);
FD_集合(在_3和fds中);
FD_集合(在_4和fds中);
ret=select(nfds和fds,NULL,NULL,NULL);
如果(ret<0){
中断;/*出了问题*/
}else if(ret==0){
继续;/*无需执行任何操作,请重试*/
}
if(FD_ISSET(in_1和fds)){
在_1()中处理_;
}
if(FD_ISSET(in_2和fds)){
在_2()中处理_;
}
/* ... */
}
我的建议是只使用4个插座。套接字是双向的(也就是说,如果您确实需要4个套接字,因为这是UDP,一个套接字可能就足够了)。然后,您可以在多个线程之间共享套接字,并对它们进行读取或写入。您只需要确保同步需要同步的内容
下面是一个关于如何使用select的示例:
我的建议是只使用4个插座。套接字是双向的(也就是说,如果您确实需要4个套接字,因为这是UDP,一个套接字可能就足够了)。然后,您可以在多个线程之间共享套接字,并对它们进行读取或写入。您只需要确保同步需要同步的内容 下面是一个关于如何使用select的示例:
您能否澄清一件事,您是否在线程1中创建了4个套接字,在线程2中创建了4个套接字?是的,这就是我试图做的。我想这就是问题所在,但我还没有解决办法。在Thr_1中,我创建了4个套接字来寻址远程机器的套接字。在Thr_2中,我想在本地机器上创建4个套接字,侦听传入的数据包…您能否澄清一件事,您是否在线程1中创建4个套接字,在线程2中创建另外4个套接字?是的,这就是我尝试做的。我想这就是问题所在,但我还没有解决办法。在Thr_1中,我创建了4个套接字来寻址远程机器的套接字。在Thr_2中,我想在本地机器上创建4个套接字,侦听传入的数据包…+1表示建议发送单个fd并使用sendto()和ip及端口对。+1表示建议发送单个fd并使用sendto()和ip及端口对。
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();
}
/* ... */
}