Приложение VC11 Winsock не будет закрыто

У меня есть интересный сценарий для приложения 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, которая закрывает приложение.

1

Решение

Как правильно установить точку входа для exe в Visual Studio?

Возможно, вам нужно предоставить правильную подпись для main (), чтобы соответствовать ожидаемой среде выполнения.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]