2

我正在尝试在同一设备上打开一个发送方/接收方套接字并向路由器发送一个 64k 数据包,然后将其接收回来。关键是数据包应该通过路由器。因此,我将能够告诉用户有关他本地 wifi 速度的信息。这是我测试的:

    InetAddress addr = InetAddress.getLocalHost();
    datagramSocket = new DatagramSocket(SERVER_PORT, addr);
    serverPacket = new DatagramPacket(data, MAX_BUFFER_SIZE, addr, CLIENT_PORT);

    DatagramSocket clientSocket = new DatagramSocket(CLIENT_PORT, inetAddress);
    DatagramPacket packet = new DatagramPacket(data, MAX_BUFFER_SIZE);
    packet.setPort(SERVER_PORT);

    datagramSocket.send(serverPacket);
    clientSocket.receive(packet);
    clientSocket.send(packet);
    datagramSocket.receive(serverPacket);

正如我所说的数据是 64k 字节。然而上述操作在 2 毫秒内完成!所以当我计算 totalPacketSize / elapsedTime 结果是巨大的!我认为套接字在设备上共享数据,永远不会去路由器。你有什么建议吗?

4

1 回答 1

0

默认情况下,windows 会生成路由,这些路由会将发往本地接口的数据包路由到永远不会离开 PC。

我不得不处理的唯一解决方案是首先路由到中间地址 - 请在这里查看我的问题:Win32 sockets - Forcing ip packet to leave physical interfaces when sent to other local interfaces

所以这就是你要做的——在你的无线适配器上创建第二个 IP 地址分配,创建一些路由表条目来强制数据包到达无线路由器,然后从一个本地地址发送到第二个本地地址。

例如,如果我的无线适配器有地址192.168.1.100192.168.1.101,而我的路由器是192.168.1.1,那么我将在您的 Windows 路由表中创建以下路由:

route add 192.168.1.101 mask 255.255.255.255 192.168.1.1

然后您的发送方套接字应该bind()发送192.168.1.100192.168.1.101. 您的接收器应该绑定到192.168.1.101.

发送和接收,它应该通过网络而不是内核。

完成测试后,删除路线:

route delete 192.168.1.101 mask 255.2555.255.255 192.168.1.1

并取消分配额外的地址。

我知道这种方法有效,因为我每天都在使用它,但要让它发挥作用可能会很棘手。

于 2014-07-01T21:54:35.803 回答