我正在尝试在同一台设备上打开发送器/接收器插槽,然后将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结果是巨大的!我认为套接字在设备上共享数据,永远不会去路由器。你有什么建议吗?
答案 0 :(得分:0)
默认情况下,Windows会生成路由,这些路由将路由到本地接口的数据包永远不会离开PC。
我遇到的唯一解决办法就是首先转到中间地址 - 请在此处查看我的问题:Win32 sockets - Forcing ip packets to leave physical interfaces when sending to other local interfaces
所以这就是你的工作 - 在无线适配器上创建第二个IP地址分配,创建一些路由表条目以强制数据包到达无线路由器,然后从一个本地地址发送到第二个本地地址。
例如,如果我的无线适配器的地址为192.168.1.100
和192.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.100
并发送至192.168.1.101
。您的接收方应绑定到192.168.1.101
。
发送和接收,它应该通过网络,而不是内核。
完成测试后,请删除路线:
route delete 192.168.1.101 mask 255.2555.255.255 192.168.1.1
取消分配额外的地址。
我知道这种方法有效,因为我每天都使用它,但要让它工作起来可能会很棘手。