socket recv函数接受长度的问题
发送端:
- C/C++ code
int len_sent = 100000; //100KB数据 int _res = send(sock, buffer, len_sent, 0); if (_res == SOCKET_ERROR) { cout<< "【send】 fails! WSAGetLastError() = "<< WSAGetLastError()<< endl; }接收端:
- C/C++ code
do { const int LEN = 200000; //缓冲区200KB char buffer[LEN]; int _res = recv(_sock, buffer, LEN, 0); if (_res == SOCKET_ERROR) { cout<< "【recv】 fails! WSAGetLastError() = "<< WSAGetLastError()<< endl; break; } if (!_res) { cout<< "the connection has been gracefully closed."<< endl; break; } } while (0);就是,假如我发送100KB数据,接受端它总是分好几次接受,不会一次把数据接受完,我试过缓冲区大小为100KB,也还是不行,请问,能做到一次接受全部数据么?
[解决办法]
有的是系统内部限制,无法修改。
就像是windows下管道的大小一样。
[解决办法]
do
{
const int LEN = 100000;
const int LENEX = 200000; //缓冲区200KB
int recvLen = 0;
char temp[LEN];
char buf[LENEX];
int _res = recv(_sock, temp, LEN, 0);
if (_res == SOCKET_ERROR)
{
cout<< "【recv】 fails! WSAGetLastError() = "<< WSAGetLastError()<< endl;
break;
}
if (!_res)
{
strncpy(buf,temp,_res);
recvLen += _res;
if(recvLen >= LEN){
cout<< "the connection has been gracefully closed."<< endl;
break;
}
}
} while (0);
[解决办法]
接收时,TCP socket缓冲区中有多少数据就拷贝给应用程序多少,而UDP socket总是拷贝接收队列中第一项的数据。一次send 100KB数据,发送端也不会一下子就都把数据发完了,而是一部分得到对方确认后再发下一部分,当你调用recv时,有可能send端的数据还没有都到达接收端,所以你recv的只是一部分数据。
可以参考《WinSock网络编程经络》第15章,论坛上有一些WinSock源码:
http://download.csdn.net/detail/geoff08zhang/4571358
[解决办法]
你看一下发送端是否真的发送了你设计的缓存的大小呢,可以通过发送的返回值来查看是否发送了指定大小的数据呢。
网络上有数据包大小的限制,超过限制的大小是要分片的。