.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,其中“已建立的连接已被主机中的软件中止”。可能是问题的根源是什么?
答案 0 :(得分:0)
简单的答案是“你真的不在乎”。
TCP通过建立双向“虚拟”持久连接来工作。为了实现这种错觉,它使用一个单独的端口与给定的客户端进行通信。您仍然连接到端口80(例如),但是一千个客户端使用一千个不同的端口来与服务器进行实际通信。
ExclusiveAddressUse
允许您将更多套接字绑定到同一个端口 - 但每个套接字都必须有自己的IP地址。
网络很难。我们尽可能高的抽象,无论是TcpListener,HttpListener还是OWIN。