簡體   English   中英

為什么Socket.BeginAccept()在我的后台服務DLL項目中不起作用?

[英]Why does Socket.BeginAccept() not work in my background service DLL project?

C#.NET 4.5 Visual Studio 2010

與證明我的代碼相比,這更多的是思想練習。

我正在開發在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);
    }

}

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

這是我更改為允許在我的端口上進行通信的設置:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM