在C ++中,当我运行时(红色警报!伪代码)
bind(s1, <local address:port1234>)
bind(s2, <local address:port1234>)
在两个不同的UDP套接字(s1
和s2
上,每个套接字都通过调用socket()
创建)我遇到了问题。在Linux(Ubuntu)中,双重绑定似乎没问题。但是,在Windows中,双重绑定失败,第二次对同一地址的bind()
调用返回!= 0
。
我希望在我的Linux机器上获得Windows上的行为。是否有一些设置可以让我在Linux上“忙碌”?
答案 0 :(得分:4)
请参阅bind和setsockopt。除非您使用SO_REUSEADDR调用了setsockopt,否则使用相同地址调用bind会导致EADDRINUSE失败。
答案 1 :(得分:2)
这不是我在Linux上的行为。当我运行以下测试程序时,第二次bind
调用失败并显示EADDRINUSE
:
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
int main()
{
int s1, s2;
struct sockaddr_in sa = {
.sin_family = AF_INET,
.sin_port = 0x5555,
.sin_addr.s_addr = INADDR_ANY };
s1 = socket(PF_INET, SOCK_DGRAM, 0);
s2 = socket(PF_INET, SOCK_DGRAM, 0);
if (bind(s1, (struct sockaddr *)&sa, sizeof sa) < 0)
perror("bind 1");
if (bind(s2, (struct sockaddr *)&sa, sizeof sa) < 0)
perror("bind 2");
return 0;
}
答案 2 :(得分:0)
你确定吗?根据我的Linux机器上的man 7 ip
(fedora 9):
当进程想要接收新的传入数据包或连接时,它应该使用bind(2)将套接字绑定到本地接口地址。 只有一个IP套接字可以绑定到任何给定的本地(地址,端口)对。
man 7 ip
或man 7 udp
中没有提及UDP绑定的例外情况。 (这并不能证明什么,但是在基本的事情中没有记录的行为是......令人惊讶。)