我在mingw中有一个相当简单的winsock客户端程序。我使用构造函数/析构函数在主程序运行之前/之后运行setup和teardown代码。作为析构函数代码的一部分,我调用了closesocket()打开网络连接。问题是,如果我异常退出,比如通过control-c退出,就会得到错误:
*** Windows错误:WSAStartup目前无法运行,因为它用于提供网络服务的底层系统当前无法运行不可用。
这个消息有点误导,因为我没有在析构函数中调用WSAStartup (winsock所需的启动调用)。
这告诉我的是,在代码到达析构函数之前,winsock dll被去初始化了。
将析构函数的优先级一直调高(65535)并没有帮助。
我希望有比我更有知识的人知道如何安排这件事。
在MinGW中,您可以使用atexit()
调用没有参数的C函数。WSACleanup()
就是这样一个函数,因此在WSAStartup
之后,您可以使用atexit(WSACleanup)
在退出时安排清理。