1台计算机、2个程序、2个不同子网上的2个NIC、两个程序之间的开放套接字/绑定端口冲突,为什么?
我正在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中尝试创建套接字和绑定端口的部分: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 我正在构建两个独立的程序,每个程序使用相同的网络初始化代码连接到网络目标 问题是,在第一个程序初始化其与各自网络目标的连接后
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,你说得对,我现在把它修好了。我手机上的复制/粘贴选项不正确。如果你因此否决了我的答案,请相应地更改投票结果。