程序代码是这样的:
客户端:
numsnt=sockClient.Send(sendText,strlen(sendText)+1,NO_FLAGS_SET);
//在debug中,这一步可以看到numsnt=25,sendText中也确实有25个字符
  numrcv=sockClient.Receive(recvText,100,NO_FLAGS_SET);

服务器方:

  p_sockServer->Accept(sockReceive);
      CSocket *p_sockReceive;
        p_sockReceive=&sockReceive;
Char buffer[MAXBUFLEN];
int numrcv;
numrcv=p_sockReceive->Receive(buffer,MAXBUFLEN);
//执行到这一步时,不能执行下去,就像被阻塞一样,DEBUG工具变成灰色
而客户端的下一步numrcv则返回-1。
这可能会是那里出问题了?

解决方案 »

  1.   

    加上这个,看看EE等于多少。
    if(numrcv==-1)
     {
       DWORD EE=GetLastError();
    }
      

  2.   

    numrcv=p_sockReceive->Receive(buffer,MAXBUFLEN);
    你怎么知道服务器端已经准备好接受数据?应该在OnReceive()函数中执行Receive操作,
      

  3.   

    如何判断服务器端是否准备接收数据?
    listen(),和Accept()都有
    你是说要在CSocket类的onReceive()中作Receive()这一步?我发现它莫名其妙得执行不到numrcv=-1的那一步了
      

  4.   

    你是不是安装了NORTON等防火啬之类的,把数据过滤掉了,我觉得的你的代码没有问题,你用的是CSOCKET这是阻塞的,如果没有数据接受与发送并且SOCKET连接没断的话,会一直阻塞下去。
      

  5.   

    检查一下RECEIVE函数的说明。
    既然你用的是CSocket,那么就意味着你决定使用阻塞方式进行数据的发送和接收。如果你制定Socket接收MAXBUFLEN个字节的数据,那么在它接收到strlen(sendText)个数据后,如果strlen(sendText)>MAXBUFLEN,socket仍然认为没有接收完指定大小(MAXBUFLEN)的数据,仍然会处于阻塞状态,继续接收。
    建议:
    int iTemp=strlen(sendText);
    Send(&iTemp,sizeof(iTemp);
    Send(sendText,strlen(sendText)+1,NO_FLAGS_SET);
    接收部分:
    int iTemp;
    Recv(iTemp);
    iTemp=ntohl(iTemp);
    Recv(strBuf,iTemp);
    发送的时候,先发送一个4个字节的长整数标识字符串长度,然后再发送字符串内容
    接收的时候,先接收一个4个字节的长整数标识字符串长度,然后再接收字符串内容