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

FreeBSD 判断TCP 链接中断的问题

    来源: 互联网  发布时间:2016-07-31

    本文导语:  在FreeBSD下用C语言做socket程序。     我用recv等待对方给我发数据。对方会不定时的给我发数据,从1s - 1分钟左右一个数据都有可能。我会一直 recv 读取,如果读取不到,会返回 -1 ,在window 下错误是ETIMEOUT ,...

在FreeBSD下用C语言做socket程序。
    我用recv等待对方给我发数据。对方会不定时的给我发数据,从1s - 1分钟左右一个数据都有可能。我会一直 recv 读取,如果读取不到,会返回 -1 ,在window 下错误是ETIMEOUT ,在FreeBSD 下面是 资源暂时不可用。当有数据的时候,recv就能读到数据,返回读到数据的数目。在window 下读取,如果链接错误了,recv 读取以后,马上会报出出错的原因,比如对方强制关闭了链接,我就可以重新链接了。可是在FreeBSD下读取, 当我关闭服务器的链接之后,还是recv返回 -1 ,错误还是资源不可用,send 1 个字节过去,居然还会正确返回1,我拔掉网线也一样。特别的无语。情况和我正常读不到数据的情况一样。
    我也想过用selelct ,可是这个时间不好设置,因为正常可能 1分钟不来数据,或者10分钟不来数据都有可能,也可能1s来一个数据。不知道有没有更加好的办法。

|
从你的描述看,能分析出来这样几点:

1、你的socket应该是非阻塞模式的,所以recv()读一次就能立即返回,无论是否读到数据了。而recv()的返回值有三种情况:读到数据时,返回实际读到的长度;出错时,返回-1;对端执行顺序关闭时,返回0;这样,你读取到-1的时候,实际上已经是错误了,这个时候应该用errno判断一下错误代码是什么

2、当你send() 1子接过去的时候,提示成功是因为 send()在非阻塞模式下,只能够保证把消息发送到缓冲区队列中去,但是这不表示对端能收到;也就是send()只要讲消息push进缓冲区就认为成功了,于是就返回了1。但是因为你断掉了server,所以这个消息对端肯定是收不到的。

建议最好抓一下两面交互的包,或者把代码贴上来看一下,要不然实在不好定位


    
 
 

您可能感兴趣的文章:

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












  • 相关文章推荐
  • 现在FreeBSD 7.2 和 FreeBSD 8.0哪个更稳定一些
  • 急急急!!!怎样在ftp://ftp.freebsd.cn.org里下载FreeBSD4.6操作系统哪?
  • 我想装FREEBSD,不知它支不支持3COM 3C905B-TX网卡?哪位兄弟装过FREEBSD的请问一下!谢谢
  • XP下装了VMware,并在VMware内装了FreeBSD,请问如何XP下拷文件到FreeBSD
  • 多系统怎样安装FREEBSD?
  • 求FreeBSD论坛或博客(在线等)
  • Freebsd怎么样??
  • 关于freebsd的一些疑问
  • 安装FreeBSD遇到的问题
  • 关于freebsd和linux的问题
  • 如何在freebsd中安装桌面
  • 好象用FreeBSD的人不多啊。:)
  • 刚刚才真正的用上了freebsd,发现了一些问题,比较疑惑。。
  • 安装FreeBSD 6.1 出错
  • FreeBSD和Redhat哪个更快点
  • FreeBSD与Linux到底有什么不同啊?
  • 请问FreeBSD是一个什麽样的操作系统?
  • freebsd做前台 使用win2000做储存器问题问题(非高手免进)
  • FreeBSD虚拟机 VirtualBSD
  • 那有FreeBSD?


  • 站内导航:


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

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

    sqlserver iis7站长之家