我发现在系统启动时,该地址已在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;
}
答案 0 :(得分:0)
我知道我可以在rcS文件中保留端口 -
sysctl -w net.ipv4.ip_local_reserved_ports=49155