【问题标题】:WinSock Send Multiple Request & Shutdown IssueWinSock 发送多个请求和关闭问题
【发布时间】:2013-02-06 09:33:38
【问题描述】:

我需要在端口 55005 向服务器发送多个请求(命令)。 我的第一个请求获取过程成功,我也收到了。 但是对于第二个请求,它会给出错误(WSAESHUTDOWN - 错误 10058)。 第一次请求后,我打电话 关机(连接套接字,SD_SEND); 然后只有服务器处理第一个请求并向我发送输出。 现在可以重新打开套接字处理下一个请求了吗?**

关机后如何处理多个请求(ConnectSocket, SD_SEND) ? 提前感谢您的建议。

我发送第一个请求,等待第一个回复。在第一次请求回复后,我可以发送下一个请求。这是业务逻辑要求。我不想为每个请求打开一个新连接。

快照代码从这里开始---------------->

**//This for loop will send multiple request to Servers.**
for(it = CommandList.begin(); it != CommandList.end() ; it++ )
{
    //get each command request & send it to server.
    std::string  sendBuf; // =  (*it);
     sendBuf= *it;
    int length = (int)strlen(sendBuf.c_str());
    //----------------------
    // Send an initial buffer
    iResult = send( ConnectSocket, (char*)sendBuf.c_str(), length, 0 );
    if (iResult == SOCKET_ERROR) {
        wprintf(L"send failed with error: %d\n", WSAGetLastError());
        closesocket(ConnectSocket);
        WSACleanup();
        return 1;
    }

    printf("Bytes Sent: %d\n", iResult);


    // shutdown the connection since no more data will be sent
    iResult = shutdown(ConnectSocket, SD_SEND);
    if (iResult == SOCKET_ERROR) {
        wprintf(L"shutdown failed with error: %d\n", WSAGetLastError());
        closesocket(ConnectSocket);
        WSACleanup();
        return 1;
    }

    // Receive until the peer closes the connection
    do {

        iResult = recv(ConnectSocket, recvbuf, recvbuflen, 0);
        if ( iResult > 0 )
            wprintf(L"Bytes received: %d\n", iResult);
        else if ( iResult == 0 )
            wprintf(L"Connection closed\n");
        else
            wprintf(L"recv failed with error: %d\n", WSAGetLastError());

    } while( iResult > 0 );
}

【问题讨论】:

  • 当您有更多数据要发送时,为什么要关闭套接字进行发送?这没有任何意义。
  • 那你为什么用strlen来获取std::string的长度?
  • 我发送第一个请求,等待第一个回复。在第一次请求回复后,我可以发送下一个请求。这是业务逻辑要求。我不想为每个请求打开一个新连接。
  • 那又怎样?您还有更多请求要发送,所以不要关闭。就这么简单。你不应该这样做除非你绝对没有更多可以发送。您仍然可以接收数据,所有套接字都是全双工的,即可以同时发送和接收。
  • 关闭后必须重新打开。您应该考虑修改协议以包含某种类型的请求结束标记,或包含消息的长度。

标签: c++ winsock2


【解决方案1】:

正如 Joachim 所说,在连接完成之前不要致电 shutdown。这个 TCP 套接字是一个“流”......东西可以随意来回。作为程序员,您必须确定“请求”和“响应”的开始和结束位置……不要为此使用 shutdown。

【讨论】:

  • 因为您似乎在发送以零结尾的字符串,所以请使用零作为您的请求/响应分隔符。而不是发送length,而是发送sendBuf.length() + 1。删除关闭代码(或将其移至循环后)。在您的接收循环中,继续附加到 std::string 直到您在数据中收到 0。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-24
  • 2018-05-14
  • 1970-01-01
  • 2012-05-24
  • 1970-01-01
相关资源
最近更新 更多