程序代码是这样的:
客户端:
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。
这可能会是那里出问题了?
客户端:
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。
这可能会是那里出问题了?
if(numrcv==-1)
{
DWORD EE=GetLastError();
}
你怎么知道服务器端已经准备好接受数据?应该在OnReceive()函数中执行Receive操作,
listen(),和Accept()都有
你是说要在CSocket类的onReceive()中作Receive()这一步?我发现它莫名其妙得执行不到numrcv=-1的那一步了
既然你用的是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个字节的长整数标识字符串长度,然后再接收字符串内容