Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C中的自定义Http侦听器#_C#_Sockets_Http_Httplistener - Fatal编程技术网

C# C中的自定义Http侦听器#

C# C中的自定义Http侦听器#,c#,sockets,http,httplistener,C#,Sockets,Http,Httplistener,NET有一个内置的HttpListener类,但是我想知道如何滚动自己的Http侦听器。我知道这有很多含义,但我只想看到浏览器和我自己的应用程序相互作用 这是我迄今为止编写的代码: Socket servSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); servSocket.ExclusiveAddressUse = false; // Does this matter? s

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

这是我迄今为止编写的代码:

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);
Socket servSocket=新套接字(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
servSocket.ExclusiveAddressUse=false;//这有关系吗?
绑定(新的IPEndPoint(IPAddress.Any,8080));
听(10);
字节[]缓冲区;
做
{
尝试
{
Socket clientSocket=servSocket.Accept();
WriteLine(“在:{0}接收到请求”,DateTime.Now);
EndPoint remoteEP=clientSocket.RemoteEndPoint;
缓冲区=新字节[1024];
clientSocket.ReceiveFrom(buffer,SocketFlags.None,ref remoteEP);
字符串请求=Encoding.UTF8.GetString(缓冲区);
系统.诊断.跟踪.写入(请求);
buffer=Encoding.UTF8.GetBytes(“”);
clientSocket.Send(缓冲区);
clientSocket.Close();
clientSocket.Dispose();
}
捕获{}
}
当(这个正在运行);
然而,我注意到的两个问题是,
clientSocket
本地端点与
servSocket
位于同一端口上。使用内置的HttpListener,请求由随机本地端点端口处理。我怎样才能模仿这个呢

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

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

简单的答案是“你并不真的在乎这个”

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

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


联网很难。无论是TcpListener、HttpListener还是OWIN,请尽可能为我们提供一个抽象概念。

感谢您提及OWIN。真有趣!所以我不确定我是否正确,让我看看:1。客户端连接到端口80上的服务器。2.服务器接收请求,将其传递给其他模块,终止端口80上的连接,并开始侦听新连接。3.另一个模块完成处理,并从服务器上的新随机端口向终端客户端IP:port发送请求。“这是对的吗?”ZuiqPazu说,但是的,情况差不多是这样。请注意,这是TCP驱动程序本身的一部分。实际上,您确实关心这些随机端口(称为“临时端口”),因为它们的数量有限。但是,除非你有很多并发连接,并且人们总是在连接和断开连接,否则你应该没事。不过,桌面计算机上的默认值相当低。无论如何,这确实意味着无论你的应用程序性能如何,一个网络接口最多只能同时维护65534个TCP连接(实际上要少得多)。@ZuiqPazu问题是,TCP是一种让你产生“会话”和“连接”错觉的协议。因此,端口80上的连接没有“终止”——从一开始就没有“连接”。例如,底层IP协议并不关心。例如,相同的进程(或其限制)不适用于UDP。如果您想更深入地了解这一点,您可能需要安装一个像WireShark这样的工具来监控网络通信的实际情况。例如,TCP连接init表示1。同步C->S,2。同步确认S->C,3。确认C->S;在发送任何数据之前进行两次往返。非常感谢您的详细回复:)我非常高兴。我会接受你的回答作为解决办法。