android udp多线程,UDP非阻塞或一个单独的线程接收?

好吧,首先,如果你有一些东西,它正在工作,通常是一个好主意,离开它。 为什么修理什么不坏?

但是如果你遇到了麻烦,而且真的想重写你的networking代码,我想你有四个主要的select:

multithreading的阻塞代码(你现在正在做什么)

带有级别触发通知的非阻塞套接字

非阻塞套接字,准备就绪变化通知

asynchronous套接字

在写了大量的多人游戏(从对等到大型多人游戏)的客户端和服务器之后,我喜欢认为选项2导致游戏的服务器和客户端部分的复杂度最低,性能相当好。 紧接着,我会select第四种方式,但通常需要您重新考虑您的整个程序,而且大多数情况下,我发现它对服务器而不是客户端很有用。

特别是,我想建议不要在multithreading环境中阻塞套接字,因为这样做通常会导致locking和其他同步特性,这不仅会大大增加代码的复杂性,而且还会降低其性能,因为某些线程等待其他。

但最重要的是,大多数套接字实现(以及大多数I / O实现)在最底层是非阻塞的。 简单地提供阻塞操作来简化微不足道的程序的开发。 当一个套接字被阻塞的时候,那个线程中的CPU是完全空闲的,那么为什么要在一个已经非阻塞的任务上通过阻塞抽象构建一个非阻塞抽象?

如果你还没有尝试过,非阻塞套接字编程有点令人生畏,但事实certificate它非常简单,如果你已经在做input轮询,你已经有了做非阻塞套接字的思想。

你想要做的第一件事是将套接字设置为非阻塞。 你用fcntl()做到这一点。

之后,在send() , recv() , sendto() , recvfrom() , accept() ( connect()有点不同)或其他可能阻塞线程的调用之前,sockets。 select()告诉你是否可以在没有阻塞的情况下在套接字上执行后续的读或写操作。 如果是这样的话,你可以安全地进行你想要的操作,并且套接字不会被阻塞。

在游戏中包含这个很简单。 如果你已经有一个游戏循环,例如这样:

while game_is_running do poll_input() update_world() do_sounds() draw_world() end

你可以改变它看起来像这样:

while game_is_running do poll_input() read_network() update_world() do_sounds() write_network() draw_world() end

哪里

function read_network() while select(socket, READ) do game.net_input.enqueue(recv(socket)) end end

function write_network() while not game.net_output.empty and select(socket, WRITE) do send(socket, game.net_output.dequeue()) end end

就资源而言,即使是唯一一本书,我认为每个人都必须在自己的书架上拥有的唯一一本书是Richard Stevens的“ Unix Network Programming,Vol.1 ”。 不要紧,如果你做Windows或其他操作系统或语言套接字编程。 在阅读本书之前,不要以为你理解套接字。

另一个资源,你可以在这个页面上find关于多套接字编程(通常与服务器编程相关)的可用解决scheme的总体概述。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值