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);
}
}