我的服务器端和客户端使用的是CSocket派生类,我现在正在本地计算机进行测试,就是本地开一个线程,连接本地的服务器,多数情况是正常的,但是偶尔会出现OnReceive无法接收数据的情况,并且一旦无法接收了,就始终无法接收了,比如服务器发送的数据客户端OnReceive永远无法相应,但是客户端发送的数据服务器OnReceive能收到。由于代码太多无法贴出来,发送的Send我是循环发送的办法。BOOL CNetSocket::SendEx(void * pSendBuf,int   nCount)
{
int nBytesSent;

nBytesSent = 0L;

while (nBytesSent < nCount)
{
int dwBytes;

if ((dwBytes = Send((BYTE*)pSendBuf + nBytesSent,nCount - nBytesSent)) 
== SOCKET_ERROR)
{
if (GetLastError() == WSAEWOULDBLOCK)
{
Sleep(100);
continue;
}
else
{
break;
}
}
else
nBytesSent += dwBytes;
}

if (nBytesSent == nCount)
return TRUE;
   
return FALSE;
}这几天一直搞不定,快疯了。

解决方案 »

  1.   

    刚才测试又发现服务器端无法接收数据,但是服务器发送的数据客户端能收到,并且我调试跟踪发现 CSocketWnd::OnSocketNotify 根本没收到任何消息,我发送的数据到底去了哪里?
      

  2.   

    CSDN里 没人了? 
    无语了,
    看来我得用SOCKET API了
      

  3.   

    把每一步的GetLastError()打印出来。日志也打印出来。
      

  4.   


    OnRecive 我都无法相应,里面的代码还有什么分析意义?
      

  5.   

    看来问题可能在 ReceiveEx中.
      

  6.   


    问题很奇怪的,我现在由原来的只读取指定长度的数据包就返回OnRecive,改成读完后再读一个1字节确认是否后面有粘包的数据,虽然每次都是返回-1,但是这个怪问题就彻底没有了。
      

  7.   

    估计是接收的代码造成的,可能是某次执行OnRecive时没有接收就返回了,这样就会导致这个问题。
      

  8.   

    用什么协议的tcp?udp?是不是包丢了啊?
      

  9.   

    这个不是解决了吗?http://topic.csdn.net/u/20080701/10/d8fef584-8e3b-40f1-926f-e9497727105d.html
      

  10.   

    你写的代码,出现这个问题,很正常。if ((dwBytes = Send((BYTE*)pSendBuf + nBytesSent,nCount - nBytesSent)) 
    == SOCKET_ERROR) 

    if (GetLastError() == WSAEWOULDBLOCK) 

    Sleep(100); 
    continue这是什么东西?
    你当阻塞的socket?