VC下winsock实现TCP时recv()的问题
我在VC下用winsock实现TCP,分别写了客户端和服务器,用着两个在两台机子上通讯没有任何问题。现在我在一块板子上实现TCP服务器端,板子与PC机用网线相连,PC机上运行我自己编写的客户端(服务器端暂时不用),同时抓包。
我客户端接收函数代码如下:
LRESULT CTCP_ClientDlg::OnReceive(WPARAM wParam, LPARAM lParam)
{
UpdateData(true);
if (WSAGETSELECTEVENT(lParam) == FD_READ)
{
char recvBuf[1000];
memset(recvBuf, 0, 1000);
Sleep(10);
int BRead=recv(srvsock,recvBuf,1000,0);
fflush(stdin);
if (BRead == SOCKET_ERROR)
{
MessageBox("接收到一个错误信息. ");
}
else
{
MessageBox("接收到一个信息");
m_receive+=recvBuf;
m_receive+="\r\n";
UpdateData(false);
}
}
else if (WSAGETSELECTEVENT(lParam) == FD_CLOSE)
{
closesocket(srvsock);
m_LinkState="连接断开了!";
}
return 0L;
}
现在的问题是TCP连上了,就是数据传输的时候,自己编的客户端总是接收数据搞没了。我抓包确定板子发了数据,而且MessageBox("接收到一个信息");对话框也跳出来了,编辑框里面光标下移了,就是没有数据显示。(有时数据接收是正常的)。请教大家,这是什么问题?
[解决办法]
"int BRead=recv(srvsock,recvBuf,1000,0); "
它的返回值有可能=0;你用的是阻塞的还是非阻塞的呢?
如果走到了“MessageBox("接收到一个信息"); ”这个地方。
你改成如下看下“if(BRead > 0) MessageBox(recvBuf);”
[解决办法]
非阻塞情况下,你得重复去调用recv 这个函数,直到它返回成功,这样才能确保读到了数据