Winsock连接失败,只在Windows 11上出现WSAEFAULT \ fails错误

Winsock连接失败,只在Windows 11上出现WSAEFAULT \ fails错误

我的代码在XP到10之间的任何Windows上都能很好地工作。现在我第一次在Win11中测试了我的代码,而connect()函数由于错误10014 WSAEFAULT而失败:

地址不好。系统在试图使用调用的指针参数时检测到无效的指针地址。如果应用程序传递无效的指针值,或者缓冲区的长度太小,则会发生此错误。例如,如果一个参数的长度(它是一个sockaddr结构)小于sizeof of (Sockaddr)。

但是,当我使用调试器检查时,似乎正确地传递了sockaddr_in结构:

代码语言:javascript运行复制connect(hSocket, (sockaddr*)(&InSockAddr), sizeof(InSockAddr))​

我正在使用Visual C++ 2015编译器。

下面是相关代码的片段:

代码语言:javascript运行复制#include

class CConnection

{

public:

static bool bWinsockInitialized;

SOCKET hSocket = INVALID_SOCKET;

sockaddr_in sockAddr;

bool Create();

bool InitializeWinsock();

bool Connect(sockaddr_in &InSockAddr);

};

CConnection sckt_Main;

sockaddr_in g_sockAddr;

void main()

{

if (!sckt_Main.Create())

{

// Error: Unable to create connection socket

return;

}

g_sockAddr.sin_family = AF_INET;

// Get IP address from string.

// If address is a DNS, HostInfo->h_addr will contain resolved IP address.

// Save host information into HostInfo struct:

hostent* HostInfo = gethostbyname("127.0.0.1");

//Error checking:

if (!HostInfo) {

return;

}

assert((sizeof(g_sockAddr.sin_addr)) >= HostInfo->h_length);

//Copy the resolved IP address into our sockAddr structure:

memcpy(&g_sockAddr.sin_addr, HostInfo->h_addr, HostInfo->h_length);

//Saves connection port

g_sockAddr.sin_port = htons(atoi("2405"));

sckt_Main.Connect(g_sockAddr);

}

bool CConnection::Create()

{

if (!InitializeWinsock()) {

return false;

}

hSocket = socket(AF_UNSPEC, SOCK_STREAM, IPPROTO_TCP);

if (this->hSocket == INVALID_SOCKET)

return false;

return true;

}

bool CConnection::InitializeWinsock()

{

WSADATA wsaData;

if (!WSAStartup(MAKEWORD(2, 2), &wsaData)) {

bWinsockInitialized = true;

}

else bWinsockInitialized = false;

return bWinsockInitialized;

}

bool CConnection::Connect(sockaddr_in &InSockAddr)

{

// If no error occurs, connect returns zero.

// Otherwise, it returns SOCKET_ERROR, and a specific error code can be retrieved by calling WSAGetLastError.

if (connect(hSocket, (sockaddr*)(&InSockAddr), sizeof(InSockAddr)) == 0)

{

// Connect SUCCESS

return true;

}

else

{

// !!! connect error !!!

int err = WSAGetLastError();

return false;

}

}

相关推荐

阶梯形矩阵
36365

阶梯形矩阵

07-11 👁️ 1332
脉动是哪个国家的
36365

脉动是哪个国家的

07-03 👁️ 1754
龍息神寂裝備圖鑑 ​龍息神寂有哪些裝備
S365网络超时

龍息神寂裝備圖鑑 ​龍息神寂有哪些裝備

07-16 👁️ 136
穿越火线刷雷刃技巧 CF手游刷出雷刃技巧
S365网络超时

穿越火线刷雷刃技巧 CF手游刷出雷刃技巧

06-29 👁️ 3994