服务器用UDP来做, 如何做
服务器用UDP来做, 怎么做?
领导决定服务器用udp来做, 与3000客户端连接.
我查了资料, 是这样的流程: socket()->bind()->recvfrom()/sendto()
我选什么模型比较好?
用select可以吗?与3000客户端连接?
已决定不用IOCP, 因为先用的IOCP, 失败了, 不是该技术原因,是程序实现问题, 没找到原因, 所以不用IOCP.
或者创建2个线程,一个用于发送,一个用于接收, 当接收到数据时, 创建新的线程与该客户端通讯. 这样服务器可以响应3000个点的连接吗?
------解决方案--------------------
如楼上所言,UDP无连接一说。
使用UDP方式通信应该是可以的,但由于UDP是不安全的,因此在通信时需要在程序中保证数据的正确性。
可使用2个端口,分别完成上行和下行通信。
------解决方案--------------------
------解决方案--------------------
3000个客户端,要是我做就是开一条线程负责收包,维护一个收包的队列,网络的发送和接收都是用阻塞模型。这是最简单的,最不容易出错的方法,效率上是稍微有点低,如果还想提高效率也可以再开几条收发包线程,再维护一个发包队列,但是我觉得这是没必要的,你什么应用会有这么频繁的发包!!??
------解决方案--------------------
udp 做服务器
一般都不需要采用一个连接一个线程的模式
常见的:
预先分配一个足够的队列
一个线程负责UDP数据包的读,把数据投递到队列
N个线程负责队列数据的处理
这个N可以根据实际CPU数量进行设置
------解决方案--------------------
我原来做的udp服务器有用boost asio的,也有用select的,其实什么模型都可以不用.
一般处理方式:
主线程可以直接recvfrom,单线程接收所有端的数据,存放到队列中,接收缓冲一定要开大点,不然太容易丢包.
另外开工作线程若干条,处理队列中的数据包,进行解包,然后进行逻辑处理,然后该回送数据的就sendto,类似这样.
关于sendto,你也可以再专门开一条发送线程,所有需要发送的数据先保存到发送队列,然后由发送线程统一发送.
但我实际编写中,没有使用另外的发送线成,不是很有必要,直接在工作线程中处理完后就发送了.
------解决方案--------------------
假如你能够确保UDP包, 消息均控制在20K以下的话, 直接用UDP单包发送, 没有回应就再发送, 用最简单的安全模型来做, UDP比TCP要好写, 但前提是 1 个包 能够包含全部信息, 不用分包.
然后服务器简单的收到一个包, 就做事, 然后投到回复线程, 这个回复的内容在收到客户端回复或者超时之后自动删除. 3000个客户端而已, 不需要考虑传送层的效率, 多点考虑业务效率会比较实在.
领导决定服务器用udp来做, 与3000客户端连接.
我查了资料, 是这样的流程: socket()->bind()->recvfrom()/sendto()
我选什么模型比较好?
用select可以吗?与3000客户端连接?
已决定不用IOCP, 因为先用的IOCP, 失败了, 不是该技术原因,是程序实现问题, 没找到原因, 所以不用IOCP.
或者创建2个线程,一个用于发送,一个用于接收, 当接收到数据时, 创建新的线程与该客户端通讯. 这样服务器可以响应3000个点的连接吗?
------解决方案--------------------
如楼上所言,UDP无连接一说。
使用UDP方式通信应该是可以的,但由于UDP是不安全的,因此在通信时需要在程序中保证数据的正确性。
可使用2个端口,分别完成上行和下行通信。
------解决方案--------------------
------解决方案--------------------
3000个客户端,要是我做就是开一条线程负责收包,维护一个收包的队列,网络的发送和接收都是用阻塞模型。这是最简单的,最不容易出错的方法,效率上是稍微有点低,如果还想提高效率也可以再开几条收发包线程,再维护一个发包队列,但是我觉得这是没必要的,你什么应用会有这么频繁的发包!!??
------解决方案--------------------
udp 做服务器
一般都不需要采用一个连接一个线程的模式
常见的:
预先分配一个足够的队列
一个线程负责UDP数据包的读,把数据投递到队列
N个线程负责队列数据的处理
这个N可以根据实际CPU数量进行设置
------解决方案--------------------
我原来做的udp服务器有用boost asio的,也有用select的,其实什么模型都可以不用.
一般处理方式:
主线程可以直接recvfrom,单线程接收所有端的数据,存放到队列中,接收缓冲一定要开大点,不然太容易丢包.
另外开工作线程若干条,处理队列中的数据包,进行解包,然后进行逻辑处理,然后该回送数据的就sendto,类似这样.
关于sendto,你也可以再专门开一条发送线程,所有需要发送的数据先保存到发送队列,然后由发送线程统一发送.
但我实际编写中,没有使用另外的发送线成,不是很有必要,直接在工作线程中处理完后就发送了.
------解决方案--------------------
假如你能够确保UDP包, 消息均控制在20K以下的话, 直接用UDP单包发送, 没有回应就再发送, 用最简单的安全模型来做, UDP比TCP要好写, 但前提是 1 个包 能够包含全部信息, 不用分包.
然后服务器简单的收到一个包, 就做事, 然后投到回复线程, 这个回复的内容在收到客户端回复或者超时之后自动删除. 3000个客户端而已, 不需要考虑传送层的效率, 多点考虑业务效率会比较实在.