关于Linux下SO_REUSEADDR的疑问?
如下演示程序,程序目的是:
先准备好一个ServerSocket,监听端口8880,
然后建一个ClientSocket(受限于业务需要,必须在ServerSocket准备好后再建Client),也必须绑定同一端口8880,
问题是:为什么对ClientSocket bind(port 8880)时,会报错EADDRINUSE?我已经启用了SO_REUSEADDR。
为了方便于大家试运行,我把代码简化的没有其他库依赖,只需g++ -o demo demo.cpp即可运行。
先准备好一个ServerSocket,监听端口8880,
然后建一个ClientSocket(受限于业务需要,必须在ServerSocket准备好后再建Client),也必须绑定同一端口8880,
问题是:为什么对ClientSocket bind(port 8880)时,会报错EADDRINUSE?我已经启用了SO_REUSEADDR。
为了方便于大家试运行,我把代码简化的没有其他库依赖,只需g++ -o demo demo.cpp即可运行。
//demo.cpp
#include <stdio.h>
#include <netdb.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
#include <linux/tcp.h>
int SockDemo()
{
sockaddr_in in;
memset(&in,'\0',sizeof(in));
in.sin_family=AF_INET;
in.sin_port=htons(8880);
in.sin_addr.s_addr=INADDR_ANY;
int reuse0=1;
int serv=socket(AF_INET, SOCK_STREAM, 0);
if (setsockopt(serv, SOL_SOCKET, SO_REUSEADDR, (char *)&reuse0, sizeof(reuse0))==-1) return errno;
if (bind(serv, (sockaddr*)&in, sizeof(sockaddr)) == -1) return errno;
if (listen(serv, SOMAXCONN)==-1) return errno;
int reuse1=1;
int client=socket(AF_INET, SOCK_STREAM, 0);
if (setsockopt(client, SOL_SOCKET, SO_REUSEADDR, (char *)&reuse1, sizeof(reuse1))==-1) return errno;
if (bind(client, (sockaddr*)&in, sizeof(sockaddr)) == -1) return errno;
//****** 此处为报错 *****:errno=98, Address already in use.
sleep(1);
close(client);
close(serv);
return 0;
}
int main(int argc, char *argv[])
{
int errcode=SockDemo();
printf("errno=%d, %s.\n", errcode, strerror(errcode));
return 0;
}
...全文
相关推荐
详谈套接字中SO_REUSEPORT和SO_REUSEADDR的区别
下面小编就为大家分享一篇详谈套接字中SO_REUSEPORT和SO_REUSEADDR的区别,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
SO_LINGER与TIME_WAIT解析[源码]
本文详细解析了Linux网络编程中SO_LINGER选项的作用及其对TCP连接关闭行为的影响。SO_LINGER通过设置l_onoff和l_linger参数,可以控制close调用的行为,包括立即返回、丢弃数据并发送RST包或延迟关闭以确保数据发送完成。文章还探讨了TIME_WAIT状态的作用及其在短连接中可能引发的问题,并提出了两种解决方法:设置SO_REUSEADDR允许端口重用和通过SO_LINGER避免TIME_WAIT状态。同时,作者提醒这些选项需谨慎使用,以避免数据丢失或其他潜在问题。
Linux下Socket编程的端口问题 ( Bind(): Address already in use ) PDF版
Linux Socket Bind() 成功解决socket编程中bind端口绑定的Error:Address already in use 错误。
Linux网络编程:端口复用
Linux网络编程:端口复用,相关教程链接如下: http://blog.csdn.net/tennysonsky/article/details/44062173
SO_REUSEADDR和SO_REUSEPORT异同,以及在不同操作系统的差异
SO_REUSEADDR和SO_REUSEPORT异同,以及在不同操作系统的差异


