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