if((sClient = accept(mServer_Socket, (struct sockaddr *)&IneternetAdd,&len))NVALID_SOCKET)
{
error=WSAGetLastError();
LogMessage.Format("创建业务服务器端失败,错误原因--->>>socket......accept:%d",error);
AddMessageServer(LogMessage,TRUE);
break;
}
memset(Buf,0x00,sizeof(Buf));
while(true)
{
if(nRet=recv(sClient,Buf,sizeof(Buf),0)==SOCKET_ERROR)
{
error=WSAGetLastError();
LogMessage.Format("创建业务服务器端失败,错误原因--->>>socket......accept:%d",error);
AddMessageServer(LogMessage,TRUE);
break;
}
if(nRet>0)
{
AddMessageServer("从客户端服务器收到数据......",LogFlag);
m_dlg->m_Ser.SetWindowText("从客户端服务器收到数据......");
Client_Recv(Buf,nRet,m_dlg);
}
else if(nRet==0)
{
AddMessageServer("nRet==0,客户端服务器有错误......",TRUE);
error=WSAGetLastError();
//break;
}
else
{
AddMessageServer("服务器端断开连接...Eroor",TRUE);
break;
}
Sleep(300);
}
请问,我收到数据用逐步调试观察了一下,发现buf里面有数据到达并且不是空数据,但是为何recv返回值为0,请帮忙分析一下。

解决方案 »

  1.   

    If no error occurs, recv returns the number of bytes received. If the connection has been gracefully closed, the return value is zero. Otherwise, a value of SOCKET_ERROR is returned
      

  2.   

    我的客户端是用java写的,但是同样我如果用java写一个服务器端,就没有发生问题啊,请问什么原因?
      

  3.   

    你传输的数据是不是用的内存不是串了?
    你把传输内容改成字符串试试不要用内存的方式
    我记得当时我测C#和VC的时候有这个问题
      

  4.   

    1,看看是不是对方已经关闭
    2,你的socket是不是非阻塞的???
      

  5.   

    代码写的太水了。
    if (sClient = .....)
      

  6.   

    为0原因:MSDN中说是只有当对方gracefully closed这个连接,查一下Gracefully Closed的意思,应该是指对方调用类似于shutdown的函数关闭了连接(不会是调用closesocket),这时仅关闭了接收或发送方向之一,如果对方关闭了发送还是允许对方接收数据的,所以如果有数据到达,接收方还是会接收的。这就存在为什么返回为0但缓冲区中还有数据。