UDP怎么检测对方socket已关闭无法接收数据?

wmrwinhap 2004-04-22 11:34:17
我的程序原理:客户端向服务器端发送一个请求后,服务器端不停地向客户端发送数据,直到客户端关闭。
可由于要用无连接的UDP,客户端正常/异常关闭后服务器端还在不停地发数据,因为我不知道怎样检测对方的UDP socket已关闭。

出现这种情况时,在Windows下,sendto成功,但发送一个数据报后该socket立即有数据可读事件,调用recvfrom结果返回失败,错误代码为10054表示对端不存在

可是在Linux下,sendto也成功,但发送后也检测不到有数据可读事件,怎么办呢?
...全文
771 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
sharkhuang 2004-05-05
  • 打赏
  • 举报
回复
不知道有不有icmp包!应该又吧
wmrwinhap 2004-05-05
  • 打赏
  • 举报
回复
不过我还是要先试试可否通过ICMP消息解决这个问题
wmrwinhap 2004-05-05
  • 打赏
  • 举报
回复
to: mechgoukiteng:
FIN包是什么包?如何接收?是ICMP协议包吗?对方主机崩溃指什么,不包括任务异常退出或者用任务管理器杀死它吧?


ly60269(aaa) :
只有定时让对方发一个回应。
我已在对方正常退出时加了发送一个结束请求了,但这不能解决异常结束的问题,再在每秒主动补发一个继续请求吧

如果真没有什么好办法,看来确实只好如此了。


ly60269 2004-05-05
  • 打赏
  • 举报
回复
只有定时让对方发一个回应。
mechgoukiteng 2004-05-05
  • 打赏
  • 举报
回复
请求方正常/异常退出 对方的会返回一个FIN包的 不过如果是对方主机崩溃 那是没有一个简单的方法知道

只有查询了
wmrwinhap 2004-05-05
  • 打赏
  • 举报
回复
一收一发也就是一个请求给一个回应的效率在我这里是无法接受的,所以我要实现收到一个请求后无需继续请求就不停地发送数据报,关键是请求方正常/异常退出后,我不能向一个不存在的无效用户不停地服务呀,这会大大降低给正常用户服务的效率的。

向不存在的端口发送数据报应是该有ICMP错误返回的(我还没有检验),我可以去关注ICMP错误,可是我通过ICMP能知道是哪个用户不在线了吗?我可是同时在为多个用户服务啊

在Windows下,sendto成功,但发送一个数据报后该socket立即有数据可读事件,调用
recvfrom结果返回失败,错误代码为10054表示对端不存在
Windows这是怎么实现的呢?难道是实现了检测到ICMP错误后给出的回应?

CoolQ 2004-04-22
  • 打赏
  • 举报
回复
向未开的UDP端口发送数据,应该有ICMP Port unreachable的信息返回把?
uestc_yrq 2004-04-22
  • 打赏
  • 举报
回复
只能采用应答方式来确认,一应一答,可以确定如果几次收不到就认为关闭
jkjium 2004-04-22
  • 打赏
  • 举报
回复
用connected UDP,可以收到出错的ICMP
growup 2004-04-22
  • 打赏
  • 举报
回复
一应一答,无应答则为关闭
off_line 2004-04-22
  • 打赏
  • 举报
回复
这个用UDP好像不行吧,他本身都是发了就不管的,你也没法知道他到底收到没有啊。自己写程序实现一下。
LinHanLao 2004-04-22
  • 打赏
  • 举报
回复
upd本来就是一个不可靠的协议,
要使udp通信的数据可靠就要靠你的应用程序
实现一些协议,
例如你可以程序去实现数据包的接受回应,
成功接受到数据包就回应
......
tianxiangyuan 2004-04-22
  • 打赏
  • 举报
回复
每隔一断时间发送一个(或者几个)测试数据报,如果对方没有回应,就可以认为断开了连接。

23,217

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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