如何复用TCP socket的套接字?

发布于 2022-07-24 11:05:31 字数 847 浏览 18 评论 3

编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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

冰雪之触 2022-07-24 14:11:03

想复用为什么还要关闭?
即使你调用close后,系统内核还要和对方发确认关闭

关闭后,等于你SOCEKT创建的fd关闭了,当然就不能用了

楠木可依 2022-07-24 13:22:02

shutdown真的会有利于及时回收端口吗?我试试......正在为进程结束后这个端口老是处在Time_wait状态苦恼。

所有深爱都是秘密 2022-07-24 12:20:34

好象这样是不可以的,你shutdown以后,实际上是还可以收到服务器端的消息的,也就是说你的这个连接还存在,连接还存在应该不能创建新的连接.

另外,shutdown和close是有区别的,不过也仅仅是用法不同而已,如果你关闭连接后,还需要得到server的响应,那就调用shutdown,如果没这个需求,直接close也是可以的.跟让服务器和客户端及时释放端口一点关系也没有,呵呵

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文