У меня есть Java-приложение, которое создает сокет для взаимодействия с процессом сервера, например, новый java.net.Socket (String host, int port).Это приложение включает в себя кучу устаревшего кода на C ++, который должен собирать большие объемы данных с этого сервера и обрабатывать его.В настоящее время это реализуется благодаря тому, что собственный код создает собственный сокет и подключается к серверу, например:
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 с несколькими сетевыми картами (например, проводные и Wi-Fi или VPN-подключения) этидва сокета могут иметь разные локальные адреса.Похоже, что Java-код выбирает «лучший» интерфейс (проводной Gb enet = выше MTU?), Нативный (наивный?) Код получает интерфейс «по умолчанию» (вставьте в USB-устройство Wi-Fi, и он станет вашим по умолчанию - гадость).
Это вызывает у меня некоторые проблемы, я не думаю, что детали актуальны.Два вопроса:
Возможно ли мне повторно использовать java-сокет из кода JNI (переносимо? Предположим, Sun JDK).Это позволит полностью избежать этой проблемы, но пока я не вижу способа взаимодействия с java.net.Socket из JNI / нативного кода.
Поскольку ответ наПервый вопрос, вероятно, НЕТ, как Java создает этот сокет (выбирая интерфейс)?Фрагменты кода приветствуются.Я просмотрел материал openjdk и не нашел того, что искал.
Спасибо, Крис