【发布时间】: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(..., &flag, sizeof(flag));另外,不要忘记 Linux 也有一个SO_REUSEPORT选项。 -
@RemyLebeau 有趣的链接,我也会这样做。使用额外的变量并不困扰我。但可以肯定的是代码是不正确的,它可能是什么意思。而且由于 Beej 的解释很有意义,所以我们没有看到
#define PF_INET AF_INET,这很奇怪。