1个计算机,2个程序,2个不同子网上的2个网卡,两个程序之间打开socket / bind端口冲突,为什么?

时间:2016-06-10 15:01:00

标签: 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

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

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

以下是尝试创建套接字并绑定端口的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;
}

默认情况下,输入参数启用阻塞,错误将抛出消息“Socket BIND failed”。

我也试过禁用阻塞,而是得到另一个错误,即套接字文件描述符被标记为O_NONBLOCK,其中一个操作(尚未找出哪个)会导致阻塞。虽然,我甚至不确定“阻塞”是两个程序之间冲突的原因。

任何想法为什么这两个单独的程序在初始化与各自目标的网络连接时会发生冲突,以及如何避免它?

谢谢, 乙

1 个答案:

答案 0 :(得分:-1)

根据@EOF,问题是

INADDR_ANY

sin.sin_addr.s_addr = INADDR_ANY;

导致端口绑定在所有可用的网络接口上。

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