В OS X при создании серверного сокета на определенном порту для всех интерфейсов новый серверный сокет может связываться с localhost
с тем же портом и принимать соединения. Я ожидаю, что привязка к localhost
потерпит неудачу, как это происходит при попытке сделать то же самое в Linux (в частности, я пробовал на Ubuntu).
Поведение в OS X мне кажется странным, потому что клиентские подключения к localhost
работают при прослушивании на всех интерфейсах, но новый сервер может привязать localhost
к тому же порту и принимать новые подключения вместо первого прослушивателя.
Как сокет может прослушивать все интерфейсы, а также предотвращать привязку других сокетов к localhost
с тем же портом в OS X?
Следующий тест проходит на Mac и не проходит на Ubuntu, но должен провалиться на обоих.
import org.junit.Assert;
import org.junit.Test;
import java.io.IOException;
import java.net.Inet4Address;
import java.net.ServerSocket;
public class MinimalTest {
@Test
public void listenOnAllInterfacesAndLocalhost() throws IOException {
final int port = 12340;
try (ServerSocket allInterfaces = new ServerSocket(port);
ServerSocket onlyLocalhost = new ServerSocket(port, 100, Inet4Address.getByName("localhost"));) {
Assert.assertEquals(allInterfaces.getLocalPort(), port);
Assert.assertEquals(onlyLocalhost.getLocalPort(), port);
Assert.assertTrue(allInterfaces.isBound());
Assert.assertTrue(onlyLocalhost.isBound());
}
}
}
Что я пробовал:
- Явно слушать на всех интерфейсах с помощью
Inet4Address.getByName("0.0.0.0")
илиInet6Address.getByName("::")
, но с этой спецификацией или без нее,lsof
показывает прослушивание на всех интерфейсах:*:12340
- Я поменял порядок привязки (сначала
localhost
, а потом все интерфейсы) и с привязкой из разных процессов, но OS X по-прежнему разрешает привязку. - Я искал похожую проблему, но не нашел этой проблемы... Привязка ко всем интерфейсам одного сетевого интерфейса привязка нескольких интерфейсов к одному и тому же порту Могу ли я привязать несколько серверов к один и тот же TCP-порт? Могут ли сокет-клиент и сервер на одном компьютере связываться с одним и тем же портом?