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));