UDP - 套接字 - 绑定错误 - 已在使用的地址?

时间:2016-05-24 23:54:24

标签: c linux sockets

我发现在系统启动时,该地址已在bind()上使用。

当我重新加载系统很多次时,我看到偶尔会像100分中的一样,我看到以下错误:

  

bind failed.Error:地址已在使用中。

每次重启系统时 - 我都会使用close(gTx.i4TxSockId)关闭套接字。

这是代码,我不知道如何调试它。

我添加了netstat -ap以找出问题所在。

成功之后,我明白了:

netstat: /proc/net/tcp6: No such file or directory
udp        0      0 0.0.0.0:syslog          0.0.0.0:*                           1562/syslog-ng
udp        0      0 0.0.0.0:49155           0.0.0.0:*                           1817/App.exe

失败时,我明白了:

netstat: /proc/net/tcp6: No such file or directory
udp        0      0 0.0.0.0:45825           0.0.0.0:*                           1816/App.exe
udp        0      0 0.0.0.0:syslog          0.0.0.0:*                           1562/syslog-ng
udp        0      0 localhost:49155         0.0.0.0:*                           1816/App.exe

我添加了以下行:

if (setsockopt(gTx.i4TxSockId, SOL_SOCKET, SO_REUSEADDR, &(int){ 1 }, sizeof(int)) < 0)
{
    perror("Failed in SO_REUSEADDR");
    return;
}

这没有任何区别。

我使用的是嵌入式linux - 版本 - 3.8.8

struct sockaddr_in  LocalAddr;

gTx.i4TxSockId = socket (AF_INET, SOCK_DGRAM, IPPROTO_UDP);

if (gTx.i4TxSockId < 0)
{
    printf("Error in opening socket");
    return ;
}

if (setsockopt(gTx.i4TxSockId, SOL_SOCKET, SO_REUSEADDR, &(int){ 1 }, sizeof(int)) < 0)
{
    perror("Failed in SO_REUSEADDR");
    return;
}

LocalAddr.sin_family = AF_INET;
LocalAddr.sin_addr.s_addr = INADDR_ANY;
LocalAddr.sin_port = HTONS(49155);

/* Bind with the socket */
if (bind (gTx.i4TxSockId, (struct sockaddr *) &LocalAddr, sizeof (struct sockaddr_in)) < 0)
{
    /* Failure in binding the UDP socket */
    perror("bind failed.Error");
    return;
}

1 个答案:

答案 0 :(得分:0)

我知道我可以在rcS文件中保留端口 -

sysctl -w net.ipv4.ip_local_reserved_ports=49155