当前位置:  技术问答>linux和unix

如何在recv时判断出对方已中断连接?

    来源: 互联网  发布时间:2015-09-20

    本文导语:  在Linux下用C语言做socket程序。我用recv等待对方给我发数据。连接建立后我用recv等对方发数据时如对方不发数据,而是中断连接,recv函数返回0而不是表示出错的-1,于是我以为对方还没发来,还在继续等。我是过用read...

在Linux下用C语言做socket程序。我用recv等待对方给我发数据。连接建立后我用recv等对方发数据时如对方不发数据,而是中断连接,recv函数返回0而不是表示出错的-1,于是我以为对方还没发来,还在继续等。我是过用read也一样,用feof也判断不出。如何在recv时判断出对方已中断连接?我不想select

|
recv收到0,如不放心再send 0字节试试

|
在connect之后,设置读和写的超时时间

STR_TIME lstr_timevalue ;
int li_len ;

li_len = sizeof(lstr_timevalue) ;
lstr_timevalue.tv_sec = 2 ;  //设置超时时间为2秒
setsockopt(li_sockfd , SOL_SOCKET , SO_RCVTIMEO , (void *)&lstr_timevalue ,  li_len ) ;
setsockopt(li_sockfd , SOL_SOCKET , SO_SNDTIMEO , (void *)&lstr_timevalue ,  li_len ) ;

|
如果用阻塞套接字,recv返回0本身就表示对方已经断开连接,套接字本身被看作一个文件,
读到0就表示EOF,也就是文件结束了。recv不能只判断返回-1就是错误,还需判断0。

|
在非阻塞状态下,len = recv(fd,...);
if (len == 0) 
对方断开。

|
recv为0本身就表示连接已断开了,不管是不是阻塞和非阻塞socket

|
为什么不用select?
你使用fcntl设置socket为非阻塞方式
设置一超时时间
只要时间设置合理
超时就可认为是断开连接了

|
recv 返回0

|
如果用阻塞套接字,recv返回0本身就表示对方已经断开连接,套接字本身被看作一个文件,
读到0就表示EOF,也就是文件结束了。recv不能只判断返回-1就是错误,还需判断0。

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • recv如何使用?
  • 虚拟机的linux,在其中运行Server和Client,Server端send了一个大小4096B的包,客户端recv到3845B,用netstat查看连接,Recv-Q和Send-Q项显示为0,为什么没收完?其余字节哪去了??
  • socket编程 是recv阻塞
  • socket编程:recv(...)函数问题求救
  • recv在什么情况下会返回0
  • socket tcp 关于 alarm() 和 recv() ?
  • 请教soclet中recv()函数最大返回值的问题
  • 对recv函数第四个参数置0的疑问
  • 关于recv函数的问题
  • linux 网络编程 recv函数
  • linux c recv
  • 请问 : read, 与recv 两个函数有什么区别啊?
  • recv 接收 ,接收空间不够大, 可以通过什么知道?
  • 求教!为何在socket编程中调recv函数无法阻塞?
  • 关于socket的send(),recv()的问题.
  • socket中的疑问:read,write和send,recv的区别
  • 求助:关于单线程recv时的超时问题
  • linux c 网络编程时用 recv 函数
  • 请问:SCO UNIX下SOCKET的recv返回-1,errno=9?在线等·····
  • (socket通信)poll提示有数据可读 recv却返回 EAGAIN


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3