免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3587 | 回复: 6
打印 上一主题 下一主题

[C] 关于TCP连接如何得到连接断开的地址 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-06-12 13:26 |只看该作者 |倒序浏览
最近学习Linux上的网络编程,写了个类似与聊天的小程序
具体是有一个server,n个client
我的做法是:每个client有一个tcp套接字和UDP套接字,并将udp套接字绑定一个端口,然后用tcp套接字与server之间连接,连接之后把自己的UDP地址发送给server,server收到后把新连接的客户的udp地址发送给所有已连接的客户端,客户端更新在线客户列表,客户端之间是通过udp进行通信,并且每个客户端都维护了一个在线客户列表。
现在的问题是:当有一个客户与服务器断开连接后,想把该客户地址从列表中删除,不知道该如何做,我是命令行运行的,使用client时,目前是使用ctrl+c关闭客户端,那么服务器怎么得到连接断开的客户的地址呢?如何得到地址后,又有什么好的办法能从将这个断开的地址从客户列表中删除?

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
2 [报告]
发表于 2011-06-12 14:13 |只看该作者
最近学习Linux上的网络编程,写了个类似与聊天的小程序
具体是有一个server,n个client
我的做法是:每个 ...
wangfeng2500 发表于 2011-06-12 13:26


连接时保留地址。

论坛徽章:
0
3 [报告]
发表于 2011-06-12 14:19 |只看该作者
本帖最后由 wangfeng2500 于 2011-06-12 14:22 编辑
连接时保留地址。
yulihua49 发表于 2011-06-12 14:13

连接是保留地址后怎么办呢?我服务器目前存的是各个客户端udp套接字绑定的地址,但客户机与服务器之间是tcp连接的,不知道该怎么做才好!还是我这个设计本身就有问题呢?

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:56:11
4 [报告]
发表于 2011-06-12 18:10 |只看该作者
你的信令分爲兩個通道。

论坛徽章:
0
5 [报告]
发表于 2011-06-12 18:54 |只看该作者
client通过tcp连接给server发心跳包,server定期向client“广播”在线列表。

btw: 你的这个设计就定位为局域网了,如果是广域网,你的client之间使用udp如何通讯 ?

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
6 [报告]
发表于 2011-06-12 19:03 |只看该作者
连接是保留地址后怎么办呢?我服务器目前存的是各个客户端udp套接字绑定的地址,但客户机与服务器之间是t ...
wangfeng2500 发表于 2011-06-12 14:19


getpeeraddr(socket)得到对端地址,存起来。当该socket关闭时,通知其他端点删除这个地址。

论坛徽章:
0
7 [报告]
发表于 2011-06-13 10:12 |只看该作者
这不就是qq的列表么?client断线的时候 服务器的tcp连接是可以 read到的,这里进行断线处理啊:将这个断线的信息广播到每个在线的client上去,让这些client自己跟新列表。
还有一种情况就是: client如果和服务器不是tcp连接而是UDP的话,用心跳来做也可以通知 服务器端,让服务器用 心跳信息通知其他客户端。
最后一种选择可能更简单一点:如果是正常退出,client对自己的在线列表的每个client发quit信号,不过如果碰到非正常退出,那么同步列表的工作还是要服务器做。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP