Mac OS X — привязать порт сокета сервера ко всем интерфейсам и предотвратить другие привязки с тем же портом

В 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());
        }
    }
}

Что я пробовал:


person Comnir    schedule 24.10.2020    source источник