我用serversocket的线程模式做一个服务器端程序,但是这程序还需要向每一个客户端发送信息数据。但是我遇到的情况是,当服务器端发送给客户端数据的时候,此时客户端已经掉线了,但是这时候服务器端的send发送函数还是返回发送数据的字节数,而不是直接返回错误代码或触发异常,大概要等几分钟,这时候这个socket才关闭。
   我的意思是,有没有更好的办法,就是在服务端send发送数据的时候,如果对方吊线了,就立即直接返回错误或者触发异常,也就是立即就知道是否发送成功了?有没有这样的办法呀??send函数在对方吊线了,为什么还是返回还是发送数据的字节数,为什么不返回0字节呢??这是为什么??

解决方案 »

  1.   

    記得VCL中serversocket發送數據的方法都有錯誤處理,如果出現錯誤,會關閉本地socket,莫非竟是socket API中send函數的問題?或者樓主檢查下代碼先,呵呵
      

  2.   

    关于掉线的情况是没有更好的办法的
    服务器端在send的时候并不知道客户端掉线,所以会将数据发出去,然后经过路由如果客户端吊线
    服务器端是收不到回应的,所以约1分钟后,服务器超时,确认已经掉线
    可以改善的方式是修改超时时间,尽早返回错误,但是这种情况下send是不会失败的
    udp的send总是成功的
    tcpserver send失败除非客户端已经请求连接关闭,或服务器端把连接关了,如果用控件也几乎不会有这问题
    这是tcp/ip协议上无法处理的,所以不论那种编程语言都不能,即不是程序问题也不是api问题
      

  3.   

    楼上说的“修改超时时间”是怎么回事??如何修改超时时间??
    你说的,“如果用控件也几乎不会有这问题”这句话是什么意思??
    我用setsockopt函数将发送超时改为1秒钟,然后对方网线拔掉,这时还继续send发送数据,结果还是返回数据的字节数,好像还是发送成功。这是怎么回事?是不是这种方式就无法解决了。