Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C/如何为传入和传出数据绑定多个套接字_C_Sockets - Fatal编程技术网

C/如何为传入和传出数据绑定多个套接字

C/如何为传入和传出数据绑定多个套接字,c,sockets,C,Sockets,当我尝试绑定多个套接字时,我在代码中发现了一个问题。我试图解释一下这种情况,我有一个由两部分组成的应用程序,一部分是用C编写的,运行在机器_1上,另一部分是用Java编写的,运行在机器_2上。C程序应该能够通过一个端口将udp数据包发送到正在侦听它们的机器_2上的4个端口。反之亦然,机器2应通过一个传出端口向机器1上的4个对应端口发送udp数据包 我遇到的问题在机器1上: 我有两个线程,一个处理发送到机器2的数据,另一个处理传入数据。在第一个线程(处理传出数据)中,我创建了4个套接字(具有4个不

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

我遇到的问题在机器1上:

  • 我有两个线程,一个处理发送到机器2的数据,另一个处理传入数据。在第一个线程(处理传出数据)中,我创建了4个套接字(具有4个不同的端口)来寻址机器2上的相应套接字。在那个方向很好
  • 但是,当我尝试为来自机器2的传入数据创建套接字时,我希望使用与我在机器2上的传入数据相同的端口号,但是当我尝试绑定套接字时,我遇到了问题。给我
    :地址已在使用中
    错误
  • 我需要一些关于如何在C应用程序内的机器_1上为传出和传入端口设置套接字配置的帮助。还有一个示例,介绍如何使用
    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();
        }
        /* ... */
    }