[英]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.