在带有TCP套接字的网络编程(C& Linux)中,如何检查接收数据包的接口。我知道这可以通过SOCK_DGRAM和IP选项IP_PKTINFO轻松完成,但此选项不适用于SOCK_STREAM。在这种情况下(对于im编程)我必须知道接收数据包的接口(回馈服务器的响应取决于那个)。
我找到的一个可能的解决方案是使用SOCK_RAW和IPPROTO_TCP(使用SOCK_RAW我可以设置IP_PKTINFO选项)但这意味着我将接收到达机器的所有TCP流量并且我不会#39我想要那个。我想到的另一个可能的解决方案是根据路由表检查目标IP并从那里获取退出接口但是IPv6呢?如果命运IP其IPv6链接本地怎么办?
如果有人有其他解决方案或想法,我会很高兴看到它。提前致谢
答案 0 :(得分:1)
当您的TCP服务器接受客户端连接时,您将有一个代表连接的套接字,您可以在套接字上调用getsockname
,它将为您提供套接字上关联的地址,即IP地址你的身边。
下一步,您可以调用getifaddrs
来获取系统上的所有接口及其信息,包括名称(如eth0)和IP地址。此时,您可以使用之前通过getsockname
获得的IP搜索此列表,您可以获得所需的界面。
参考: