Не удалось установить соединение, потому что целевая машина активно отказывалась от него — используя Socket или TcpClient.

У многих людей такая же проблема, но реализация у всех разная.

Мне нужна помощь с моей реализацией.

void sendUsingTcp() 
{
    try 
    {
        Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse(172.16.8.200), 8000);
        sock.Connect(endPoint);
        // code past this never hits because the line above fails
    } 
    catch (SocketException err) 
    {
        MessageBox.Show(err.Message);
    }
}

Я также пробовал TCP-клиент напрямую с теми же результатами ошибок:

void sendUsingTcp() 
{
    try 
    {
        using (TcpClient client = new TcpClient()) 
        {
            IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse(172.16.8.200), 8000);
            client.Connect(endPoint);
            // code past this never hits because the line above fails
        }
    } 
    catch (SocketException err) 
    {
        MessageBox.Show(err.Message);
    }
}

IP-адрес моего компьютера 172.16.11.144.


person jp2code    schedule 12.11.2010    source источник
comment
Похоже, что ничего не прослушивается на порту 8000 из 172.16.8.200. Вы действительно запустили там серверный процесс?   -  person Frédéric Hamidi    schedule 12.11.2010
comment
Можете ли вы подключиться по телнету к 172.16.8.200 через порт 8000?   -  person George Johnston    schedule 12.11.2010
comment
> telnet 172.16.8.200 <CR> приводит к тому, что я получаю запрос на вход в систему. Это почему мой код терпит неудачу? Потому что у меня нет учетных данных для входа?   -  person jp2code    schedule 12.11.2010
comment
В противном случае информация о том, как именно подключиться к порту 8000, будет полезна.   -  person jp2code    schedule 12.11.2010
comment
Если я правильно понимаю telnet, это является TCP-соединением. Вам понадобится один, чтобы машина назначения ответила на запрос входа в систему. Из вашего вопроса следует, что происходит то, что это даже не начинается. Telnet, вероятно, выдал бы сопливое сообщение об ошибке, если бы нашел то же самое.   -  person Tom W    schedule 13.11.2010
comment
Ссылки AcpMessenger.AcpMessage   -  person jp2code    schedule 26.06.2014


Ответы (5)


i) вполне возможно, что порт 8000 используется для чего-то другого. Выберите другой (большой) номер и посмотрите, произойдет ли то же самое. ii) используйте петлевой адрес для подключения к вашей собственной машине — IPAddress.Loopback

person Tom W    schedule 12.11.2010
comment
Том, мое приложение установлено примерно на 50 разных компьютерах на работе, и все они пытаются связаться с одним и тем же сервером через порт 8000. Может ли это быть причиной проблемы? И если да, то как мне это исправить? - person jp2code; 12.11.2010
comment
Ах. Я неправильно понял вашу первоначальную проблему. У меня небольшой опыт использования TCP-соединений .Net. Вы можете изменить код сервера? Я предполагаю, что вы используете TCPListener для получения соединений; когда это запустится, попробуйте вызвать Start(int), чтобы явно указать максимальное количество разрешенных соединений. - person Tom W; 12.11.2010
comment
Проклятые перегрузки. Если код компилируется и хорошо работает в тестовом сценарии, я никогда не задумываюсь об альтернативных реализациях. Отмечено как ответ. - person jp2code; 15.11.2010
comment
Из любопытства, вы подтвердили решение проблемы? То есть проверка того, что он не делает то, что вы хотели, из-за вышеизложенного, и его изменение устраняет проблему? Я был бы слегка удивлен, если бы это было так, потому что я бы (наивно) предположил, что поведение по умолчанию (т.е. перегрузка без параметров, которую вы использовали) будет продолжать принимать новые соединения до тех пор, пока хост-компьютер не взорвется. - person Tom W; 17.11.2010
comment
Нет, это не так. Однако я отмечу самый полезный ответ как свой ответ, если никогда не получу решение. Это побуждает других предлагать предложения. - person jp2code; 27.12.2010

Для меня оказалось, что мой Сервер прослушивал входящие подключения только с одного и того же IP. Мне пришлось изменить код для прослушивания с любого IP.

До и неправильно:

IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse(172.16.8.200), 8000);

После с исправленной проблемой:

IPEndPoint endPoint = new IPEndPoint(IPAddress.Any, 8000);
person Rafael Emshoff    schedule 02.12.2015

Вы проверили, открыт ли порт 8000 на удаленной машине? Если это так, это может быть проблема с брандмауэром или даже с сетью. Более подробная информация о том, что работает на удаленной машине, поможет.

person James    schedule 12.11.2010
comment
Я как раз собирался спросить, что прослушивает порт 8000 на целевой машине. - person Pharabus; 12.11.2010
comment
У меня есть приложение, которое я написал на сервере 172.16.8.200, которое активно прослушивает порт 8000. Если вы знаете, как это проверить, я хотел бы знать. - person jp2code; 12.11.2010
comment
cmd netstat -anb Вот как вы это проверяете. - person Adam; 09.06.2015

Обычно проблема в том, что порт закрыт. С другой стороны ничего не слушает.

person d.popov    schedule 20.08.2013

Не уверен, что на этот вопрос когда-либо был дан правильный ответ, НО вы не можете использовать TCPClient для настройки прослушивателя - вам нужен класс TCPListener - https://docs.microsoft.com/en-us/dotnet/api/system.net.sockets.tcplistener?redirectedfrom=MSDN&view=netframework-4.7.2

В противном случае вы просто получите исключение при сбое рукопожатия TCP.

person Ken Tola    schedule 26.11.2018
comment
Спасибо, Кен. TCPListener был установлен на сервере. Вопрос 7-летней давности. Я даже больше не работаю в этой компании. :) - person jp2code; 26.11.2018