socket Bind error:Address already in use

本文介绍了在Unix Domain Socket和网络通信中遇到的'Address already in use'错误。对于Unix Domain Socket,错误源于bind()尝试绑定已存在的文件。而对于网络通信,错误是由于TCP套接字在close()后进入TIME_WAIT状态,需要等待一段时间才能重用端口。解决方法是使用setsockopt()设置SO_REUSEADDR选项,允许重用本地地址和端口。
摘要由CSDN通过智能技术生成

     一:本地通信:unix domain socket 与网络socket编程最大的不同在于地址格式不同,用结构体socketaddr_un表示,网络地址是由ip加端口号决定,而domain socket的地址是一个socket类型的文件在文件系统的路径,该文件由bind()函数创建并绑定,如果bind时该文件已经存在,则绑定失败。因此每次把创建的socket文件删除或者bind一个新的socket文件。

    二:网络通信:程序第一次可以正确运行并且结束,但第二次开始就会出现错误bind:Address already in use,只能用ctrl+c强制结束,这个问题是由TCP 套接字状态TIME_WAIT 引起,在套接字通过close()正常关闭后,会保留2到4分钟,该套接字才会删除,同时与该套接字绑定的端口和本地地址才可以被重新绑定。所以如果我们运行过一次程序,用close(sockfd)删除这个套接字之后,其实要等到几分钟之后,才会真正删除,这段时间内的端口和本地地址是仍然与该套接字绑定的,如果你立即再执行一遍程序,便会提示:这个地址正在使用中。

    有一个绕过TIME_WAIT的方法就是,给套接字设置一下,让它可以绑定一个复用的端口就可以了。具体是利用setsockopt函数。

intsets

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值