服务器和客户机在同一台机器上,没有环回

问题描述:

我在同一台机器(linux)上运行一台服务器和一台客户机。 如何强制数据包通过网络(交换机)而不是通过环回?服务器和客户机在同一台机器上,没有环回

感谢,

迈克尔

+0

您是通过主机名解决吗?不确定,但也许提供非回送IP地址就够了? – RedX

+0

检查了。这不够。 – Michael

也许你应该尝试通过代理服务器连接?

+0

我想检查没有代理的往返延迟 – Michael

既然你在编程网站上提出这个问题,我会假设你有源代码。

当您创建客户端套接字时,可以将其限制为特定的接口。通常你不会(你只需要先拨connect()而不用bind()),并让操作系统找出最好的出接口,但这不是强制性的。

+0

您确定它在客户端? – Michael

+1

那么,客户端启动连接,所以这是你必须选择的地方。服务器可能决定只侦听物理端口,但这只是表示如果客户端尝试通过环回进行连接,则服务器无法访问。 – MSalters

+0

您可以更具体地了解要更改哪个参数吗?我使用addrinfo结构和getaddrinfo函数 – Michael

你不能,除非你的网络上有一些设备将其数据发回给你。通常情况下,没有什么会这样做的。如果您将数据发送到网络上,则无法恢复。

如果您已经设置了某些内容以将数据返回给您,请将数据发送到该数据,并遵循所支持的任何机制。

您可以尝试在客户端和服务器套接字上设置SO_BINDTODEVICE套接字选项,并将外部NIC接口作为参数。

参见:http://codingrelic.geekhold.com/2009/10/code-snippet-sobindtodevice.html为例

我不知道这是不够的 - 有可能是在内核IP协议栈完整性检查丢弃报文的以太网目的地和来源都是你的。可能有一个sysctl来禁用这个检查,或者你可以编译你自己的内核,而不用检查这个特定的测试。

+0

我试过了。它拒绝连接,当我设置这个setsockopt – Michael

+0

请参阅我的答案的其余部分关于Linux内核IP堆栈安全机制丢弃您的数据包和如何处理它... :-) – gby