C中的套接字:关闭套接字的正确方法

我经常看到使用套接字的服务器程序的示例代码。

(为简单起见,这里我不检查 socket() 或 bind() 等函数的返回值。)

int sockfd = 0, newsockfd = 0;
struct sockaddr_in address;

sockfd = socket(AF_INET, SOCK_STREAM, 0);

bind(sockfd, (struct sockaddr*)&address, sizeof(address));
listen(sockfd, 1);

newsockfd = accept(sockfd, (struct sockaddr*)NULL, NULL);

... do some communication ...

close(newsockfd);

我在网上找到的大多数示例代码都有close(newsockfd)但没有close(sockfd)我的问题是不关闭 sockfd是否真的正确

如果正确,我想知道为什么。我的理解是 sockfd 是文件描述符之一,它似乎没有理由不关闭它就退出程序。

更具体地说,我想知道 not-closed-sockfd 会在程序下次运行时导致绑定错误(例如,此套接字正在使用中...)。

如果你能帮助我,我真的很感激。感谢您的时间。

用户803422

当您停止收听时,您应该始终关闭 sockfd。

有些开发者不太在意不关闭 sockfd 的两个原因:

  • 如果你的程序没有关闭就退出了,操作系统会为你关闭 sockfd
  • 大多数情况下,服务器始终保持监听打开状态(例如:数月)

但是,如果您的程序在某个事件上启动侦听套接字,然后在一段时间后关闭它并循环,那么您必须关闭 sockfd,以防止在下一次迭代时出现错误 EADDRINUSE(地址已在使用)和内存泄漏。

此外,错误 EADDRINUSE (Address already in use) 可能发生在其他情况下,我在此不详述。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

正确关闭unix套接字的方法

来自分类Dev

linux套接字:在C中关闭套接字

来自分类Dev

在python中关闭TCP套接字的正确方法

来自分类Dev

在.NET Core 3.1中关闭C#套接字的正确方法是什么?

来自分类Dev

在C套接字编程中写入/读取整数的正确方法

来自分类Dev

在C套接字编程中写入/读取整数的正确方法

来自分类Dev

在 PHP 中关闭套接字

来自分类Dev

如何正确关闭boost :: asio中的套接字?

来自分类Dev

C ++ Windows套接字-在程序退出时关闭套接字

来自分类Dev

如何正确关闭套接字及其InputStream?

来自分类Dev

在WinForms应用程序中关闭套接字服务器的正确方法?

来自分类Dev

getSession关闭套接字

来自分类Dev

关闭网络套接字

来自分类Dev

getSession关闭套接字

来自分类Dev

为什么在运行方法中关闭套接字?

来自分类Dev

C ++中的套接字接收

来自分类Dev

在C ++中关闭套接字是否有任何限制?

来自分类Dev

在子进程中关闭打开的套接字

来自分类Dev

R中的ZeroMQ,如何关闭套接字

来自分类Dev

从崩溃的程序中关闭打开的套接字

来自分类Dev

如何关闭python中的套接字连接?

来自分类Dev

C#套接字编程,关闭窗口

来自分类Dev

C#所有套接字关闭

来自分类Dev

无法按Ctrl + C关闭套接字

来自分类Dev

C#所有套接字关闭

来自分类Dev

无法按Ctrl + C关闭套接字

来自分类Dev

何时关闭UDP套接字

来自分类Dev

SocketException:套接字已关闭

来自分类Dev

PoolingClientConnectionManager如何关闭套接字