socket问题 我设置了阻塞模式的socket,在调试通信的时候第一次的确阻塞在了recv(..)(客户端没有发送数据),可是再下一个接收循环中却出现了问题,我并没有点击发送按钮,可是服务端仍然接收到了信息,信息只有一个字节,是一个繁体字。请问高手这是怎么回事? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 void CServerSocket::ReceivingLoop(){ while(m_bReceiving) { while (Receive(buf, 9) == E_SOCKET_NOT_READY) { Sleep(100); } ::SendMessage(AfxGetMainWnd()->GetSafeHwnd(), WM_Gengxin, 0, 0); }}int CWorkerSocket::Receive(char * outBuf, int inLen){ if (m_hSocket) { int nCount = inLen; int lenret = 0; char * pBuf = outBuf; lenret = recv(m_hSocket, pBuf, nCount, 0); if (lenret == SOCKET_ERROR) { return E_SOCKET_FAIL; } else if (lenret == 0) { // Indicate(指示,指出) the socket disconnected return E_SOCKET_CLOSE; } return S_SOCKET_OK; } return E_SOCKET_FAIL;} 再次调试发现,循环在只多进行了一次,是不是因为发送数据的实际字节数和recv(..)设置的要接收的字节数量不一致导致的啊 不会吧,你估计还是代码有问题,给你一段参考代码: memset(buffer, 0, 1025); timeval tm; fd_set set; tm.tv_sec = 5; tm.tv_usec = 0; while(!m_bStop) { Sleep(100); FD_ZERO(&set); FD_SET(m_sck, &set); int nRet = select(m_sck + 1, &set, NULL, NULL, &tm); if( nRet <= 0) { if(nRet < 0)//是严重错误 m_bConnected = false; continue; } if(FD_ISSET(m_sck, &set)) //如果没有数据来,则继续轮循 { int nLen = recv(m_sck, buffer, 1024, 0); while(nLen > 0) { buffer[nLen] = '\0'; AddBuffer(buffer); nLen = recv(m_sck, buffer, 1024, 0); } if(nLen == 0)//此时表明客户端的Socket已经关闭 { break; CloseSocket(); } } } MFC 多文档工程打开新的文档 Socket复用时出现10022错误! -a "XXXX"的问题 BitBlt 不能用于打印 求教一个SQL插入语句 如何改变菜单的位置? 请问如何获得系统时间 如何制作背景透明的控件 请教:多文档里面怎么才能把子窗口也最大化阿? 用串口进行文件传输的问题 HOOK API 的问题? 这是什么东西 XP-B2115359.EXE 老是改注册表自动运行项 是病毒吗
{
while(m_bReceiving)
{
while (Receive(buf, 9) == E_SOCKET_NOT_READY)
{
Sleep(100);
}
::SendMessage(AfxGetMainWnd()->GetSafeHwnd(), WM_Gengxin, 0, 0);
}
}
int CWorkerSocket::Receive(char * outBuf, int inLen)
{
if (m_hSocket)
{
int nCount = inLen;
int lenret = 0;
char * pBuf = outBuf;
lenret = recv(m_hSocket, pBuf, nCount, 0);
if (lenret == SOCKET_ERROR)
{
return E_SOCKET_FAIL;
}
else if (lenret == 0)
{
// Indicate(指示,指出) the socket disconnected
return E_SOCKET_CLOSE;
}
return S_SOCKET_OK;
}
return E_SOCKET_FAIL;
}
timeval tm;
fd_set set;
tm.tv_sec = 5;
tm.tv_usec = 0;
while(!m_bStop)
{
Sleep(100);
FD_ZERO(&set);
FD_SET(m_sck, &set);
int nRet = select(m_sck + 1, &set, NULL, NULL, &tm);
if( nRet <= 0)
{
if(nRet < 0)//是严重错误
m_bConnected = false;
continue;
} if(FD_ISSET(m_sck, &set)) //如果没有数据来,则继续轮循
{
int nLen = recv(m_sck, buffer, 1024, 0);
while(nLen > 0)
{
buffer[nLen] = '\0';
AddBuffer(buffer);
nLen = recv(m_sck, buffer, 1024, 0);
}
if(nLen == 0)//此时表明客户端的Socket已经关闭
{
break;
CloseSocket();
}
}
}