0

C# .NET 4.5 ビジュアル スタジオ 2010

これは、私のコードを校正するというよりも、思考練習です。

Windows でサービスとして実行される HTTP リスナーの開発に取り組んでいます。以下のコードを使用してスタンドアロンの Windows フォーム プロジェクトを作成しましたが、正常に動作します。リクエストが届くたびに、HTTP POST リクエストの本文を示すメッセージ ボックスを表示することができました。

問題は、バックグラウンド サービス DLL プロジェクトにコピーされた同じコードが、それに送信された HTTP 要求を「キャッチ」しないことです。Log.Write()これは、デバッグに使用するログ ファイルで明らかです (以下のコードのへの呼び出しを参照してください)。

私はこれをすべて同じ PC で実行しているので、問題はポートが使用されていること、または間違った IP を使用していることではないと思います。

バックグラウンド サービスであるため、または DLL であるため、HTTP リスナーが機能しないのではないかと考えています。

以下の 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);
    }

}
4

1 に答える 1

1

動作しました。サーバーをサービスとして実行すると、何らかの理由で、使用したかったポートが Windows ファイアウォールによってブロックされましたが、サーバーを Forms アプリケーションとして実行すると、ブロックされませんでした。このサービスには、ファイアウォール設定に例外がリストされていましたが、例外は特定の 1 つのポートでのみ通信を許可していました。私が使いたかったものではありません。

ポートでの通信を許可するために変更した設定は次のとおりです。

[コントロール パネル] > [Windows ファイアウォール] > [詳細設定] > [受信の規則] > (サービス名を右クリック) > [プロパティ] > [プロトコルとポート] タブ > [ローカル ポート] > そこに既にリストされているポートに 8000 を追加

于 2014-05-20T19:03:50.627 に答える