winsock2.h 的 C++ accept() 不断给出 10038 错误
C++ accept() of winsock2.h keeps giving 10038 error
我在下面的代码中遇到了 accept() 函数的问题。它一直给我 10038 错误。我读到了错误 10038 (WSAENOTSOCK)。但我在这里找不到确切的问题。类似的 Linux 代码与服务器代码一样工作正常。
PS:我是 运行 这个在 Visual Studio 上 Windows。
#include "stdafx.h"
#include <winsock2.h>
#include <windows.h>
#include <iostream>
int main(int argc, _TCHAR* argv[])
{
FILE* fp = fopen("ClientServerThread.log", "a+");
SOCKET serverSocket;
struct sockaddr_in serverAddr;
WSADATA wsaData;
int nCode;
if ((nCode = WSAStartup(MAKEWORD(2, 2), &wsaData)) != 0)
{
fprintf(fp, "%s: %d\n", "WSAStartup() failed with code", nCode);
fclose(fp);
return false;
}
serverSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (serverSocket == INVALID_SOCKET)
{
fprintf(fp, "%s: %ld\n", "socket() failed with error", WSAGetLastError());
WSACleanup();
fclose(fp);
exit(1);
}
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(8000);
serverAddr.sin_addr.s_addr = INADDR_ANY;
int bindRes = bind(serverSocket, (struct sockaddr*)&serverAddr, sizeof(serverAddr));
if (bindRes == SOCKET_ERROR)
{
fprintf(fp, "%s: %ld\n", "bind() failed with error", WSAGetLastError());
WSACleanup();
fclose(fp);
exit(1);
}
int listenRes = listen(serverSocket, 10);
if (listenRes == SOCKET_ERROR)
{
fprintf(fp, "%s: %ld\n", "listen() failed with error", WSAGetLastError());
WSACleanup();
fclose(fp);
exit(1);
}
fprintf(fp, "%s...\n", "Server listening for client");
while (1)
{
int clientSock = accept(listenRes, (struct sockaddr*)&serverAddr, (int*)sizeof(serverAddr));
if (clientSock == SOCKET_ERROR)
{
//10038
fprintf(fp, "%s: %ld\n", "accept() failed with error", WSAGetLastError());
WSACleanup();
fclose(fp);
exit(1);
}
fprintf(fp, "%s: %d\n", "Client Found", clientSock);
closesocket(clientSock);
}
fclose(fp);
}
如有任何帮助,我们将不胜感激。提前致谢。
错误代码 WSAENOTSOCK
似乎不言自明。你有...
int listenRes = listen(serverSocket, 10);
其次是...
int clientSock = accept(listenRes, ...
因此,您将 listen
返回的值作为套接字参数传递给 accept
。您的 accept
调用应该是(未经测试的)...
int clientSock = accept(serverSocket, (struct sockaddr*)&serverAddr, (int*)sizeof(serverAddr));
我在下面的代码中遇到了 accept() 函数的问题。它一直给我 10038 错误。我读到了错误 10038 (WSAENOTSOCK)。但我在这里找不到确切的问题。类似的 Linux 代码与服务器代码一样工作正常。
PS:我是 运行 这个在 Visual Studio 上 Windows。
#include "stdafx.h"
#include <winsock2.h>
#include <windows.h>
#include <iostream>
int main(int argc, _TCHAR* argv[])
{
FILE* fp = fopen("ClientServerThread.log", "a+");
SOCKET serverSocket;
struct sockaddr_in serverAddr;
WSADATA wsaData;
int nCode;
if ((nCode = WSAStartup(MAKEWORD(2, 2), &wsaData)) != 0)
{
fprintf(fp, "%s: %d\n", "WSAStartup() failed with code", nCode);
fclose(fp);
return false;
}
serverSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (serverSocket == INVALID_SOCKET)
{
fprintf(fp, "%s: %ld\n", "socket() failed with error", WSAGetLastError());
WSACleanup();
fclose(fp);
exit(1);
}
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(8000);
serverAddr.sin_addr.s_addr = INADDR_ANY;
int bindRes = bind(serverSocket, (struct sockaddr*)&serverAddr, sizeof(serverAddr));
if (bindRes == SOCKET_ERROR)
{
fprintf(fp, "%s: %ld\n", "bind() failed with error", WSAGetLastError());
WSACleanup();
fclose(fp);
exit(1);
}
int listenRes = listen(serverSocket, 10);
if (listenRes == SOCKET_ERROR)
{
fprintf(fp, "%s: %ld\n", "listen() failed with error", WSAGetLastError());
WSACleanup();
fclose(fp);
exit(1);
}
fprintf(fp, "%s...\n", "Server listening for client");
while (1)
{
int clientSock = accept(listenRes, (struct sockaddr*)&serverAddr, (int*)sizeof(serverAddr));
if (clientSock == SOCKET_ERROR)
{
//10038
fprintf(fp, "%s: %ld\n", "accept() failed with error", WSAGetLastError());
WSACleanup();
fclose(fp);
exit(1);
}
fprintf(fp, "%s: %d\n", "Client Found", clientSock);
closesocket(clientSock);
}
fclose(fp);
}
如有任何帮助,我们将不胜感激。提前致谢。
错误代码 WSAENOTSOCK
似乎不言自明。你有...
int listenRes = listen(serverSocket, 10);
其次是...
int clientSock = accept(listenRes, ...
因此,您将 listen
返回的值作为套接字参数传递给 accept
。您的 accept
调用应该是(未经测试的)...
int clientSock = accept(serverSocket, (struct sockaddr*)&serverAddr, (int*)sizeof(serverAddr));