socket编程端口复用问题

chxime 2014-12-03 11:00:35
socket编程,想将几个客户端,绑定到同一个端口上,第一个可以绑定成功,第二个bind返回错误,errno=98(address already in use),我在socket选项里已经加上了,地址可以复用选项:
int optval=1;
setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,(char*)&optval,sizeof(optval));
可为啥还是报错呢,等高手给指点一下
...全文
875 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
kd_pp1987 2015-03-12
  • 打赏
  • 举报
回复
楼主,您的问题解决了么?
我也出现类似的问题。我在客户端,创建两个socket, 其他端口复用功能,然后把他们与同一个端口绑定,绑定第二个时就出错了
Socket client1 = null;
Socket client2= null;
client1.setReuseAddress(true);
client1 2.setReuseAddress(true);
bindpoint = new InetSocketAddress(InetAddress.getByName("192.168.1.111"),8000);
csocket1.bind(bindpoint );
csocket2.bind(bindpoint ); //这里就提出出错
图灵狗 2014-12-03
  • 打赏
  • 举报
回复
错误信息很明确,地址不能复用。
jacxie2009 2014-12-03
  • 打赏
  • 举报
回复
一般来说,一个端口释放后会等待两分钟之后才能再被使用,SO_REUSEADDR是让端口释放后立即就可以被再次使用。 SO_REUSEADDR用于对TCP套接字处于TIME_WAIT状态下的socket(TCP连接中,先调用close()的一方会进入TIME_WAIT状态),才可以重复绑定使用。server程序总是应该在调用bind()之前设置SO_REUSEADDR套接字选项。 SO_REUSEADDR允许启动一个监听服务器并捆绑其众所周知端口,即使以前建立的将此端口用做他们的本地端口的连接仍存在。这通常是重启监听服务器时出现,若不设置此选项,则bind时将出错。 SO_REUSEADDR允许在同一端口上启动同一服务器的多个实例,只要每个实例捆绑一个不同的本地IP地址即可。对于TCP,我们根本不可能启动捆绑相同IP地址和相同端口号的多个服务器。 SO_REUSEADDR允许单个进程捆绑同一端口到多个套接口上,只要每个捆绑指定不同的本地IP地址即可。这一般不用于TCP服务器。 SO_REUSEADDR允许完全重复的捆绑:当一个IP地址和端口绑定到某个套接口上时,还允许此IP地址和端口捆绑到另一个套接口上。一般来说,这个特性仅在支持多播的系统上才有,而且只对UDP套接口而言(TCP不支持多播)。
mujiok2003 2014-12-03
  • 打赏
  • 举报
回复
先搞清楚SO_REUSEADDR 是干嘛的
mujiok2003 2014-12-03
  • 打赏
  • 举报
回复
What exactly does SO_REUSEADDR do? This socket option tells the kernel that even if this port is busy (in the TIME_WAIT state), go ahead and reuse it anyway. If it is busy, but with another state, you will still get an address already in use error. It is useful if your server has been shut down, and then restarted right away while sockets are still active on its port. You should be aware that if any unexpected data comes in, it may confuse your server, but while this is possible, it is not likely.
我不是扫地僧 2014-12-03
  • 打赏
  • 举报
回复
看来楼主用的是TCP吧? TCP是不支持处于连接状态的,相同的IP和端口重复绑定的。一般TCP的SO_REUSEADDR用于服务器, 以便服务器崩溃重启时, 可直接Bind处于TIME_WAIT状态的端口。 不知道楼主的目的, 也许UDP的多播、广播能解决楼主的问题

69,336

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧