当前位置: 技术问答>linux和unix
recv的问题
来源: 互联网 发布时间:2015-09-10
本文导语: 服务器端: char pSendMsg[ ] = "Send message and receive message OK."; int rflags1 = 0 ; recv(sockfd, pRecvMsg, 100, rflags1); 客户端: char pSendMsg[ ] = "Send message and receive message OK."; int rflags2 = 0 ; recv(sockfd, pRecvMsg, 100, rf...
服务器端:
char pSendMsg[ ] = "Send message and receive message OK.";
int rflags1 = 0 ;
recv(sockfd, pRecvMsg, 100, rflags1);
客户端:
char pSendMsg[ ] = "Send message and receive message OK.";
int rflags2 = 0 ;
recv(sockfd, pRecvMsg, 100, rflags2);
以上设置后程序正常运行,因为我的rflags置为0,
rflags的取值
MSG_DONTROUTE:是send函数使用的标志.这个标志告诉IP协议.目的主机在本地网络上面,没有必要查找路由表.这个标志一般用网络诊断和路由程序里面.
MSG_OOB:表示可以接收和发送带外的数据.关于带外数据我们以后会解释的.
MSG_PEEK:是recv函数的使用标志,表示只是从系统缓冲区中读取内容,而不清楚系统缓冲区的内容.这样下次读的时候,仍然是一样的内容.一般在有多个进程读写数据时可以使用这个标志.
MSG_WAITALL是recv函数的使用标志,表示等到所有的信息到达时才返回.使用这个标志的时候recv回一直阻塞,直到指定的条件满足,或者是发生了错误. 1)当读到了指定的字节时,函数正常返回.返回值等于len 2)当读到了文件的结尾时,函数正常返回.返回值小于len 3)当操作发生错误时,返回-1,且设置错误为相应的错误号(errno)
-----------------------------------------
情况1于是我在服务器段设置rflags1=MSG_WAITALL,rflags2=0结果服务器和客户端都阻塞,我理解是没有收到制定的字节,也没有读到文件的结尾,
情况2但是我设置rflags=0,rflags2=MSG_WAITALL,程序运行正常,按照1的理解,如果阻塞,我觉得很容易接受,但是事实相反,
那么2)当读到了文件的结尾时,函数正常返回.返回值小于len ,我的字符串结束算不算读到了文件的结尾?
如果算情况1怎么解释,如果不算情况2怎么回事?
我多次试验,依然不明白,希望高人告诉我。
char pSendMsg[ ] = "Send message and receive message OK.";
int rflags1 = 0 ;
recv(sockfd, pRecvMsg, 100, rflags1);
客户端:
char pSendMsg[ ] = "Send message and receive message OK.";
int rflags2 = 0 ;
recv(sockfd, pRecvMsg, 100, rflags2);
以上设置后程序正常运行,因为我的rflags置为0,
rflags的取值
MSG_DONTROUTE:是send函数使用的标志.这个标志告诉IP协议.目的主机在本地网络上面,没有必要查找路由表.这个标志一般用网络诊断和路由程序里面.
MSG_OOB:表示可以接收和发送带外的数据.关于带外数据我们以后会解释的.
MSG_PEEK:是recv函数的使用标志,表示只是从系统缓冲区中读取内容,而不清楚系统缓冲区的内容.这样下次读的时候,仍然是一样的内容.一般在有多个进程读写数据时可以使用这个标志.
MSG_WAITALL是recv函数的使用标志,表示等到所有的信息到达时才返回.使用这个标志的时候recv回一直阻塞,直到指定的条件满足,或者是发生了错误. 1)当读到了指定的字节时,函数正常返回.返回值等于len 2)当读到了文件的结尾时,函数正常返回.返回值小于len 3)当操作发生错误时,返回-1,且设置错误为相应的错误号(errno)
-----------------------------------------
情况1于是我在服务器段设置rflags1=MSG_WAITALL,rflags2=0结果服务器和客户端都阻塞,我理解是没有收到制定的字节,也没有读到文件的结尾,
情况2但是我设置rflags=0,rflags2=MSG_WAITALL,程序运行正常,按照1的理解,如果阻塞,我觉得很容易接受,但是事实相反,
那么2)当读到了文件的结尾时,函数正常返回.返回值小于len ,我的字符串结束算不算读到了文件的结尾?
如果算情况1怎么解释,如果不算情况2怎么回事?
我多次试验,依然不明白,希望高人告诉我。
|
楼主,情况1是不是因为你服务器端切断了连接了,我查了一下MSG_WAITALL唯一可能就是楼主切断连接了。