Code Bye

c#udp通信原理

如果PC C的一个UDP端口同时收到PC A,和PC B 发送的数据,C是怎么处理呢?都放入缓存?然后再分别处理?还是在放入缓存前就有个队列,一个个来?还是会报错?

什么叫“同时”?你的程序上是不可能“同事收到”的,因为程序是顺序 Receive 操作的。只不过,当你收到之后,你可以在子线程中进行业务处理,而不用等处理完毕才开始下一个 Receive 操作。

而在多子线程中并发处理业务,根本用不着什么“队列”,因为多线程(或者系统线程池管理机制)本身就能够保存保存各自的运行数据。除非真的有什么特别的额外要求,否则那种“死读java书”的人津津乐道的抄袭来的什么“消息队列”概念就是多余的。


10分
注意,在.net中要使用UdpClient 类,而不要使用 Socket 类!

它跟 tcp 的机制完全不一样,它只能处理很短很小的数据(几十k大小),一次收到一个完整包,既不存在分包也不存在粘包,因此也不需要消息缓存。

同时你也不需要在服务器端保存客户端的连接通道对象,每收到一个消息包你都分别需要使用 Receive 操作的第二个参数来获取客户端 EndPoint,以便用来作为返回信息的地址。

udp 服务程序编写起来非常方便,非常简洁。要比tcp服务处理简单多了。

但是,udp在互联网上基本上成功率能有30%就不错了,所以它通常用于发送毫不重要、可以随意丢弃的一些简单通知。

由于不可靠性,因此它不实用。即使你编写udp通讯程序,你还需要使用tcp或者http作为udp通讯失败后的补救手段。

引用 1 楼 sp1234 的回复:

什么叫“同时”?你的程序上是不可能“同事收到”的,因为程序是顺序 Receive 操作的。只不过,当你收到之后,你可以在子线程中进行业务处理,而不用等处理完毕才开始下一个 Receive 操作。

而在多子线程中并发处理业务,根本用不着什么“队列”,因为多线程(或者系统线程池管理机制)本身就能够保存保存各自的运行数据。除非真的有什么特别的额外要求,否则那种“死读java书”的人津津乐道的抄袭来的什么“消息队列”概念就是多余的。

大师,我的意思是,假如A,和B的包同时到达C,这样会不会造成报错?我是用的单线程

引用 4 楼 ericmpdeng 的回复:
Quote: 引用 1 楼 sp1234 的回复:

什么叫“同时”?你的程序上是不可能“同事收到”的,因为程序是顺序 Receive 操作的。只不过,当你收到之后,你可以在子线程中进行业务处理,而不用等处理完毕才开始下一个 Receive 操作。

而在多子线程中并发处理业务,根本用不着什么“队列”,因为多线程(或者系统线程池管理机制)本身就能够保存保存各自的运行数据。除非真的有什么特别的额外要求,否则那种“死读java书”的人津津乐道的抄袭来的什么“消息队列”概念就是多余的。

大师,我的意思是,假如A,和B的包同时到达C,这样会不会造成报错?我是用的单线程

不存在同时到达,底层数据包都是顺序到达,在缓冲区里排队的


15分
一个时刻,以太网上只有一个数据桢在传输,你应该知道冲突处理机制,所以,在同一个瞬间,是不可能有两个信号在以太网上传输的,所以,也就不存在同时到达的问题。

15分
以太网网线其实就是2对双绞线,1对负责发送,1对负责接收
所谓信号,数据,不过是一组1,0,1,0,在线路里就是高电平低电平
数据必须是串行的,不能并行
谢谢各位,懂了

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明c#udp通信原理