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 窗体应用程序中的本机和托管线程