【问题标题】:WSAENOTSOCK error after sending around a valid socket围绕有效套接字发送后的 WSAENOTSOCK 错误
【发布时间】:2014-05-15 13:17:34
【问题描述】:

好的,所以我正在使用 WinSockets2 来制作一个非常简单的服务器-客户端应用程序。我初始化了我的套接字,我试图让服务器成为多用户。到目前为止,我几乎 100% 确定服务器套接字是正确形成的,并且我 100% 确定客户端套接字是正确的,因为我将它与另一台服务器一起使用。虽然,recv 函数失败并出现错误WSAENOTSOCK。有问题的代码:

unsigned __stdcall client(void *data) {
    SOCKET clientSocket = (SOCKET)data;

    char inBuffer[DEFAULT_BUFLEN];

    int inBytes = SOCKET_ERROR;

    ZeroMemory(inBuffer, sizeof(inBuffer)); //make sure the buffer is 0

    inBytes = recv(clientSocket, inBuffer, sizeof(inBuffer), 0);
    printf("Client said: %s and there's this also %d\n", inBuffer, inBytes);

    if (inBytes == SOCKET_ERROR) {
        printf("eek! Something went wrong! %ld\n", WSAGetLastError());
    }
    return 0;
}

还有一点...

    bool serverOn = true;
    while (clientSocket = accept(listenSocket, NULL, NULL) && serverOn) {
        //http://stackoverflow.com/questions/15185380/tcp-winsock-accept-multiple-connections-clients
        unsigned threadID;
        HANDLE hThread = (HANDLE)_beginthreadex(NULL, 0, &client, (void*)clientSocket, 0, &threadID);
    }

    if (iResult = shutdown(clientSocket, SD_SEND) == SOCKET_ERROR) { //clean up and end everything
        printf("shutdown failed: %d\n", WSAGetLastError());
        closesocket(clientSocket);
        WSACleanup();
        return 1;
    }

    closesocket(clientSocket);
    WSACleanup();

    return 0;
}

如果需要任何其他代码,请询问。谢谢!

【问题讨论】:

  • 如果必须满足任何其他条件才能复制,请发布。谢谢。 ——什么时候发生? serverOn 标志当时设置了吗?至少有一种味道:您创建的每个线程都有一个套接字,但当 while 离开时,套接字(可能为 0,但不是 INVALID_SOCKET)是 shutdownclosed。我希望对listenSocket 进行处理。但是关于上下文的信息很少......

标签: c++ sockets winsock2


【解决方案1】:

好的,经过反复试验,我找到了答案。在这个代码块中:

 bool serverOn = true;
    while (clientSocket = accept(listenSocket, NULL, NULL) && serverOn) {
        //http://stackoverflow.com/questions/15185380/tcp-winsock-accept-multiple-connections-clients
        unsigned threadID;
        HANDLE hThread = (HANDLE)_beginthreadex(NULL, 0, &client, (void*)clientSocket, 0, &threadID);
    }

    if (iResult = shutdown(clientSocket, SD_SEND) == SOCKET_ERROR) { //clean up and end everything
        printf("shutdown failed: %d\n", WSAGetLastError());
        closesocket(clientSocket);
        WSACleanup();
        return 1;
    }

    closesocket(clientSocket);
    WSACleanup();

    return 0;
}

while (clientSocket = accept(listenSocket, NULL, NULL) && serverOn) { 应该分成两行,

while (serverOn) {
        clientSocket = accept(listenSocket, NULL, NULL);

我猜这与变量的范围有关。祝各位编码愉快!

【讨论】:

  • 但这不会改变变量的范围。
猜你喜欢
  • 1970-01-01
  • 2016-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-31
  • 1970-01-01
  • 2017-02-23
相关资源
最近更新 更多