同一台计算机,多客户端竞争同一udp端口问题

Squall_zy 2013-04-21 02:00:18
目前的项目需要把c/s结构做一下调整。
原先一个client一台机器,现在想节约成本,变成两个client一台机器。(类似一台机器开两个QQ)
之前的tcp端口都好说,问题是udp端口(有接收数据的需求),如何处理竞争问题?

别给我讲多播等不靠谱的东西。
有没有用过端口协商的,讲一下思路?
...全文
1270 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
youngwolf 2013-04-23
  • 打赏
  • 举报
回复
一般的做法是弄一个进程或者线程专门接收数据,然后分发给多个线程或者进程处理。 如果这个专门的数据接收线程或者进程你都还觉得不够快,那能想的办法就不多了,只能多加入口,这就涉及到客户端连接地址的改变,可以随机选一个,或者再搞个分流服务器,专门为客户端选择连接哪一台服务器。
Squall_zy 2013-04-23
  • 打赏
  • 举报
回复
引用 8 楼 yang79tao 的回复:
端口复用只是让bind不出错,接收数据的时候,还是只有一个能接收到,当能接收到数据的socket关闭之后,另一个才能接收到数据。所以根本解决不了你的问题。
嗯,也对。 只是我也会用到广播,这样可以轻松解决多客户端响应的问题(即使在同一台机器上,见测试5)。 以上的实验是同时开了5个进程的情况,所以结果还是很有意义的。 我本就打算让client和IP对应,以做区分。
youngwolf 2013-04-23
  • 打赏
  • 举报
回复
端口复用只是让bind不出错,接收数据的时候,还是只有一个能接收到,当能接收到数据的socket关闭之后,另一个才能接收到数据。所以根本解决不了你的问题。
无言猪 2013-04-23
  • 打赏
  • 举报
回复
这很如何reuse的情况.结果1,2是验证了ip+port唯一确定,结果3是随机的,在有的系统上是后bind的收到,有的是先bind的收到,但是有一点确定的就是只有一个能收到.结果4,bind时不指定ip的话是bind到本地的所有ip地址上,如果你还有wifi接口,或者另外的物理网卡,也会bind.结果5的话以前没见人做过这样的实验,
Squall_zy 2013-04-23
  • 打赏
  • 举报
回复
还是做实验能解决疑惑,看来我有点想当然了。SO_REUSEADDR还是蛮多道道的。 UDP和TCP不一样,UDP的单播、组播、广播又不一样。 测试机器,有4个ip地址,分别是 192.168.3.20 192.168.3.21 192.168.3.22 192.168.3.23 开个5个UDP接收程序,分别用ABCDE代表。使用SO_REUSEADDR。 A: UDP,bind( 5600, "192.168.3.20" ) B: UDP, bind( 5600, "192.168.3.21" ) C: UDP, bind( 5600, "192.168.3.22" ) D: UDP, bind( 5600, "192.168.3.22" ) E: UDP, bind( 5600, NULL ) //只绑定端口,不关心ip 观察以上5个进程,C和D是同样的进程开了两遍。E进程只绑定了端口,ABCD又绑定端口又绑定ip。 测试情况: 1、sendto( 5600, "192.168.3.20" ) 结果:只有A进程响应。 2、sendto( 5600, "192.168.3.21" ) 结果:只有B进程响应。(同上) 3、sendto( 5600, "192.168.3.22" ) 结果:C或D中只有一个响应。即:只有先启动的进程响应,另一个不响应。ABE均不响应。 4、sendto( 5600, "192.168.3.23" ) 结果:只有E响应,ABCD不响应。 5、sendto( 5600, "192.168.3.255" ) 结果:广播模式下,很奇特,ABCD各响应1遍,E响应了4遍。 以上实验是单播和广播。组播没做,但是看了一些资料,说C和D均会响应,但E这种情况就不情况响应几遍了。
笨笨仔 2013-04-22
  • 打赏
  • 举报
回复
UDP广播应该没问题,关键是同一个端口,在同一台机中只有一个用户程序能收到。因此,可以为服务器、各用户使用设定不同的端口。用户端通过服务端的端口发送连接请求,并在请求广播中附带自己的端口号,服务端收到请求后建立与该端口的UDP连接。
oyljerry 2013-04-21
  • 打赏
  • 举报
回复
client都是连接服务端,建立连接后,端口就是不一样的。各自处理各自端口的数据
take_520 2013-04-21
  • 打赏
  • 举报
回复
udp没遇过这种情况 tcp的话可以使用端口复用技术 估计udp也适用的吧..LZ去试试吧 可以的话麻烦也告诉我一声 呵呵
smwhotjay 2013-04-21
  • 打赏
  • 举报
回复
udp listen 个范围
ShengFei01 2013-04-21
  • 打赏
  • 举报
回复
UDP两个client可以使用不同的端口,如果是同一端口,可以通过setsockopt设置端口重用,看一个这的例子: http://download.csdn.net/detail/geoff08zhang/4571358

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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