Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets 使用TUN/TAP读取传入数据,封装为UDP并传输_Sockets_Networking_Network Programming_Udp_Tunnel - Fatal编程技术网

Sockets 使用TUN/TAP读取传入数据,封装为UDP并传输

Sockets 使用TUN/TAP读取传入数据,封装为UDP并传输,sockets,networking,network-programming,udp,tunnel,Sockets,Networking,Network Programming,Udp,Tunnel,我有一个tun/tap设备,用于从一个接口读取传入的数据包,并通过另一个接口将其作为UDP数据包发送。我可以实现这一点,可以读取发送到tun/tap接口的ICMP pakcets,还可以使用UDP远程获取它们。但是,当我尝试将输入接口的默认网关更改为tun/tap设备,以便可以从tun/tap读取所有传入数据时,就会出现问题。完成后,我无法发送UDP数据包,因为路由不正确 我还尝试在socket comm中为您提供“SO_BINDTODEVICE”选项,但仍然不起作用。请注意,我没有在tun/t

我有一个tun/tap设备,用于从一个接口读取传入的数据包,并通过另一个接口将其作为UDP数据包发送。我可以实现这一点,可以读取发送到tun/tap接口的ICMP pakcets,还可以使用UDP远程获取它们。但是,当我尝试将输入接口的默认网关更改为tun/tap设备,以便可以从tun/tap读取所有传入数据时,就会出现问题。完成后,我无法发送UDP数据包,因为路由不正确

我还尝试在socket comm中为您提供“SO_BINDTODEVICE”选项,但仍然不起作用。请注意,我没有在tun/tap中使用write()方法。我只是使用read()函数,收集数据并通过UDP套接字通信发送

请让我知道,如果我的方法是错误的或任何其他工作来克服这一点。谢谢

/********More Details********/
谢谢你,罗布

我试图实现的是在高延迟信道中模拟基于IP的报头通信(ROHC)

为此,我有4个虚拟机。VM1是一台普通的台式机。VM2是一个网关,它使用tun/tap(来自VM1)接收数据包,并与VM4进行基于UDP的通信。VM3是可以设置延迟、错误率等参数的通道。VM4已连接到WAN。VM1中的用户应该能够像平常一样浏览WAN。请查看下面的图表

  IP Packets
  |
  |   +------------------+     +--------------+   +----------------+
  '---|eth1.....         |     |              |   |                |
      |        |         |     |              |   |                |
      |    tun/tap       |     |          eth0|___|UDP Sock    eth0|___
      |        |         |     |              |   |    |       |   |   |
      |        ..UDP Sock|_____|eth1          |   |    |       |   |   |
      |                  |     |              |   |    +tun/tap+   |   '
      +------------------+     +--------------+   +----------------+  WAN
             VM2                 VM3(Channel)             VM4
更新:

谢谢你,汤米。你的解决方案奏效了。我可以通过一种方式将UDP数据包发送到最终的NAT网关。但直到现在我才找到相反的工作方式。 我尝试使用iptables启用伪装,并在VM1上设置到tuntap的主机路由,但它不起作用。 关于这一点,我有一些疑问。 1) 在VM4中,我接收UDP数据并写入tun/tap。这将由内核路由到WAN。但是对于传入的数据包,我是否需要再次使用tun/tap进行读取?在这种情况下,我需要在不同的线程中进行读写吗?我这样问是因为我需要将它们也作为UDP数据传输回来。如果我遗漏了什么,请告诉我。
再次感谢您的帮助。

您的udp数据包也将被路由到tuntap接口。(根据某些设置,它们可能会被丢弃)。您需要为要发送到的udp对等方添加路由规则、主机规则或较小的网络规则,这些规则不会干扰您的其他通信。

欢迎使用堆栈溢出。你在描述你的尝试方面做得很好。你能告诉我们你想完成什么吗?你想写的程序的功能是什么?我怀疑您选择的设计不允许您的程序执行您最初的计划。请编辑您的问题,并将您的课程总体目标添加到问题的底部。谢谢Tommi。我会尝试这种方式,并让你知道。现在我知道你正在努力实现什么。几句额外的建议:记住给VM4 eth0添加一个伪装规则,使用VM1 IP和tun/tap接口给VM4添加一个类似的主机规则,对于vm2,它的eth1和eth2网络都在路由表中就足够了(网络掩码不是默认的),然后您确实可以设置到tun/tap设备的默认路由,这样,到vm3的udp数据包和使用vm1的隧道通信将找到它们的路由。我已经做了很多类似的事情,请随意询问它是否有效。我也可能忽略了什么。嗨,汤米。请看上面的更新,因为我无法在这里的评论部分写下全部内容。谢谢。嗨,Tommi,提醒一下,以防你错过了之前的评论。您能告诉我在不同线程中实现tun/tap的读写功能是否有意义吗?谢谢。嗨,汤米,我终于可以让它工作了。正如你所说,VM4的路线指向第一个tun tap是正确的。这对我不起作用,因为所有这些接口之间都存在路由问题。现在这是固定的,它的工作良好。对于需要线程的第二个查询,我使用select()函数调用多路复用读写请求。我从[link]和David Brini的simple tun程序中获得了这个想法。再次感谢您的帮助:-)