Linux网络编程之端口复用 Address already in use

为什么需要端口复用

在这里插入图片描述我们直到,TCP连接在进行4次挥手断开连接时,为了确保最后一次ACK到达对端,保证对端正确关闭资源,以防止对傻傻等待浪费网络和计算机资源,要求等待2MSL时常,那么对于我们需要立即重启程序的情况不友好,有过经验的朋友都知道,我们关闭一个链接,然后立马重启这个连接,一般会报bind失败:
虽然这个图是客户端主动断开连接,实际服务端主动断开也是一样的过程

bind error: Address already in use

表示端口号正在被占用,因为前一次的链接还没有被完全释放,通过指令可以查看到上次连接处于TIME_WAIT状态:
假设上次使用的端口号是6000

netstat -apn | grep 6000

如何设置断口复用:允许等待2MSL的同时,继续使用该端口进行监听

#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
int setsockopt(int sockfd, int level, int optname,
              const void *optval, socklen_t optlen);

需要将socket描述符选项设置SO_REUSEADDR设置为1:

代码加入到bind()调用之前即可:

int opt = 1;
setsockopt(listenfd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt));
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值