#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.