【发布时间】:2021-03-26 01:06:45
【问题描述】:
我在下面的代码中遇到了 accept() 函数的问题。它一直给我 10038 错误。我读到了错误 10038 (WSAENOTSOCK)。但我在这里找不到确切的问题。类似的 Linux 代码可以作为服务器代码正常工作。
PS:我在 Windows 上的 Visual Studio 中运行它。
#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);
}
任何帮助将不胜感激。提前致谢。
【问题讨论】:
标签: c++ sockets network-programming winsock