Спасибо всем за ответы.Я решил проблему!В моем основном коде не было глупого насоса сообщений Windows (я обычно запускаю эти типы серверов в Linux).Я добавил это к основному коду, и теперь он работает отлично.
#ifdef _WIN32
MSG msg;
while (!Stopped && GetMessage(&msg, (HWND)NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
#else
while (!Stopped) {
Sleep(1000);
}
#endif
Извините, я не выложил достаточно кода для запуска примера, но в коде winsock произошел 100% сбой вкак отладочная, так и выпускная сборки.Всегда с падением в RtlHeapxxx () или __acrt_lock ().С помощью обработчика сообщений я могу многократно запускать его без проблем.
Что касается проблемы gethostbyname, я вызывал свой внутренний метод GetHostByName (изменение регистра), и он вызывает более новую функцию getaddrinfo ().
UINT32 Socket::getHostByName(const char * name, Data& ip) {
UINT32 iadrs = getHostByName(name);
ip.format("%d.%d.%d.%d", (iadrs >> 24) & 0xFF, (iadrs >> 16) & 0xFF, (iadrs >> 8) & 0xFF, iadrs & 0xFF);
return (iadrs);
}
UINT32 Socket::getHostByName(const char * name) {
if (lastAddress == name) {
return(lastResolution);
}
struct addrinfo hints;
memset(&hints, 0, sizeof(hints));
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = IPPROTO_TCP;
struct addrinfo * result = nullptr;
if (getaddrinfo(name, "80", &hints, &result) != 0) {
if (result != nullptr) {
freeaddrinfo(result);
}
return (0);
}
for (struct addrinfo * ptr = result; ptr != nullptr; ptr = ptr->ai_next) {
if (ptr->ai_family == AF_INET) {
struct sockaddr_in * ip = (struct sockaddr_in *) ptr->ai_addr;
UINT32 iadrs = (ip->sin_addr.S_un.S_un_b.s_b1 << 24) | (ip->sin_addr.S_un.S_un_b.s_b2 << 16) | (ip->sin_addr.S_un.S_un_b.s_b3 << 8) | (ip->sin_addr.S_un.S_un_b.s_b4);
freeaddrinfo(result);
lastAddress = name;
lastResolution = iadrs;
return (iadrs);
}
}
freeaddrinfo(result);
return (0);
}