C#中的自定义Http侦听器

时间:2014-04-08 14:19:42

标签: c# sockets http httplistener

.NET有一个内置的HttpListener类,但我想知道如何滚动我自己的Http Listener。我知道这有很多含义,但我只是希望看到浏览器和我自己的应用程序相互影响。

这是我到目前为止编写的代码:

Socket servSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
servSocket.ExclusiveAddressUse = false; // Does this matter?
servSocket.Bind(new IPEndPoint(IPAddress.Any, 8080));
servSocket.Listen(10);

byte[] buffer;

do
{
    try
    {
        Socket clientSocket = servSocket.Accept();

        Console.WriteLine("Received Request at: {0}.", DateTime.Now);

        EndPoint remoteEP = clientSocket.RemoteEndPoint;
        buffer = new byte[1024];
        clientSocket.ReceiveFrom(buffer, SocketFlags.None, ref remoteEP);
        string request = Encoding.UTF8.GetString(buffer);
        System.Diagnostics.Trace.Write(request);
        buffer = Encoding.UTF8.GetBytes("<html><head><link rel=\"icon\" href=\"data:;base64,=\"></head><body></body></html>");
        clientSocket.Send(buffer);

        clientSocket.Close();
        clientSocket.Dispose();
    }
    catch { }
}
while (this.isRunning);

这种工作,但我注意到的两个问题是,clientSocket本地端点与servSocket位于同一端口。使用内置的HttpListener,请求由随机本地端点端口处理。我怎么能模仿这个?

我已将ExclusiveAddressUse标志设置为false,但是我仍然无法将多个套接字绑定到该特定端点,那么它的确切用途是什么?

此外,我不时会收到一个SocketException,其中“已建立的连接已被主机中的软件中止”。可能是问题的根源是什么?

1 个答案:

答案 0 :(得分:0)

简单的答案是“你真的不在乎”。

TCP通过建立双向“虚拟”持久连接来工作。为了实现这种错觉,它使用一个单独的端口与给定的客户端进行通信。您仍然连接到端口80(例如),但是一千个客户端使用一千个不同的端口来与服务器进行实际通信。

ExclusiveAddressUse允许您将更多套接字绑定到同一个端口 - 但每个套接字都必须有自己的IP地址。

网络很难。我们尽可能高的抽象,无论是TcpListener,HttpListener还是OWIN。