программа прослушивает порт TCP, но в соединениях с этим портом отказано - PullRequest
0 голосов
/ 19 мая 2011

У меня есть простая программа, которую я разрабатываю для выполнения некоторых тестов пропускной способности на удаленных компьютерах, которые моя компания контролирует на наших клиентских сайтах. Одна копия программы отправляется на удаленный компьютер, и ей предлагается прослушивать указанный порт. Затем другой копии той же программы говорят подключиться к прослушивающему компьютеру, а затем отправить сериализованный объект с сообщением известной длины случайного содержания. Передача рассчитывается по времени, и результаты отправляются обратно на исходный компьютер.

Отлично работает через интерфейс обратной связи; отправляются две копии программы, одна прослушивает часть, другая подключается к тому же порту (общим способом) и отправляет данные. Однако, когда я перемещаю «удаленную» сторону этого теста на другую тестовую машину в той же интрасети, даже если программа говорит, что «прослушивает» свое соединение, порт не может быть подключен программой на моем компьютере разработчика. Я получаю стандартную ошибку «Невозможно установить соединение, поскольку целевая машина активно от него отказалась».

Между этими двумя компьютерами нет активных брандмауэров, включая брандмауэр 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);
    }

1 Ответ

2 голосов
/ 19 мая 2011

То, как вы играете роль вашего слушателя, немного не в порядке.Вам не нужно указывать Адрес , только порт.

...