Socket发送数据,如何立即返回是否将数据发送给对方了?具体请进

喜欢编程朋友 2007-10-18 10:17:38
我用serversocket的线程模式做一个服务器端程序,但是这程序还需要向每一个客户端发送信息数据。但是我遇到的情况是,当服务器端发送给客户端数据的时候,此时客户端已经掉线了,但是这时候服务器端的send发送函数还是返回发送数据的字节数,而不是直接返回错误代码或触发异常,大概要等几分钟,这时候这个socket才关闭。
我的意思是,有没有更好的办法,就是在服务端send发送数据的时候,如果对方吊线了,就立即直接返回错误或者触发异常,也就是立即就知道是否发送成功了?有没有这样的办法呀??send函数在对方吊线了,为什么还是返回还是发送数据的字节数,为什么不返回0字节呢??这是为什么??
...全文
303 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
喜欢编程朋友 2007-10-19
  • 打赏
  • 举报
回复
楼上说的“修改超时时间”是怎么回事??如何修改超时时间??
你说的,“如果用控件也几乎不会有这问题”这句话是什么意思??
我用setsockopt函数将发送超时改为1秒钟,然后对方网线拔掉,这时还继续send发送数据,结果还是返回数据的字节数,好像还是发送成功。这是怎么回事?是不是这种方式就无法解决了。
ljq900 2007-10-19
  • 打赏
  • 举报
回复
关于掉线的情况是没有更好的办法的
服务器端在send的时候并不知道客户端掉线,所以会将数据发出去,然后经过路由如果客户端吊线
服务器端是收不到回应的,所以约1分钟后,服务器超时,确认已经掉线
可以改善的方式是修改超时时间,尽早返回错误,但是这种情况下send是不会失败的
udp的send总是成功的
tcpserver send失败除非客户端已经请求连接关闭,或服务器端把连接关了,如果用控件也几乎不会有这问题
这是tcp/ip协议上无法处理的,所以不论那种编程语言都不能,即不是程序问题也不是api问题
boblaw 2007-10-19
  • 打赏
  • 举报
回复
記得VCL中serversocket發送數據的方法都有錯誤處理,如果出現錯誤,會關閉本地socket,莫非竟是socket API中send函數的問題?或者樓主檢查下代碼先,呵呵

1,593

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧