为什么Socket.BeginAccept()在我的后台服务DLL项目中不起作用?

时间:2014-05-19 20:22:19

标签: c# .net sockets system.net.sockets

C#.NET 4.5 Visual Studio 2010

这更像是一次思考练习,而不是校对我的代码。

我正在开发一个在Windows中作为服务运行的HTTP侦听器。我使用下面的代码创建了一个独立的Windows窗体项目,它工作正常。每次请求进来时,我都能够显示一个消息框,显示HTTP POST请求的正文。

问题是,相同的代码在复制到后台服务DLL项目时,并没有“捕获”#34;发送给它的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);
    }

}

1 个答案:

答案 0 :(得分:0)

搞定了。出于某种原因,当我将服务器作为服务运行时,我想要使用的端口被Windows防火墙阻止,但是当我将服务器作为Forms应用程序运行时,它并没有阻止它。该服务在防火墙设置中列出了一个例外,但该例外仅允许在一个特定端口上进行通信;不是我想要使用的那个。

以下是我更改为允许在我的端口上进行通信的设置:

控制面板> Windows防火墙>高级设置>入境规则> (右键单击服务名称)>属性> "协议和端口"标签>本地端口>将8000添加到已经列在那里的端口