1

閉じないように見える 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 関数の舞台裏でどのような魔法が起こっているのか、誰かが知っているかどうか疑問に思っています。

4

1 に答える 1

0

Visual Studio で exe のエントリ ポイントを正しく設定するにはどうすればよいですか?

おそらく、ランタイムが期待するものと一致するように main() に正しい署名を提供する必要があります。

于 2012-10-25T21:17:36.300 に答える