我的代碼在從 XP 到 10 的任何 Windows 上都可以完美運行。現在我第一次在 Win11 中測驗了我的代碼,connect() 函式失敗并出現錯誤 10014 WSAEFAULT:
地址不對。系統在嘗試使用呼叫的指標引數時檢測到無效的指標地址。如果應用程式傳遞了無效的指標值,或者緩沖區的長度太小,則會發生此錯誤。例如,如果作為 sockaddr 結構的引數的長度小于 sizeof(sockaddr)。
但是,當我用除錯器檢查時,sockaddr_in 結構似乎正確傳遞:
connect(hSocket, (sockaddr*)(&InSockAddr), sizeof(InSockAddr))

我正在使用 Visual C 2015 編譯器。
這是相關代碼的片段:
#include <WinSock2.h>
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;
}
}
uj5u.com熱心網友回復:
如評論中所述,您的代碼不支持 IPv6。Windows 11 默認啟用 IPv6。
您應該將代碼更新為 IPv4 與 IPv6 無關。
請參閱Microsoft 檔案。
注意微軟checkv4.exe很久以前就停止發貨了,但是如果我針對你的代碼運行它,我會得到:
sockaddr_in : use sockaddr_storage instead, or use sockaddr_in6 in addition for IPv6 support
AF_INET : use AF_INET6 in addition for IPv6 support
gethostbyname : use getaddrinfo instead
hostent : use addrinfo instead
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/351401.html
標籤:C 视觉工作室 视觉工作室-2015 温索克 视窗-11
