c - 可靠的UDP实现设计问题

标签 c linux multithreading sockets udp

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

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

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

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

请帮助我理解,问题是什么;可以改变什么来提高性能?

提前致谢,基达尔

最佳答案

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

或者,让套接字的 select() 方法为您处理接收时解锁。

关于c - 可靠的UDP实现设计问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10763733/

相关文章:

java - ZeroMQ 多线程 : create sockets on-demand or use sockets object pool?

c# - 限制 self 扩展任务

c - 理解指向指针概念的指针

c - 两个已排序数组的融合

c - 一元 '*' 的无效类型参数

c - 不使用指针返回多个值的函数

linux - 为什么我的 Inotify 脚本在 watches 建立后不会更进一步?

linux - webpack --watch 构建一次后退出

linux - 段错误很奇怪

java - 与 “break”同步的语句