套接字发送/接收问题:第二个客户端消息永远不会到达服务器

时间:2015-03-23 21:05:25

标签: c++ sockets

我试图将一些文件从客户端发送到服务器。首先,我发送文件名,然后从服务器发送回来,以便在客户端进行验证。验证后,我发送文件大小并重新发送以进行验证。如果文件大小得到验证,我发送文件内容。

现在的问题是,服务器的第二个发送命令永远不会正确到达客户端。 下面是我发送和检查响应的客户端代码。我在这里做错了什么。

服务器代码很简单。它只是通过发送'发送接收的缓冲区。命令。

客户端代码>>

int SendDataAndReadResponse(CString cstData)
{
  //Send data
  send(m_hSocket, (LPCTSTR)cstData, cstData.GetLength(), 0);

  //Read response
  char chBuff[256];
  memset(chBuff, 0, sizeof(chBuff));
  int iReadLength = 0;

  while(true)
  {
    iReadLength = recv(m_hSocket, chBuff, sizeof(chBuff)-1, 0);
    if(iReadLength > 0)
    {
      chBuff[iReadLength] = '\0';
      CString cstrData = CString(chBuff);
      ::PostMessage(this->GetSafeHwnd(), UWM_UPDATE_STATUS, MODE_THROW_LOG, (LPARAM)new CString(cstrData));
    }
    else
    {
      ::PostMessage(this->GetSafeHwnd(), UWM_UPDATE_STATUS, MODE_THROW_LOG, (LPARAM)new CString("-----End of recv----"));
      break;
    }
  }

  return 0;
}

1 个答案:

答案 0 :(得分:1)

此代码发送一个事物,然后循环读取响应,直到流结束或发生错误。除非确实发生错误,或者服务器此时关闭连接,或者向同一请求发送第二个响应,否则它将在recv()调用中永久阻止。

注意:您不能认为recv()返回<= 0表示&#34;结束了&#34;。它也可能表示错误,这可能会或可能不会对连接造成致命的影响,具体取决于它是什么。

您不需要两次构建CString。您也不需要memset():正确使用recv()返回的计数就足够了。