在socket编程中怎么判断recv是否接收完成

如题所述

recv函数怎么判断接收结束:
1、例如在数据流中带个结束标识,那样读到结束标识就知道传输完成,停止。 这种方法只能用传输文本文件,有个文件结束符,二进制文件不行。

2、先传个长度,那么接收方就可以控制 接下来要读取多少个字节的数据才算完成。这个适合传输任何文件。

例子:
C/C++ code
client的发函数为:char line[MAXLINE]; while ((fgets(line,MAXLINE,fd)!=NULL) // fd 为一个文件的指针 {send (connfd, line,strlen(line),0) // connfd为 socket}server 的接收函数为:for (;;) {if ((n=recv(connfd, recvline,MAXLINE,0)>0) {recvline[n]=0;fputs(stdout,recvline);else break;}}
当发端停止发送后,收端无法得知数据已经传输完毕,从而一直在for中死循环,可以用以上方法判断接收结束。
温馨提示:内容为网友见解,仅供参考
第1个回答  2015-09-16
recv是socket编程中最常用的函数之一,在阻塞状态的recv有时候会返回不同的值,而对于错误值也有相应的错误码,分别对应不同的状态,下面是我针对常见的几种网络状态的简单总结。 首先阻塞接收的recv有时候会返回0,这仅在对端已经关闭TCP连接时本回答被提问者和网友采纳

在socket编程中怎么判断recv是否接收完成
recv函数怎么判断接收结束:1、例如在数据流中带个结束标识,那样读到结束标识就知道传输完成,停止。 这种方法只能用传输文本文件,有个文件结束符,二进制文件不行。2、先传个长度,那么接收方就可以控制 接下来要读取多少个字节的数据才算完成。这个适合传输任何文件。例子:C\/C++ code client的发函数...

recv函数 怎么判断接收结束
recv函数怎么判断接收结束:1、例如在数据流中带个结束标识,那样读到结束标识就知道传输完成,停止。 这种方法只能用传输文本文件,有个文件结束符,二进制文件不行。2、先传个长度,那么接收方就可以控制 接下来要读取多少个字节的数据才算完成。这个适合传输任何文件。例子:C\/C++ code client的发函数...

C#Socket怎么才能接收完整的数据
Receive的返回值是接收的字节数,当是0时表示传送结束,否则循环接收 缓冲区不用太大,8k或64k看情况 Byte[] RecvBytes = new Byte[1024*8];int iBytes = 1;string strAllHtml = "";while (iBytes > 0){ iBytes = conn.Receive(RecvBytes, RecvBytes.Length, 0);strAllHtml += Encoding...

socket编程·send和recv
recv的返回值>0时,表示实际接受到多少字节。 recv的返回值==0时, 表示连接断开 ,也就是收到了FIN或者RST。 recv的返回值<0时,检查errno,和send类似。socket的选项是 SOCK_DGRAM 。 send的返回值>0时, 返回值应该等于发送的数据长度 。如果send的数据大于MTU,会在IP层分片,到达目...

Linux网络编程中socket常见错误码分析
EINTR(4):当一个阻塞操作被中断,如设置的发送或接收超时,可能会遇到这个错误。对于阻塞模式的socket,如在read或write操作时遇到-1并伴有errno为4,意味着系统调用被中断。遇到EINTR,应检查返回值,如果recv返回0,表示连接已断开,应停止接收操作。ETIMEOUT(1103)和EAGAIN(4):这两个错误通常与...

判断socket断开连接的方法
下面来罗列一下判断远端已经断开的方法:当recv()返回值小于等于0时,socket连接断开。但是还需要判断 errno是否等于 EINTR,如果errno == EINTR 则说明recv函数是由于程序接收到信号后返回的,socket连接还是正常的,不应close掉socket连接。若使用了select等系统函数,若远端断开,则select返回1,recv返回0...

Linux的poll机制linux的poll
libevent支持多种I\/O多路复用技术(epoll、poll、dev\/poll、select和kqueue等),在不同的操作系统下,做了多路复用模型的抽象,可以选择使用不同的模型,通过事件函数提供服务。在非阻塞模式上怎么知道recv接收数据完成?以linux下tcpsocket编程为例:阻塞就是recv\/read的时候socket接收缓冲区要是有数据就读...

socket通信如何比较recv2次接收的内容
设上次接收到的内容为buffer1,接收到的长度为len1;本次接收到的内容为buffer2,接收到的长度为len2! 先比较len1和len2是否相等,如果相等,则使用memcmp函数比较buffer1和buffer2,看他们是否相同,调用方式为:if(memcmp(buffer1, buffer2, len1) == 0){ \/\/相等 } ...

VC中使用API编写的socket程序中如何设置阻塞和非阻塞accept,recv
接收函数将被执行过去.一个比较完善的程序一般来讲都使用非阻塞的方式来进行.原因在于如果采用阻塞方式,程序将停在那里一直等待条件满足,正常情况下是没有问题的,但如果你想停止阻塞的程序,就出现了比较麻烦的问题. 对于VC中使用API方式进行的SOCKET编程,需要使用下面的函数来设置阻塞方式和非阻塞方式: ...

C++ Socket send recv 循环发送和接收 阻塞与缓冲区
数据发送与接收 send函数负责将数据写入输出缓冲区,数据发送到目标主机由TCP协议完成。recv函数从输入缓冲区读取数据,数据接收是独立的,recv函数不会判断数据包结束位置。数据的发送和接收不是一次完成,可能存在数据堆积在缓冲区中等待接收的情况。循环发送与接收 确保数据完整传输的关键是正确管理套接字的...

相似回答