导航
  • 主页
  • 系统维护与使用
  • 应用程序开发
  • 内核源代码
  • 驱动程序开发
  • CPU和硬件区
  • UNIX文化
  • Solaris
  • Power Linux
  • 问答

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

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

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

可是在Linux下,sendto也成功,但发送后也检测不到有数据可读事件,怎么办呢?
...全文
454 点赞 收藏 13
写回复
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
每隔一断时间发送一个(或者几个)测试数据报,如果对方没有回应,就可以认为断开了连接。
回复
发动态
发帖子
Linux/Unix社区
创建于2007-08-27

2.0w+

社区成员

Linux/Unix社区 应用程序开发区
申请成为版主
社区公告
暂无公告