我试图将一些文件从客户端发送到服务器。首先,我发送文件名,然后从服务器发送回来,以便在客户端进行验证。验证后,我发送文件大小并重新发送以进行验证。如果文件大小得到验证,我发送文件内容。
现在的问题是,服务器的第二个发送命令永远不会正确到达客户端。 下面是我发送和检查响应的客户端代码。我在这里做错了什么。
服务器代码很简单。它只是通过发送'发送接收的缓冲区。命令。
客户端代码>>
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;
}
答案 0 :(得分:1)
此代码发送一个事物,然后循环读取响应,直到流结束或发生错误。除非确实发生错误,或者服务器此时关闭连接,或者向同一请求发送第二个响应,否则它将在recv()
调用中永久阻止。
注意:您不能认为recv()
返回<= 0
表示&#34;结束了&#34;。它也可能表示错误,这可能会或可能不会对连接造成致命的影响,具体取决于它是什么。
您不需要两次构建CString
。您也不需要memset()
:正确使用recv()
返回的计数就足够了。