2010-09-22 80 views
1

我有一个由客户定义的连接协议。数据在两台Linux计算机之间使用UDP和TCP协议发送。 IP地址和端口在启动时固定。重新打开已连接的数据报套接字

我们以200赫兹发送消息,并且我一直使用连接来节省传输时间。

我的问题是,如果有通信错误,我需要拆除连接并重新初始化。

我与UDP连接的一个问题,因为它不会重新绑定到所需要的地址,返回errno设置22

我使用的代码是一样的东西:

int 
doConnect(int& sock, int local_port, char *local_ip, int remote_port, char *remote_ip) 
{ 
    sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); 
    struct sockaddr_in addr; 

    memset(&addr, 0, sizeof(sockaddr_in); 
    addr.sin_family = AF_INET; 
    addr.sin_port = htons(local_port); 
    inet_pton(local_ip,&addr.sin_addr.s_addr); 

    if (0 > bind(sock, (struct sockaddr*)&addr, sizeof(addr))) 
    { 
     printf("Bind Error errno = %d\n", errno); 
     return ERR_BIND; 
    } 

    memset(&addr, 0, sizeof(sockaddr_in); 
    addr.sin_family = AF_INET; 
    addr.sin_port = htons(remote_port); 
    inet_pton(remote_ip,&addr.sin_addr.s_addr); 

    if (0 > connect(sock, (struct sockaddr*)&addr, sizeof(addr))) 
    { 
     printf("Connect Error errno = %d\n", errno); 
     return ERR_CONNECT; 
    } 
    return ERR_OK; 
} 

方式这是用来是这样的:

int s1(-1), s2(-1); 
doConnect(s1, 31003, "172.17.21.255", 31006, "172.17.21.1"); 
doConnect(s2, 31001, "172.17.21.3", 31004, "172.17.21.1"); 

当发生错误时

close(s1); 
close(s2); 

doConnect(s1, 31003, "172.17.21.255", 31006, "172.17.21.1"); 
doConnect(s2, 31001, "172.17.21.3", 31004, "172.17.21.1"); 

这里的本地地址是172.17.21.3,我连接到172.17.21.1。 s1收听广播消息。

s1成功重新连接到远程机器,但s2失败,错误22从调用绑定。

我已经尝试明确地调用绑定并在我关闭套接字之前立即连接到AF_UNSPEC地址。这并不能解决问题。

有没有我应该使用的选项?

+0

我注意到每次调用doConnect时,在s1和s2中都会设置相同的套接字标识。 s1和s2不是相同的值。 – DanS 2010-09-23 07:54:18

回答

0

即使在您致电close后,底层套接字层可能会保留端口&的IP地址仍然打开。尝试以下一些:

  • sleep(10)(或更多)的close和调用doConnect再次
  • 配置使用setsockoptSO_LINGER设置为断开

这实际上插座之间TCP连接更常见,但我认为没有理由UDP也不能有这个问题。

2

或许你可以尝试:

int val = 1; 
setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val)); 

我也建议你仔细检查你没有通过相同插座的两个连续doConnect()调用(如错误号22 = EINVAL,这in the case of bind()似乎意味着套接字已经绑定到一个地址)。

相关问题