该程序有时候可以整天正常工作运行,但某些天又会出现如上问题,就是客户端会突然recv出错而退出,但是服务器端连接在此客户端上的socket却继续正常工作,丝毫没有发觉客户端已退出,检查代码本身也没发现问题。
客户端与服务器端分别位于不同的网段,现怀疑是网络的问题,或者说是防火墙的问题。不过本人对网络/防火墙不是很了解,希望懂的xdjm们帮忙推敲推敲,防火墙会不会让客户端的socket读操作失败,但却让服务器端不察觉socket这个问题而继续工作下去(服务器端的一个定时器会每隔几秒去读写一下socket)?

解决方案 »

  1.   

    setsocopt设置keepalive选项的话,就会得到通知..............
      

  2.   

    想到另一个问题:
    如果客户端socket以非正常方式(非优雅方式)退出,服务器端的socket还能正常工作(recv)吗?
      

  3.   

    我指的是连接的socket不能正常,监听的socket当然正常
      

  4.   

    非正常断开的话,socket的另一端是不会收到消息的,他会在2个小时以后再断开一般这种情况都是通过心跳包来解决,就是定时向对方询问是否在线,如果超多一定时间没有回应,就认为对方断开了,就把自己这边的socket 关闭
      

  5.   


    这有什么奇怪,网络异常和其它异常造成了socket非正常断开,服务器端是不能实时知道已断开的,这种情况下,只能靠超时机制或keepalive机制,基本都是大同小异,反正在一定时间内客户端和服务器端没有任何数据通讯,就以socket断开处理。