2015-04-20 143 views
2

我的服務器應用程序使用POCO庫編寫的C++有一個奇怪的問題。它運行良好,幾天前剛剛停止工作。即使從2周前使用該exe文件也不起作用。無法連接到Windows上的本地服務器

的問題是,我無法連接到本地主機通過服務器,但另一些人從我的網絡之外可以連接沒有任何問題......

我測試過它在其他計算機和它的同,除了一臺電腦。 該問題僅在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; 
} 

在Chrome結果ERR_CONNECTION_ABORTED進入127.0.0.1:8080。 http://www.canyouseeme.org/報告它可以在端口8080上看到我的服務。

其他應用程序(不使用POCO我猜?)工作正常。

我完全不知道這個問題的原因是什麼...... 我會很感激任何意見。

+0

看起來像一個防火牆,間諜軟件(垃圾郵件代理)或DLL地獄問題。你是否嘗試在另一個端口上啓動?也許有些服務使用這個端口,但不是與http?你可以用網貓來測試它嗎?下載網貓並啓動nc -lp8080 ans另一個實例nc 127.0.0.1 8080.它們是否連接? –

+0

從另一個端口啓動並不能解決問題。沒有其他服務也不使用此端口。是的,他們連接:http://screenshooter.net/102449625/xdwtuqk – Woland

+0

本月的Windows更新可能引入了這個問題? –

回答

0

我試過你的例子。它看起來像正常的行爲。如果它曾經工作過,則不是很正常。難道是的,你已經更新了Chrome瀏覽器,或者之前是否使用過一些舊瀏覽器進行過測試

在該示例中,服務器正在發送數據並立即關閉連接。我假設,POCO應該有一個命令以更優雅的方式終止連接。

該示例似乎演示非常簡單,但不符合協議的服務器響應。嘗試使用HTTPRequestHandlerFactory。這樣服務器似乎不會在每次請求後終止連接。

Firefox顯示非常短「Hello World!」然後「連接中止」

ERR_CONNECTION_ABORTED在Chrome中意味着服務器可能意外關閉了連接。

捲曲顯示在大多數情況下:我已經添加

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前總是顯示:

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

但在某些罕見的情況下。因此取決於瀏覽器是否顯示內容的時間。

可能有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(); 
+0

那麼爲什麼這個錯誤只發生在本地網絡內部,並且從外部沒有問題?此外,我完整的代碼不會在一段時間後關閉連接仍然無法工作。 – Woland

+0

那麼,從外面的連接工作?你只提到了canyouseeme.org,它不能真正測試HTTP堆棧。你真的可以用另一臺電腦的瀏覽器連接嗎?你可以在本地計算機上嘗試'curl.exe -v'嗎?什麼是輸出? –

+0

我已經提到「來自我的網絡之外的其他人可以無任何問題地連接」:)是的,從外部訪問瀏覽器中的my.ip.address:8080就像魅力一樣。捲曲輸出:http://pastebin.com/ZHjsGwby – Woland

相關問題