0

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

}
4

1 回答 1

1

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

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

控制面板 > Windows 防火墙 > 高级设置 > 入站规则 >(右键单击服务名称)> 属性 > “协议和端口”选项卡 > 本地端口 > 将 8000 添加到已在此处列出的端口

于 2014-05-20T19:03:50.627 回答