c#udp通信原理

ericmpdeng 2015-01-19 11:26:28
如果PC C的一个UDP端口同时收到PC A,和PC B 发送的数据,C是怎么处理呢?都放入缓存?然后再分别处理?还是在放入缓存前就有个队列,一个个来?还是会报错?新手请指教!
...全文
178 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
ericmpdeng 2015-01-19
  • 打赏
  • 举报
回复
引用 1 楼 sp1234 的回复:
什么叫“同时”?你的程序上是不可能“同事收到”的,因为程序是顺序 Receive 操作的。只不过,当你收到之后,你可以在子线程中进行业务处理,而不用等处理完毕才开始下一个 Receive 操作。 而在多子线程中并发处理业务,根本用不着什么“队列”,因为多线程(或者系统线程池管理机制)本身就能够保存保存各自的运行数据。除非真的有什么特别的额外要求,否则那种“死读java书”的人津津乐道的抄袭来的什么“消息队列”概念就是多余的。
大师,我的意思是,假如A,和B的包同时到达C,这样会不会造成报错?我是用的单线程
  • 打赏
  • 举报
回复
udp 服务程序编写起来非常方便,非常简洁。要比tcp服务处理简单多了。 但是,udp在互联网上基本上成功率能有30%就不错了,所以它通常用于发送毫不重要、可以随意丢弃的一些简单通知。 由于不可靠性,因此它不实用。即使你编写udp通讯程序,你还需要使用tcp或者http作为udp通讯失败后的补救手段。
  • 打赏
  • 举报
回复
注意,在.net中要使用UdpClient 类,而不要使用 Socket 类! 它跟 tcp 的机制完全不一样,它只能处理很短很小的数据(几十k大小),一次收到一个完整包,既不存在分包也不存在粘包,因此也不需要消息缓存。 同时你也不需要在服务器端保存客户端的连接通道对象,每收到一个消息包你都分别需要使用 Receive 操作的第二个参数来获取客户端 EndPoint,以便用来作为返回信息的地址。
  • 打赏
  • 举报
回复
什么叫“同时”?你的程序上是不可能“同事收到”的,因为程序是顺序 Receive 操作的。只不过,当你收到之后,你可以在子线程中进行业务处理,而不用等处理完毕才开始下一个 Receive 操作。 而在多子线程中并发处理业务,根本用不着什么“队列”,因为多线程(或者系统线程池管理机制)本身就能够保存保存各自的运行数据。除非真的有什么特别的额外要求,否则那种“死读java书”的人津津乐道的抄袭来的什么“消息队列”概念就是多余的。
ericmpdeng 2015-01-19
  • 打赏
  • 举报
回复
谢谢各位,懂了
於黾 2015-01-19
  • 打赏
  • 举报
回复
以太网网线其实就是2对双绞线,1对负责发送,1对负责接收 所谓信号,数据,不过是一组1,0,1,0,在线路里就是高电平低电平 数据必须是串行的,不能并行
john_QQ:2335298917 2015-01-19
  • 打赏
  • 举报
回复
一个时刻,以太网上只有一个数据桢在传输,你应该知道冲突处理机制,所以,在同一个瞬间,是不可能有两个信号在以太网上传输的,所以,也就不存在同时到达的问题。
於黾 2015-01-19
  • 打赏
  • 举报
回复
引用 4 楼 ericmpdeng 的回复:
[quote=引用 1 楼 sp1234 的回复:] 什么叫“同时”?你的程序上是不可能“同事收到”的,因为程序是顺序 Receive 操作的。只不过,当你收到之后,你可以在子线程中进行业务处理,而不用等处理完毕才开始下一个 Receive 操作。 而在多子线程中并发处理业务,根本用不着什么“队列”,因为多线程(或者系统线程池管理机制)本身就能够保存保存各自的运行数据。除非真的有什么特别的额外要求,否则那种“死读java书”的人津津乐道的抄袭来的什么“消息队列”概念就是多余的。
大师,我的意思是,假如A,和B的包同时到达C,这样会不会造成报错?我是用的单线程[/quote] 不存在同时到达,底层数据包都是顺序到达,在缓冲区里排队的

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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