2014-05-19 16 views
0

C#.NET 4.5 Visual Studio 2010爲什麼Socket.BeginAccept()在我的後臺服務DLL項目中不起作用?

這更像是一個思維練習,而不是證明我的代碼。

我正在開發一個作爲Windows服務運行的HTTP偵聽器。我使用下面的代碼製作了一個獨立的Windows Forms項目,它工作正常。每次請求進入時,我都能夠顯示一個消息框,顯示HTTP POST請求的主體。

問題是,將相同的代碼複製到後臺服務DLL項目時,不會「捕捉」發送給它的HTTP請求。這在我用來調試的日誌文件中很明顯(請參閱下面代碼中對Log.Write()的調用)。

我在同一臺PC上運行這一切,所以我不認爲問題是端口正在使用,或者我使用了錯誤的IP。

我在想,如果HTTP偵聽器不工作,因爲它是後臺服務,或者可能是因爲它是一個DLL。

出於安全原因,下面的IP地址更改爲1.2.3.4。

class http_listener 
{ 

    bool _stop; 

    main() 
    { 
     _stop = false; 

     // start ListenForEvents() in new thread 
     // [code omitted] 
    } 

    private void ListenForEvents(object o) 
    { 
     Socket _socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
     System.Net.IPAddress ipAddress = System.Net.IPAddress.Parse("1.2.3.4"); 
     System.Net.EndPoint endPoint = new System.Net.IPEndPoint(ipAddress, 8000); 
     _socket.Bind(endPoint); 
     _socket.Listen(1000); 

     while (!_stop) 
     { 
      Log.Write("this IS written to log every 2 seconds"); 
      Thread.Sleep(2000); 
      _recvBufSize = 1000; // max bytes to recieve 
      _begAcceptResult = _socket.BeginAccept(null, _recvBufSize, new AsyncCallback(RequestCallback), _socket); 
     } 
     _eventListenerThread = null; 
    } 



    private void RequestCallback(IAsyncResult begAcceptResult) 
    { 
     Log.Write("this is NOT written to log"); 
     Socket socket = (Socket)begAcceptResult.AsyncState; 
     byte[] buf; 
     int bytesTransferred; 
     Socket endSocket = socket.EndAccept(out buf, out bytesTransferred, begAcceptResult); 
     string stringTransferred = Encoding.ASCII.GetString(buf, 0, bytesTransferred); 
     Log.Write(stringTransferred); 
    } 

} 

回答

0

得到它的工作。出於某種原因,當我將服務器作爲服務運行時,我想使用的端口被Windows防火牆阻止,但是當我將服務器作爲Forms應用程序運行時,它並未阻止它。該服務在防火牆設置中列出了一個例外,但該例外只允許在一個特定端口上進行通信;不是我想用的那個。

這是我改變,讓我的端口上連接的設定:

控制面板> Windows防火牆>高級設置>入站規則>(右鍵點擊服務名稱)>屬性>「協議和端口」選項卡>本地端口>將8000添加到已經列出的端口

相關問題