winsock的recv如何接收全部数据

时间:2021-05-23 23:43:15
小菜是初学者,最近写了个局域网传文件的小程序,用了winsock api,但是对于recv还是有些迷茫,如何接收很大的文件?缓冲区不能也太大。多次调用recv,但是网络中数据并不是按顺序来的,如何把数据重新拼起来呢,希望大虾指导。

9 个解决方案

#1


recv是按顺序接收的

#2


那么就是得先得到文件长度,然后一个循环,循环次数等于文件大小除以缓冲区大小?

#3


创建一个线程调用recv负责接收比较好吧,recv函数有返回值的,根据返回值用while循环接收不可以么?

#4


很大的文件肯定是多次发送的,所以recv肯定也是多次接受的

如果是TCP的,那肯定是按顺序来的
如果是UDP的,自己在发送时编个序号就行了

#5


因为recv阻塞所以已经用了多线程,只是不知道如何把所有的数据都接收到,所以现在是缓冲区定义多大我就能收多少。。。。。。。。。。。。。循环试试。。

#6


1.TCP下的Revc肯定是顺序接受的。
2.对于大文件的传输需要自己在接收方和发送方定义协议。
3.发送与接受的一包数据最好不要大于当前路由器MTU的大小

#7


用一个do-while循环,找一个结束符,在没有找到之前就一直接收,存下来,等遇到就一次性发一次

#8


// Receive until the peer closes the connection
    do {

        iResult = recv(ConnectSocket, recvbuf, recvbuflen, 0);
        if ( iResult > 0 )
            printf("Bytes received: %d\n", iResult);
        else if ( iResult == 0 )
            printf("Connection closed\n");
        else
            printf("recv failed: %d\n", WSAGetLastError());

    } while( iResult > 0 );

#9


定义包格式循环发送,循环接收。
发送端首先把文件的信息发送过来(文件名,文件大小等)然后循环发送,接收端接收第一个包后创建文件,准备开始循环接收。每次发送的时候定义好包格式(此次发送的文件大小,文件数据部分),接收端根据包格式进行接收。。。

#1


recv是按顺序接收的

#2


那么就是得先得到文件长度,然后一个循环,循环次数等于文件大小除以缓冲区大小?

#3


创建一个线程调用recv负责接收比较好吧,recv函数有返回值的,根据返回值用while循环接收不可以么?

#4


很大的文件肯定是多次发送的,所以recv肯定也是多次接受的

如果是TCP的,那肯定是按顺序来的
如果是UDP的,自己在发送时编个序号就行了

#5


因为recv阻塞所以已经用了多线程,只是不知道如何把所有的数据都接收到,所以现在是缓冲区定义多大我就能收多少。。。。。。。。。。。。。循环试试。。

#6


1.TCP下的Revc肯定是顺序接受的。
2.对于大文件的传输需要自己在接收方和发送方定义协议。
3.发送与接受的一包数据最好不要大于当前路由器MTU的大小

#7


用一个do-while循环,找一个结束符,在没有找到之前就一直接收,存下来,等遇到就一次性发一次

#8


// Receive until the peer closes the connection
    do {

        iResult = recv(ConnectSocket, recvbuf, recvbuflen, 0);
        if ( iResult > 0 )
            printf("Bytes received: %d\n", iResult);
        else if ( iResult == 0 )
            printf("Connection closed\n");
        else
            printf("recv failed: %d\n", WSAGetLastError());

    } while( iResult > 0 );

#9


定义包格式循环发送,循环接收。
发送端首先把文件的信息发送过来(文件名,文件大小等)然后循环发送,接收端接收第一个包后创建文件,准备开始循环接收。每次发送的时候定义好包格式(此次发送的文件大小,文件数据部分),接收端根据包格式进行接收。。。