【问题标题】:Reliable UDP implementation design issue可靠的UDP实现设计问题
【发布时间】:2012-05-26 05:04:34
【问题描述】:

我一直在围绕 UDP 进行自定义以使其可靠。我有这个设计问题,只有在我的整个程序准备好并开始将数据包从源发送到接收器之后我才意识到。

场景: 我创建了一个用于接收数据包的线程。父母做数据包发送工作。由于这只是一个 POC,我将缓冲区和公共数据结构作为全局指针保存,父级在堆上为其分配内存。我正在使用互斥锁处理关键内存部分。

作为可靠性的一部分,除了数据包之外,我还通过一些控制包发送。在任何时候,客户端都会发送数据包并从服务器接收控制包,而服务器将接收数据包并发送控制包。我使用的是单套接字,因为我的理解是 send 和 recv 在单套接字和默认阻塞上同时工作。

问题: 出于测试目的,我将 100 个数据包从源发送到接收器。不幸的是,服务器端的线程一直忙于接收数据包并将其存储在缓冲区中。在父线程获得上下文切换之前,服务器代码不会将数据包传递给应用程序。这增加了整体沟通中不可接受的延迟。

请帮助我理解,这是什么问题;可以进行哪些更改以提高性能?

提前致谢,凯达

【问题讨论】:

  • TCP 可能比 UDP 更可靠。为什么不能使用 TCP/IP 套接字?
  • 要求适用于流媒体应用程序。 tcp 不太适合。

标签: c linux multithreading sockets udp


【解决方案1】:

由于您使用的是互斥锁,因此当发送数据包后在一个线程上释放互斥锁时,另一个线程应该使用该数据包。也许您没有尽快释放互斥锁。

或者,让套接字的 select() 方法为您处理 unblock-on-receive。

【讨论】:

  • 我锁定和解锁每个数据包的互斥锁。它应该减轻上下文?
  • 是的,您可能在某个地方遇到了错误。但是,如果您专门对套接字中的数据包进行互斥,那么 select() 将为您执行此操作:rhoden.id.au/doc/sockets2.html
  • 谢谢,这是有道理的。是否可以保持相同的单线程架构和它的父级并且仍然利用选择?我在线程中进行 recvfrom 和 sendto 调用,并且只在父级中调用 sendto。有什么线索吗?谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-21
  • 2011-09-25
  • 1970-01-01
相关资源
最近更新 更多