Sockets 两个TCP套接字之间基于内核(Linux)的数据中继
我编写了TCP中继服务器,它的工作原理类似于对等路由器(超级节点) 最简单的情况是两个打开的插座和它们之间的数据继电器: 客户端A服务器客户端B 然而,服务器必须服务大约2000个这样的A-B对,即4000个套接字 userland中有两种众所周知的数据流中继实现(基于socketA.recv()-->socketB.send()和socketB.recv()-->socketA.send()):Sockets 两个TCP套接字之间基于内核(Linux)的数据中继,sockets,tcp,kernel,splice,Sockets,Tcp,Kernel,Splice,我编写了TCP中继服务器,它的工作原理类似于对等路由器(超级节点) 最简单的情况是两个打开的插座和它们之间的数据继电器: 客户端A服务器客户端B 然而,服务器必须服务大约2000个这样的A-B对,即4000个套接字 userland中有两种众所周知的数据流中继实现(基于socketA.recv()-->socketB.send()和socketB.recv()-->socketA.send()): 使用选择/轮询功能(非阻塞方法) 使用螺纹/叉子(分块法) 我使用线程,所以在最坏的情况下,服
- 使用选择/轮询功能(非阻塞方法)
- 使用螺纹/叉子(分块法)
- 服务器已经定义了静态路由表(例如ID_A和ID_B-成对标识符)。客户端A连接到服务器并发送ID_A。然后服务器等待客户端B。当A和B配对(两个套接字都打开)时,服务器启动数据中继
- 客户端是对称NAT背后的简单设备,因此N2N协议或NAT遍历技术对它们来说太复杂了
- 发送文件
- 拼接
- (莱纳斯)
- relayd asiabsdcon2013/
- 描述了SP-MOD
- 描述了TCP拼接器
如果你绝对想使用线程,每个CPU核心使用一个线程来分散负载,但是如果你需要这样做,这意味着你正在以相似性、每个CPU插槽上的RAM位置等的速度进行游戏。。。扮演着重要的角色,在你的问题中似乎不是这样。因此,我假设在您的情况下,一个线程就足够了。对于这么多的连接,几个线程的组合可能是您应该研究的内容。您可以使用类似于“谢谢”的内容。然而,它仍然是用户区的主动中继。我认为存在一种被动的方法。服务器等待客户端ID,超时5秒,因此线程似乎是配对阶段的自然选择。很好的简短比较:。我只是在每个线程中使用了阻塞recv()。不过,为了限制线程,我可以在一个线程或FASYNC中使用epoll()。最好使用epolonneshot或ADD/DEL?喜欢这里还是?从未尝试过EPOLLONESHOT,尽管它可能很有用,也许是EPOLLET的优雅替代品。从标准的ADD/DEL开始,以限制我认为的复杂性,并在需要时尝试稍后进行优化。