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

Posted

技术标签:

【中文标题】C++ Windows 套接字 - 在程序退出时关闭套接字【英文标题】:C++ Windows Sockets - Close socket at program exit 【发布时间】:2015-11-14 11:42:40 【问题描述】:

我正在使用 WinSock2 api 制作一个简单的控制台客户端/服务器应用程序,但我需要确保客户端的套接字在退出应用程序时正确关闭。我已经尝试使用SetConsoleCtrlHandler,但这会导致主循环持续运行 10 秒的线程。

当用户按下关闭按钮时,有没有办法关闭套接字?

【问题讨论】:

如果您没有采取明确的行动,而只是关闭应用程序,那么 OS 进程终止操作不会关闭套接字吗?它适用于我的 GUI 应用程序。 我刚刚发现它实际上已经这样做了。感谢您的帮助,但我也在实现对象系统,因为它确实更干净。 (因此,我认为这是一个“接受”的答案)。 你应该看看this question about RAII 【参考方案1】:

是的,用一个管理它的类来包装原生 Winsock2 套接字。

class Socket
  SOCKET m_NativeSocket;

public:
  Socket()
    m_NativeSocket = ::socket(...);
  

  ~Socket()
   ::closesocket(m_NativeSocket);
  

;

你应该遵循这个模式,因为:

    套接字适合作为对象,而不仅仅是浮动变量 添加析构函数确保无论应用程序突然中止,抛出异常,套接字超出范围 - 套接字正确关闭 将套接字作为对象使用会更好、更简洁。

确保你实现了正确的移动构造函数。

【讨论】:

以上是关于C++ Windows 套接字 - 在程序退出时关闭套接字的主要内容,如果未能解决你的问题,请参考以下文章

秦时明月汉时关-《唐诗三百首-出塞》数据源应用程序

在套接字编程上捕获客户端从服务器退出

C++ CreateProcess 无法从 Windows 7 上的套接字接收路径 (64)

在退出之前跟踪 - 并正确结束 - C# - C++/CLI - C++ Windows 窗体应用程序中的本机和托管线程

c++下基于windows socket的单线程服务器客户端程序

如何阻止 C++ 控制台应用程序立即退出?