C# .NET 4.5 Visual Studio 2010
这更像是一种思考练习,而不是校对我的代码。
我正在开发一个在 Windows 中作为服务运行的 HTTP 侦听器。我使用以下代码制作了一个独立的 Windows 窗体项目,它工作正常。每次有请求进来时,我都会出现一个显示 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);
}
}