sockets - 如何将现有的 udp 应用程序迁移到原始套接字

标签 sockets network-programming udp raw-sockets

是否有从普通 udp 套接字(linux、C99/C++、recv 使用系统调用)迁移到原始套接字的教程?

根据http://aschauf.landshut.org/fh/linux/udp_vs_raw/ch03s04.html
原始套接字比 udp 快得多。

应用程序是客户端-服务器。客户端是专有的,必须使用与 udp 服务器完全相同的协议(protocol)。但是使用原始套接字服务器可以更快一些。我必须在服务器中实现 udp 的哪些部分?是否有“快速迁移”库?

最佳答案

原始套接字允许您与较低级别的协议(protocol)进行通信,例如以太网、IP 等。是的,降低可以给您带来一些优势,但是您必须平衡它与您失去的东西。

在这种情况下,您提到服务器被编写为使用 Udp 协议(protocol),因此在线路上,通信必须是 Udp。现在,如果您要使用原始套接字,则必须确保发送封装在 Udp 数据包中的应用程序数据。您还需要编写代码以确保您遵守 Udp 协议(protocol)和状态机,以便对服务器而言,您的客户端只是另一个 Udp 客户端。完成所有这些需要编写大量代码,并且存在一些缺点,例如增加维护、增加使其正常工作的成本等。

我没有完全阅读您上面链接的论文,但要问自己的问题是,您能否获得该研究论文中给出的 yield 并将其复制到您的场景中?

在我看来,你应该首先弄清楚你的客户为什么这么慢。你有什么要求?你有什么衡量好的、快速的客户的标准吗?如果我是你,我会首先衡量当前的实现,牢记一些对场景有用的指标,例如传输的字节/秒等。然后我会分析客户端,看看它在哪里花费了太多时间,并尝试看看我是否可以减少开销并使其更快。

总而言之,在进入堆栈之前寻找堆栈顶部(即在您的应用程序中)的节省。如果你的应用程序写得不好,那么无论你走多低,你都不会看到你期望的性能提升。

关于sockets - 如何将现有的 udp 应用程序迁移到原始套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2945033/

相关文章:

c++ - Winsock 接收循环无法正常运行

c - 我应该在套接字生命周期内什么时候设置 TCP_QUICKACK 选项?

c - 如何使用 ICMPv6 套接字接收 vlan header /l2 header

java - 什么密码可以加密 UDP 数据包?

java - 如何构建自己的传输层协议(protocol)?

java - 在Linux上设置套接字发送缓冲区大小的正确方法?

node.js - 如何在 NodeJS 中编写双向双工流

android - 如何在手机休眠时保持网络通讯畅通

java - 通过网络解析大型 XML 文件

java - Java接收UDP数据