我有一个Java应用程序,它创建一个socket与服务器进程通信,例如:new java.net.Socket(String host,int port)。这个应用还包括一堆遗留的C++代码,需要从该服务器中提取大量数据并进行处理。目前实现方式是通过本地代码创建自己的socket并连接到服务器,例如:
sock = socket(AF_INET, SOCK_STREAM, 0);
struct hostent* hp = gethostbyname(host);
if (!hp)
{
unsigned long addr = inet_addr(host);
hp = gethostbyaddr((char *)&addr, sizeof(addr), AF_INET);
}
struct sockaddr_in name;
name.sin_family = AF_INET;
memcpy(&name.sin_addr, hp->h_addr, hp->h_length);
name.sin_port = htons(port);
connect(sock, (sockaddr*)&name, sizeof(name));
在具有多个网络接口的Windows vista/7机器上(例如有线和WiFi或VPN连接),这两个套接字可能会得到不同的本地地址。Java代码似乎选择了一个“更好”的接口(有线Gb enet = 更高的MTU?),而原生代码则获得了“默认”接口(插入一个USB WiFi设备,它就成为您的默认选项 - 很糟糕)。这对我造成了一些问题,我认为细节并不重要。有两个问题:
1. 是否可以从JNI代码中重新使用Java Socket(可移植?假设使用Sun JDK)。这将完全避免此问题,但迄今为止,我没有看到任何与 java.net.Socket 相关的 JNI/native 代码互操作方法。 2. 鉴于第一个问题的答案可能是否定的,Java是如何创建该套接字(选择接口)的?代码片段受欢迎。我已经在 openjdk 中查找过,但没有找到我要找的内容。
谢谢, Chris