VC11 Winsock应用程序无法关闭

时间:2012-10-25 20:18:27

标签: c++ visual-studio-2012 winsock2

对于看似不会关闭的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-&gt; Advanced-&gt; EntryPoint,其中我指定了“main”。如果我摆脱了该编译器选项,并将主签名更改为:

int _tmain(int argc, _TCHAR* argv[])
一切似乎都很好。在我的用例中,我很好用上面的_tmain函数,但我想知道是否有人知道在使应用程序关闭的_tmain函数的幕后会发生什么魔法。

1 个答案:

答案 0 :(得分:0)

How do I correctly set the entry point for an exe in Visual Studio?

也许您需要为main()提供正确的签名以匹配运行时期望的内容。