我有一个奇怪的问题,用C ++编写的服务器应用程序使用POCO库。 它工作得很好,几天前刚刚停止工作。 即使从2个星期前使用该exe文件不起作用。
问题是,我无法通过本地主机连接到服务器,但其他人从我的networking外可以连接没有任何问题…
我已经在其他计算机上testing过,除了一台计算机之外,它是一样的。 该问题只存在于Windows上。 我已经在Linux上testing过,并且工作正常。
这个问题也复制了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; }
在Chrome中input127.0.0.1:8080会导致ERR_CONNECTION_ABORTED。 http://www.canyouseeme.org/报告它可以在端口8080上看到我的服务。
其他应用程序(不使用POCO我猜?)工作正常。
我完全不知道这个问题的原因是什么…我会很感激任何意见。
我试过你的例子。 它看起来像正常的行为。 如果它曾经工作,而不是正常的。 难道是的,你已经更新了Chrome浏览器或测试过,如果之前用一些旧的浏览器?
在这个例子中,服务器正在发送数据并立即关闭连接。 我认为,POCO应该有一个命令,以更优雅的方式终止连接。
这个例子似乎很简单,但不是协议一致的服务器响应。 尝试使用HTTPRequestHandlerFactory。 这样服务器似乎不会在每次请求后终止连接。
Firefox显示非常短的“Hello World!” 然后“连接中止”
Chrome中的ERR_CONNECTION_ABORTED
意味着服务器可能意外关闭了连接。
卷曲显示在大多数情况下:
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
在flush
后添加了Sleep(100)
之后,在Recv failure
之前始终显示html内容。 所以根据时间的不同,浏览器会显示或不显示内容。
可能是在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();