【问题标题】:UDP -- Socket - bind error - Address already in use?UDP - 套接字 - 绑定错误 - 地址已在使用中?
【发布时间】:2016-09-22 09:16:39
【问题描述】:

我看到该地址在系统启动时已在 bind() 上使用。

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

绑定失败。错误:地址已在使用中。

每次重新启动系统时 - 我正在使用 close(gTx.i4TxSockId) 关闭套接字。

这是代码,我不确定如何调试。

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

成功后,我看到:

netstat: /proc/net/tcp6: 没有这样的文件或目录 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: 没有这样的文件或目录 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;
}

【问题讨论】:

  • 这不太可能是问题的原因,但最近我了解到应该是PF_INET 而不是AF_INET。通常我认为AF_INET 只是#define AF_INET PF_INET。但正确的常量是PF_INET
  • 也许你的意思是(int[]){1},而不是read this
  • @iharob:使用实际变量而不是尝试对临时数组进行类型转换会更安全。 setsockopt() 需要一个指向变量的指针:int flag = 1; setsockopt(..., &amp;flag, sizeof(flag)); 另外,不要忘记 Linux 也有一个 SO_REUSEPORT 选项。
  • @RemyLebeau 有趣的链接,我也会这样做。使用额外的变量并不困扰我。但可以肯定的是代码是不正确的,它可能是什么意思。而且由于 Beej 的解释很有意义,所以我们没有看到 #define PF_INET AF_INET,这很奇怪。

标签: c linux sockets


【解决方案1】:

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

sysctl -w net.ipv4.ip_local_reserved_ports=49155

【讨论】:

    猜你喜欢
    • 2021-05-21
    • 1970-01-01
    • 2014-11-03
    • 2011-09-16
    • 2015-05-26
    • 1970-01-01
    • 2019-11-01
    • 2023-02-12
    • 2011-01-09
    相关资源
    最近更新 更多