gpt4 book ai didi

sockets - 两个 TCP 套接字之间基于内核的 (Linux) 数据中继

转载 作者:可可西里 更新时间:2023-11-01 02:31:36 25 4
gpt4 key购买 nike

我编写了 TCP 中继服务器,它的工作方式类似于对等路由器( super 节点)。

最简单的情况是两个打开的套接字和它们之间的数据中继:

客户端A <---> 服务器<---> 客户端B

但是服务器必须提供大约 2000 个这样的 A-B 对,即。 4000个 socket ...

userland 中有两个众所周知的数据流中继实现(基于 socketA.recv() --> socketB.send()socketB。 recv() --> socketA.send():

  • 使用select/poll 函数(非阻塞方法)
  • 使用线程/ fork (阻塞方法)

我使用了线程,所以在最坏的情况下服务器会创建 2*2000 个线程!我不得不限制堆栈大小并且它有效,但它是正确的解决方案吗?

我的问题的核心:

有没有办法避免用户空间中两个套接字之间的事件数据中继?

好像有被动的办法。例如,我可以从每个套接字创建文件描述符,创建两个管道并使用 dup2() - 与标准输入/输出重定向相同的方法。然后两个线程对数据中继没有用,可以完成/关闭。问题是服务器是否应该关闭套接字和管道,以及如何知道管道何时损坏以记录事实?

我也找到了“套接字对”,但我不确定它是否适合我的目的。

您建议使用什么解决方案来卸载用户空间并限制线程数量?

一些额外的解释:

  • 服务器已定义静态路由表(例如 ID_A 和 ID_B - 配对标识符)。客户端 A 连接到服务器并发送 ID_A。然后服务器等待客户端 B。当 A 和 B 配对(两个套接字都打开)时,服务器开始数据中继。
  • 客户端是对称 NAT 背后的简单设备,因此 N2N 协议(protocol)或 NAT 遍历技术对它们来说太复杂了。

感谢 Gerhard Rieger,我得到了提示:

I am aware of two kernel space ways to avoid read/write, recv/send in user space:

  • sendfile
  • splice

Both have restrictions regarding type of file descriptor.

dup2 will not help to do something in kernel, AFAIK.

手册页:splice(2) splice(2) vmsplice(2) sendfile(2) tee(2)

相关链接:

最佳答案

OpenBSD 实现 SO_SPLICE:

Linux 是否支持类似的东西或只有自己的内核模块是解决方案?

关于sockets - 两个 TCP 套接字之间基于内核的 (Linux) 数据中继,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17590816/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com