读书人

socket recv函数接受长度的有关问题

发布时间: 2012-10-21 09:00:07 作者: rapoo

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
[解决办法]
你看一下发送端是否真的发送了你设计的缓存的大小呢,可以通过发送的返回值来查看是否发送了指定大小的数据呢。
网络上有数据包大小的限制,超过限制的大小是要分片的。

读书人网 >C++

热点推荐