对于似乎不会关闭的 Winsock 应用程序,我有一个有趣的场景。以下代码足以完全复制该问题:
#include "stdafx.h"
#include <WinSock2.h>
#pragma comment(lib, "ws2_32.lib")
#include <WS2tcpip.h>
#include <MSTcpIP.h>
#include <ws2ipdef.h>
#include <cstdio>
#include <iostream>
using namespace std;
int main() {
WSAData wsaStartup;
WSAStartup(MAKEWORD(2, 2), &wsaStartup);
SOCKET s = socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP);
addrinfo *result;
addrinfo hint = { 0 };
hint.ai_family = AF_INET6;
int error = getaddrinfo("localhost", "45000", &hint, &result);
if (error || !result) {
cout << "Unable to resolve host. " << WSAGetLastError() << endl;
return 1;
}
error = connect(s, result->ai_addr, result->ai_addrlen);
if (error == SOCKET_ERROR) {
cout << "Unable to connect to host. " << WSAGetLastError() << endl;
} else {
cout << "Connection successful." << endl;
}
freeaddrinfo(result);
closesocket(s);
WSACleanup();
return 0;
}
我花了很多时间试图追查这个问题。似乎 getaddrinfo 和 connect 都产生了一个挂起的 nt 线程,并防止应用程序终止。
我在这里更改的唯一重要的编译器选项是:Linker->Advanced->EntryPoint,我在其中指定了“main”。如果我摆脱该编译器选项,并将主签名更改为:
int _tmain(int argc, _TCHAR* argv[])
一切似乎都很好。在我的用例中,我很好地拥有上面的 _tmain 函数,但我想知道是否有人知道 _tmain 函数的幕后发生了什么魔力,它使应用程序关闭。