这个并没有任何错误发生,只是因为您还没有正确理解TCP/IP网络传输层传送数据的原理
TCP/IP的传输层提供的可靠的传输协议TCP,是面向字节流的,并不时面向消息报文的,
发送接收的过程中会有协商, 按照一定的缓冲区分块发送。所以,您并不能指望只要您
提供了buffer, 会对方整个接收到。
例如:
send(socket, buffer, 8192, 0);
系统可能分成若干个1,2K的数据包依次发送,
这样一来,接收的程序
recv(socket, buffer, 8192, 0);
就不能够一次把8192个字节全部接收到,因为这里接收方
并不知道发送方的8192的边界,只知道字节流。
您需要多次调用recv来接收需要的长度,其实,发送方
也是一样,并不能保证一次就把您所要求的数据全部发送完
毕,因为发送方的缓冲区也是有限的,也需要您根据send
的返回值,多次调用来保证全部发送完成。
而这里的buffer 的 size 只属于更高层的约定(既是所谓的应用层协议啦!)
如果发送方面只perfect_send(socket, buffer, 123, 0); 但是接受方期待的却是
能够perfect_recv(socket, buffer, 4096, 0); 那么就会发生“死锁"!
提供解决办法如下:(C(++) version)
if you want pascal version, please convert yourself, or mail me, let me
convert for you,
int SafeSend(int sockfd, const void* lpBuf, unsigned int nBufLen, int nFlags)
{
int iSendOffSet=0;
int iSendLen;
while (iSendOffSet<nBufLen)
{
if ( (iSendLen=send(sockfd, (const char*)lpBuf+iSendOffSet, nBufLen-iSendOffSet, nFlags))>0)
iSendOffSet+=iSendLen;
else
return iSendLen; // It's an error code
}
assert(iSendOffSet == nBufLen);
return iSendOffSet; // Must be nBufLen now.
}
int ReceiveBuf(int sockfd, void* Buf, unsigned int nBufLen, int nFlags)
{
int iReceiveOffSet=0;
int iReceiveLen;
while (iReceiveOffSet<nBufLen)
{
if ( (iReceiveLen=recv(sockfd, (char *)Buf+iReceiveOffSet, nBufLen-iReceiveOffSet, nFlags))>0)
iReceiveOffSet+=iReceiveLen;
else
return iReceiveLen; // It's an error code
}
assert(iReceiveLen == nBufLen);
return iReceiveOffSet; // Must be nBufLen now.
}