Не удалось установить TCP-соединение с сервером macOS-BigSur TCP

#c# #macos #networking #.net-core #tcplistener

Вопрос:

Я пытаюсь установить TCP-клиент-серверное соединение между моими локально подключенными компьютерами (MacBook-BigSur является работающим сервером, в то время как ноутбук с Windows 10 выступает в качестве клиента). Для этого я использую код Visual Studio для запуска обоих приложений следующим образом:

На macOS:

 Console.WriteLine("Starting build agent...");

var listener = new TcpListener(IPAddress.Parse("127.0.0.1"), 12345);
Console.WriteLine("Build agent Started ");
listener.Start();

while (true)
{
    var fileName = $"s-{DateTime.Now.Ticks}.tar.gz";
    using (var client = listener.AcceptTcpClient())
    using (var stream = client.GetStream())
    using (var output = File.Create(fileName))
    {
        Console.WriteLine("Client connected. Starting to receive the file...");

        // read the file in chunks of 1KB
        var buffer = new byte[1024];
        int bytesRead;
        while ((bytesRead = stream.Read(buffer, 0, buffer.Length)) > 0)
        {
            output.Write(buffer, 0, bytesRead);
        }

        Console.WriteLine("Client connected. File received successfuly.");

        Console.WriteLine(Execute($"tar -xvf '{fileName}'"));
    }

}
 

На Окнах:

     var client = new TcpClient("192.168.0.109", 12345);
    Byte[] data = File.ReadAllBytes(@"D:sharedfile.tar.gz");
    NetworkStream stream = client.GetStream();
    stream.Write(data, 0, data.Length);
    Console.WriteLine("data sent.");
 

Однако, когда клиент Windows пытается установить соединение, он не может сказать:

 System.Net.Internals.SocketExceptionFactory.ExtendedSocketException: 'No connection could be made because the target machine actively refused it. 192.168.0.109:12345'
 

Обратите внимание, что после запуска сервера я вижу, что Visual Studio использует порт 12345, проверив его с помощью sudo lsof -i :123456 терминала. Кроме того, мое устройство Mac использует порт 192.168.0.109 , брандмауэр отключен, и я могу проверить его с помощью командной строки Windows.

Комментарии:

1. Я не знаю C#, но не стал бы new TcpListener(IPAddress.Loopback, 12345) просто слушать только адрес обратной связи, а не 192.168.0.109?

2. Спасибо @GordonDavisson, это была ошибка копирования и вставки. На самом деле, я использую IPAddress.Parse("127.0.0.1") то, что прослушивает адрес локального хоста, я обновил детали вопроса.

3. 127.0.0.1 является локальным хостом, что по определению означает, что сервер доступен только на одном хосте. Если вы хотите, чтобы сервер прослушивал все интерфейсы, не указывайте IP-адрес и не используйте 0.0.0.0 его .

4. @Роберт, пожалуйста, опубликуйте ответ, чтобы отметить его как действительный

Ответ №1:

127.0.0.1 является локальным хостом, что по определению означает, что сервер доступен только на одном хосте.

Если вы хотите, чтобы сервер прослушивал все интерфейсы, не указывайте IPAddress.Any соответственно IPAddress.IPv6Any или используйте 0.0.0.0.