У меня есть простая программа, которую я разрабатываю для выполнения некоторых тестов пропускной способности на удаленных компьютерах, которые моя компания контролирует на наших клиентских сайтах. Одна копия программы отправляется на удаленный компьютер, и ей предлагается прослушивать указанный порт. Затем другой копии той же программы говорят подключиться к прослушивающему компьютеру, а затем отправить сериализованный объект с сообщением известной длины случайного содержания. Передача рассчитывается по времени, и результаты отправляются обратно на исходный компьютер.
Отлично работает через интерфейс обратной связи; отправляются две копии программы, одна прослушивает часть, другая подключается к тому же порту (общим способом) и отправляет данные. Однако, когда я перемещаю «удаленную» сторону этого теста на другую тестовую машину в той же интрасети, даже если программа говорит, что «прослушивает» свое соединение, порт не может быть подключен программой на моем компьютере разработчика. Я получаю стандартную ошибку «Невозможно установить соединение, поскольку целевая машина активно от него отказалась».
Между этими двумя компьютерами нет активных брандмауэров, включая брандмауэр Windows. Я могу создавать другие типы удаленных подключений, таких как VNC.
Вот соответствующие фрагменты кода:
Прослушивание соединения:
public void BeginListeningAsServer()
{
if (Listener != null) Listener.Stop();
if (ListenerThread != null) ListenerThread.Join();
Listener = new TcpListener(RemoteAddress, RemotePort);
Listener.Start();
Listening = true;
ListenerThread = new Thread(ListenForConnections);
ListenerThread.Start();
}
private void ListenForConnections()
{
while (Listening)
{
if (Listener.Pending())
Listener.BeginAcceptTcpClient(HandleIncomingClient, null);
}
}
private void HandleIncomingClient(IAsyncResult ar)
{
var client = Listener.EndAcceptTcpClient(ar);
var thread = new Thread(c => HandleIncomingClientMessage((TcpClient)c));
HandlerThreads.Add(thread);
Clients.Add(client);
thread.Start(client);
}
Подключение к этой программе прослушивания:
public void ConnectAsClient()
{
var client = new TcpClient();
client.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
client.Connect(RemoteAddress, RemotePort); //this line fails
Clients.Add(client);
}