Не удается подключиться к локальному серверу в Windows

У меня странная проблема с моим серверным приложением, написанным на C ++ с использованием библиотек POCO. Он работал нормально и просто перестал работать несколько дней назад. Даже при использовании exe, выпущенного 2 недели назад, он не работает.

Проблема в том, что я не могу подключиться к серверу через localhost, но другие люди за пределами моей сети могут подключиться без каких-либо проблем ...

Я тестировал его на других компьютерах, и он такой же, за исключением одного компьютера. Проблема существует только в Windows. Я тестировал Linux, и он работал нормально.

Проблема также воспроизводится в коде учебника POCO из http://pocoproject.org/slides/200-Network.pdf:

#include "Poco/Net/ServerSocket.h"
#include "Poco/Net/StreamSocket.h"
#include "Poco/Net/SocketStream.h"
#include "Poco/Net/SocketAddress.h"
int main(int argc, char** argv)
{
    Poco::Net::ServerSocket srv(8080); // does bind + listen
    for (;;)
    {
        Poco::Net::StreamSocket ss = srv.acceptConnection();
        Poco::Net::SocketStream str(ss);
        str << "HTTP/1.0 200 OK\r\n"
        "Content-Type: text/html\r\n"
        "\r\n"
        "<html><head><title>My 1st Web Server</title></head>"
        "<body><h1>Hello, world!</h1></body></html>"
        << std::flush;
    }
    return 0;
}

Ввод 127.0.0.1:8080 в Chrome приводит к ERR_CONNECTION_ABORTED. http://www.canyouseeme.org/ сообщает, что он может видеть мою службу на порту 8080.

Другие приложения (не использующие POCO, я полагаю?) Работают нормально.

Совершенно не знаю, в чем причина этой проблемы ... Буду признателен за любые советы.


person Woland    schedule 20.04.2015    source источник
comment
Похоже на брандмауэр, шпионское ПО (спам-прокси) или dll-hell проблема. Вы пробовали запустить на другом порту? может какая-то служба использует этот порт, но не с http? Можете ли вы проверить это с помощью net cat? загрузите net cat и запустите nc -lp8080 и другой экземпляр nc 127.0.0.1 8080. Они подключаются?   -  person Valentin Heinitz    schedule 21.04.2015
comment
Запуск на другом порту не решает проблемы. Никакая другая служба также не использует этот порт. Да, они подключаются: screenshooter.net/102449625/xdwtuqk   -  person Woland    schedule 21.04.2015
comment
Может быть, проблема возникла из-за обновлений Windows в этом месяце?   -  person Harry Johnston    schedule 21.04.2015
comment
Это было мое первое подозрение, хотя я создал виртуальную машину с чистой установкой Windows 7, и проблема все еще возникает.   -  person Woland    schedule 21.04.2015
comment
@ValentinHeinitz Я тоже не думаю, что это проблема dll-hell. Я связал сервер со статическими библиотеками (exe полагается только на kernel32, advapi32, ihlpapi и ws2_32), но проблема все еще возникает.   -  person Woland    schedule 21.04.2015
comment
Как canyouseeme открыть свой местный порт? Включили ли вы переадресацию портов в своем маршрутизаторе или машина напрямую подключена к Интернету? Что произойдет, если вы подключите этот порт к сети? Это подключается? Я имею в виду, это проблема TCP или HTTP? Если нет, то, вероятно, брандмауэр только подделывает открытый порт для внешних машин для предотвращения сканирования портов. В качестве другой идеи, не могли бы вы запустить свое приложение при профилировании dependency walker? Есть ли неожиданные сбои при загрузке DLL? Можете ли вы включить дополнительные журналы в POCO или использовать отладчик?   -  person Valentin Heinitz    schedule 22.04.2015
comment
Все порты перенаправлены на мой компьютер. В примере кода netcat подключается к порту и получает hello world. Но в реальном приложении он не подключается. Когда я запускаю его под профилированием dependency walker, он вылетает, и я не могу прикрепить к нему отладчик. Вот результат: pastebin.com/Bc5MHKKL   -  person Woland    schedule 22.04.2015


Ответы (1)


Я пробовал твой пример. Похоже на нормальное поведение. Если раньше работало, то скорее ненормально. Может быть, вы обновили Chrome или уже тестировали его с каким-то старым браузером?

В этом примере сервер отправляет данные и мгновенно закрывает соединение. Я предполагаю, что в POCO должна быть команда, чтобы завершить соединение более изящным способом.

Этот пример, кажется, демонстрирует очень простой, но не соответствующий протоколу ответ сервера. Попробуйте использовать HTTPRequestHandlerFactory. Таким образом, кажется, что сервер не разрывает соединение после каждого запроса.

Firefox показывает очень короткое сообщение «Привет, мир!», а затем «Соединение прервано».

ERR_CONNECTION_ABORTED в Chrome, вероятно, также означает, что сервер неожиданно закрыл соединение.

curl в большинстве случаев показывает:

C:\bin>curl.exe http://localhost:8080
curl: (56) Recv failure: Connection was reset

Но в некоторых редких случаях:

C:\bin>curl.exe http://localhost:8080
<html><head><title>My 1st Web Server</title></head><body><h1>Hello, world!</h1></body></html>

curl: (56) Recv failure: Connection was reset

После того, как я добавил Sleep(100) после flush, содержимое html всегда отображается перед Recv failure. Таким образом, в зависимости от времени контент отображается браузером или нет.

Может быть, есть подсказка о другом поведении в Linux:

void HTTPServerConnection::onServerStopped(const bool& abortCurrent)
{
    _stopped = true;
    if (abortCurrent)
    {
        try
        {
            // Note: On Windows, select() will not return if one of its socket is being
            // shut down. Therefore we have to call close(), which works better.
            // On other platforms, we do the more graceful thing.
#if defined(_WIN32)
            socket().close();
#else
            socket().shutdown();
person Valentin Heinitz    schedule 21.04.2015
comment
Тогда почему эта ошибка возникает только внутри локальной сети и нет никаких проблем извне? Кроме того, мой полный код, который не закрывает соединение через некоторое время, все еще не работает. - person Woland; 22.04.2015
comment
Итак, подключение извне работает? Вы упомянули только canyouseeme.org, который действительно не может протестировать стек HTTP. Вы действительно можете подключиться к браузеру с другого компьютера? Не могли бы вы попробовать curl.exe -v на локальном компьютере? Что на выходе? - person Valentin Heinitz; 22.04.2015
comment
Я уже упоминал, что другие люди вне моей сети могут подключиться без проблем :) Да, доступ к my.ip.address: 8080 в браузере извне работает как шарм. Вывод Curl: pastebin.com/ZHjsGwby - person Woland; 22.04.2015
comment
Странно, сегодня у меня серверное приложение работает ... Впрочем, ничего не менял. - person Woland; 23.04.2015