【问题标题】:C++ accept() of winsock2.h keeps giving 10038 errorWinsock2.h 的 C++ accept() 不断给出 10038 错误
【发布时间】: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


    【解决方案1】:

    错误代码WSAENOTSOCK 似乎不言自明。你有...

    int listenRes = listen(serverSocket, 10);
    

    接着……

    int clientSock = accept(listenRes, ...
    

    因此,您将listen 返回的值作为套接字参数传递给accept。您的accept 电话应该是(未经测试)...

    int clientSock = accept(serverSocket, (struct sockaddr*)&serverAddr, (int*)sizeof(serverAddr));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-08
      • 1970-01-01
      • 1970-01-01
      • 2011-08-23
      相关资源
      最近更新 更多