Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.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

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
1台计算机、2个程序、2个不同子网上的2个NIC、两个程序之间的开放套接字/绑定端口冲突,为什么?_C_Sockets_Networking_Port_Bind - Fatal编程技术网

1台计算机、2个程序、2个不同子网上的2个NIC、两个程序之间的开放套接字/绑定端口冲突,为什么?

1台计算机、2个程序、2个不同子网上的2个NIC、两个程序之间的开放套接字/绑定端口冲突,为什么?,c,sockets,networking,port,bind,C,Sockets,Networking,Port,Bind,我正在Linux上使用C/C++进行一个项目,需要使用我只知道一点的API连接到两个类似的网络设备 我的组织是一台计算机和两个以太网适配器 我们称之为lan1适配器,设置为IP:100.1.1.2,网络设备目标为100.1.1.1,子网为255.255.255.0 lan2适配器的IP为100.1.2.2,网络设备目标为100.1.2.1,子网为255.255.255.0 我正在构建两个独立的程序,每个程序使用相同的网络初始化代码连接到网络目标 问题是,在第一个程序初始化其与各自网络目标的连接后

我正在Linux上使用C/C++进行一个项目,需要使用我只知道一点的API连接到两个类似的网络设备

我的组织是一台计算机和两个以太网适配器

我们称之为lan1适配器,设置为IP:100.1.1.2,网络设备目标为100.1.1.1,子网为255.255.255.0

lan2适配器的IP为100.1.2.2,网络设备目标为100.1.2.1,子网为255.255.255.0

我正在构建两个独立的程序,每个程序使用相同的网络初始化代码连接到网络目标

问题是,在第一个程序初始化其与各自网络目标的连接后,另一个程序在尝试初始化其与各自目标的网络连接时,无法绑定其端口。我不确定程序之间为什么会存在这种冲突,因为每件事都应该是分开的

下面是API中尝试创建套接字和绑定端口的部分:

static short create_socket(int port, UINT32 blocking)
{
    int trycount =0;
    struct sockaddr_in sin;
    int r;
    u_long yes = blocking ? 0 : 1;      // nonblocking toggle
    BOOL en = TRUE;

    if ((our_socket= socket(PF_INET/*AF_INET*/, SOCK_DGRAM, 0)) <0)
    {
        printf("Socket open failed: %d\n", WSAGetLastError());
        return -1;
    }
    if(!yes)
        r = 0; // by default it is blocking
    else
        r= fcntl(our_socket,F_SETFL,O_NONBLOCK);
    if(r<0)
    {
         printf("IOCTL failed setting blocking state: %d %d ", r, errno);
         closesocket(our_socket);
         return r;
    }



    bzero((char *) &sin, sizeof(sin));
        sin.sin_family = AF_INET;
    sin.sin_addr.s_addr = INADDR_ANY;
    sin.sin_port =  htons((unsigned short)port);

    r = bind(our_socket, (struct sockaddr *) &sin, sizeof(sin));
    while(r == EADDRINUSE && trycount <10  )
    {
            port ++;
            sin.sin_port =  htons((unsigned short)port);
            r = bind(our_socket, (struct sockaddr *) &sin, sizeof(sin));
            trycount ++;
    }
    if(r<0)
    {
        printf("Socket BIND failed: %d %d port %d\n", r, errno, port);
        closesocket(our_socket);
        return r;
    }

    r = setsockopt( our_socket, SOL_SOCKET, SO_BROADCAST, (const char *)&en, sizeof(en));
    if(r)
    {
      printf("Socket Broadcast enable failed: %d\n", r);
      closesocket(our_socket);
      return r;
    }
        recvcount = 0;
    return 0;
}
static short create_套接字(int端口,UINT32阻塞)
{
int trycount=0;
sin中的结构sockaddr_;
INTR;
u_long yes=阻塞?0:1;//非阻塞切换
BOOL-en=TRUE;

如果((我们的套接字=套接字(PF_INET/*AF_INET*/,SOCK_DGRAM,0))符合@EOF,则问题是

INADDR_ANY
排队

sin.sin_addr.s_addr = INADDR_ANY;
这导致端口绑定到所有可用的网络接口上


编辑:修复了一个错误的复制/粘贴问题

很容易判断,如果让两个进程绑定同一个端口,那么绑定就失败了。您的代码表明了这一点。感谢@EOF的指导,一些研究表明,“当您不需要将套接字绑定到特定IP时,将使用INADDR\U ANY”,并且“在绑定调用中指定INADDR_ANY时,套接字将绑定到所有本地接口。"我不确定lulyon是否彻底阅读了我的帖子,我是否使用了单独的接口,因为绑定失败的原因并不清楚,绑定特定端口也不应该如此笼统,除非我猜INADR_中使用了代码中的任何参数。要回答这个问题,我会接受吗?它在t之后的行中实际上是帽子。@EJP,你说得对,我现在把它修好了。我手机上的复制/粘贴选项不正确。如果你因此否决了我的答案,请相应地更改投票结果。