2014-10-09 66 views
0

我已经实现了通过tcp套接字发送和接收数据的服务。现在我的机器上有两个网络接口,我应该通过两个网络运行这个服务。手动指定要发送数据的网络接口

如何指定要发送数据的网络接口? (使用Boost :: asio或传统的伯克利套接字,或通过使用系统调用来动态更改内核的路由表)

+1

如果你没有指定什么会发生什么? – egur 2014-10-09 12:53:44

+0

@egur对从特定子网发送的请求的响应将被发回到错误的子网。 – 2014-10-09 12:57:02

+0

这强烈暗示错误的网络配置。修复你的网络配置,你不需要明确指定。 monkeypatching路由表是btw。由于内核的缓冲,这不是一个选项。 – dom0 2014-10-09 13:01:44

回答

0

我不知道关于Boost,但一般情况下,如果你想发送/ recv使用特定的接口比你需要的bind()接口的IP地址,或者在某些平台上,你可以用setsockopt(SOL_SOCKET, SO_BINDTODEVICE)代替。

+0

这将只接收来自指定地址的连接。 – 2014-10-10 20:51:13

+0

为什么这会降低投票率?在特定网络上发送/接收TCP数据的**唯一方法是将TCP套接字绑定到特定的NIC /接口。在进行出站连接时,在调用connect()之前,必须调用bind()或setsockopt(SO_BINDTODEVICE)。在接受入站连接时,它会自动绑定到任何使用的NIC /接口来接受它。你可以''将一个监听套接字bind()'''setsockopt(SO_BINDTODEVICE)'绑定到特定的NIC /接口,或者你可以让它绑定到所有可用的NIC /接口,它会告诉你哪一个接受了每个连接。 – 2014-10-10 22:25:16

+0

我没有downvote,但'bind()'和'SO_BINDTODEVICE'不是同义词。当套接字bind()到一个特定的地址时,套接字将只接收指向该地址的数据包,并且传输的数据包将使用该地址作为它们的源地址。内核仍然可以通过不与地址关联的接口来路由数据包。另一方面,当套接字使用'SO_BINDTODEVICE'时,任何发送到套接字的数据都将从关联的接口发出,并且任何通过套接字接收的任何数据都将保证到达相关接口 。 – 2014-10-11 18:18:56