如何复用TCP socket的套接字?
编TCP socket客户端程序的时候,一般都是这样的:
1.调用socket()得到TCP套接字
2.把这个套接字作为connect()的参数发动连接
3.传输完数据之后shutdown()然后close()
我不想反复调用socket()创建套接字,想节省
我打算:
1.sock_fd = socket()
{
2.connect()
3.send() or recv()
4.shutdown(sock_fd)
}
5.close(sock_fd)
循环2,3,4过程
但是用起来不行
具体表现:
如果connect()失败,这个sock_fd还可以再次利用,一旦connect()成功,shutdown()后再也不能connect()
用perror()输出的connect()失败的信息是: 套接字已经连接
也就是说,没有connect()成功的TCP socket套接字可以多次尝试connect()(连接地址可以任意选择)直到成功,但只要connect()成功
就算是shutdown()也不能再用于连接其它地址了,只有close()
有没有办法复用套接字?
调用socket()创建套接字的系统开销是很大的
BTW:
shutdown()和close()完全是两码事,建议close()之前一定要shutdown(sock_fd, 2)断开连接, 对服务器对客户端都是友好的,
有利于两边的系统及时回收端口,强烈BS那些导致CLOSE_WAIT状态的TCP程序
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
想复用为什么还要关闭?
即使你调用close后,系统内核还要和对方发确认关闭
关闭后,等于你SOCEKT创建的fd关闭了,当然就不能用了
shutdown真的会有利于及时回收端口吗?我试试......正在为进程结束后这个端口老是处在Time_wait状态苦恼。
好象这样是不可以的,你shutdown以后,实际上是还可以收到服务器端的消息的,也就是说你的这个连接还存在,连接还存在应该不能创建新的连接.
另外,shutdown和close是有区别的,不过也仅仅是用法不同而已,如果你关闭连接后,还需要得到server的响应,那就调用shutdown,如果没这个需求,直接close也是可以的.跟让服务器和客户端及时释放端口一点关系也没有,呵呵