Linux中的双UDP套接字绑定

时间:2010-03-05 04:30:31

标签: c++ linux udp sockets

在C ++中,当我运行时(红色警报!伪代码)

bind(s1, <local address:port1234>)
bind(s2, <local address:port1234>)

在两个不同的UDP套接字(s1s2上,每个套接字都通过调用socket()创建)我遇到了问题。在Linux(Ubuntu)中,双重绑定似乎没问题。但是,在Windows中,双重绑定失败,第二次对同一地址的bind()调用返回!= 0

我希望在我的Linux机器上获得Windows上的行为。是否有一些设置可以让我在Linux上“忙碌”?

3 个答案:

答案 0 :(得分:4)

请参阅bindsetsockopt。除非您使用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 ipman 7 udp中没有提及UDP绑定的例外情况。 (这并不能证明什么,但是在基本的事情中没有记录的行为是......令人惊讶。)