Я пишу очень простой .NET TCP Server
и очень простой TCP Client
, которые должны работать на одном компьютере (Windows 10 Home PC) и соединяться друг с другом (только для целей тестирования). На сервере я жду соединения следующим образом:
public static void StartListening()
{
string hostname = Dns.GetHostName();
IPHostEntry ipHostInfo = Dns.GetHostEntry(hostname);
IPAddress ipAddress = ipHostInfo.AddressList[0];
IPEndPoint localEndPoint = new IPEndPoint(ipAddress, Properties.Settings.Default.Port);
Socket listener = new Socket(
ipAddress.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
try
{
listener.Bind(localEndPoint);
listener.Listen(Properties.Settings.Default.Port);
while (true)
{
allDone.Reset();
Console.WriteLine("Waiting for a connection...");
listener.BeginAccept(
new AsyncCallback(AcceptCallback),
listener);
allDone.WaitOne();
}
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
}
Console.WriteLine("\nPress ENTER to continue...");
Console.Read();
}
public static void AcceptCallback(IAsyncResult ar)
{
allDone.Set();
Socket listener = (Socket)ar.AsyncState;
Socket handler = listener.EndAccept(ar);
StateObject state = new StateObject();
state.workSocket = handler;
handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,
new AsyncCallback(ReadCallback), state);
var frames = Directory.EnumerateFiles(Properties.Settings.Default.FramesPath);
foreach (string filename in frames)
{
Console.Write("Sending frame: {}...", filename);
SendFile(handler, filename);
Thread.Sleep(Properties.Settings.Default.FrameDelay);
}
}
В клиенте я создаю соединение таким образом:
private void startClient(string host, int port)
{
IPEndPoint serverEndPoint = new IPEndPoint(IPAddress.Parse(host), port);
ClientTCP = new TcpClient();
ClientTCP.Connect(serverEndPoint);
Reader = new StreamReader(ClientTCP.GetStream());
Listen = true;
listner = Listener();
}
startClient
называетсятаким образом.
startClient(txtAddr.Text, (int)int.Parse(txtPort.Text));
Когда я запускаю переменную клиента host
для текущего имени машины (то же самое, что сервер извлекает через Dns.GetHostName()
Я получил это исключение:
Указан неверный IP-адрес.
Я попытался использовать 127.0.0.1 и получил:
Соединение не может быть установлено. отклонение целевого компьютера 127.0.0.1:5002
Я пытался с localhost , и я получил
Указан неверный IP-адрес
снова. Я попытался с IP-адресом, назначенным для WiFi, и я получил снова
Не удалось установить соединение. Постоянное отклонение целевого компьютера 192.168.10.11:5002
Я уверен, что компьютерная сеть работает, так как я использую ее для многих других вещейвключая подключение к локальным службам TCP, и я уверен, что и клиентский, и серверный код работает, поскольку на другом ПК я могу подключить их, задав localhost в качестве значения переменной клиента host
. Почему я не могу использовать петлевые соединения в своем коде?
Где произошел сбой?
PS Я разрешил соединение с двоичным файлом сервера в правилах брандмауэра Windows, я также разрешил исходящее соединение для двоичного файла клиентатакже.
Для тех, кто хочет проверить код сервера, вот он:
Код сервера