当前位置: 技术问答>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 ) ;
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。
读到0就表示EOF,也就是文件结束了。recv不能只判断返回-1就是错误,还需判断0。
|
在非阻塞状态下,len = recv(fd,...);
if (len == 0)
对方断开。
if (len == 0)
对方断开。
|
recv为0本身就表示连接已断开了,不管是不是阻塞和非阻塞socket
|
为什么不用select?
你使用fcntl设置socket为非阻塞方式
设置一超时时间
只要时间设置合理
超时就可认为是断开连接了
你使用fcntl设置socket为非阻塞方式
设置一超时时间
只要时间设置合理
超时就可认为是断开连接了
|
recv 返回0
|
如果用阻塞套接字,recv返回0本身就表示对方已经断开连接,套接字本身被看作一个文件,
读到0就表示EOF,也就是文件结束了。recv不能只判断返回-1就是错误,还需判断0。
读到0就表示EOF,也就是文件结束了。recv不能只判断返回-1就是错误,还需判断0。