【问题标题】:TCP Communication: Send ResponseTCP 通信:发送响应
【发布时间】:2015-02-26 13:53:40
【问题描述】:

我是套接字编程和 TCP 通信的新手,我正在开发一个应用程序,该应用程序应该从可以访问服务器但没有互联网连接的计算机接收请求(网站 url),然后它应该发送网站给客户作为回应。到目前为止,我已经能够成功收听请求,但是当我尝试发送响应时,浏览器会挂起。

            IPAddress ipAddress = IPAddress.Parse("127.0.0.1");
            TcpListener listener = new TcpListener(ipAddress, 500);
            listener.Start();
            while (true)
            {
                Socket client = listener.AcceptSocket();
                Console.WriteLine("Connection accepted.");
                var childSocketThread = new Thread(() =>
                {
                    byte[] data = new byte[100];
                    int size = client.Receive(data);
                    Console.WriteLine("Recieved data: ");
                    for (int i = 0; i < size; i++)
                        Console.Write(Convert.ToChar(data[i]));
                    // Reading the website in bytes using WebCLient
                    client.Send(RESPONSE) // Here I call the send
                    client.Close();
                });
                childSocketThread.Start();
            }

            listener.Stop();

我到底做错了什么,我该如何解决这个问题(将响应发送回客户端)?

【问题讨论】:

  • HAN​​G 是什么意思?为什么你使用线程来发送响应?有什么具体原因吗
  • @KcDoD:嗯,我在这个主题上处于世界水平,所以如果你知道什么,请与我分享,我想了解一下。
  • 好吧,我觉得你想要的是一个线程连接(可能是)..尝试在线程启动之后放置 childSocketThread.Join() 。还可以在 AcceptSocket 之前使用控制台写行来验证代码是否到达那里,执行并告诉更新:)
  • 什么是RESPONSE?确保它是对您收到的特定查询的适当响应的逻辑在哪里?为什么你会选择一个现存的最复杂的东西(一个 HTTP 代理)作为你第一次涉足套接字编程?!首先阅读the standard 并仔细研究其中提到的每一个代理。

标签: c# sockets tcp


【解决方案1】:

如果您想编写 HTTP 代理,则必须遵循 HTTP specification 中对代理的所有要求。例如:

代理服务器必须分别与它的客户端和它所连接的源服务器(或其他代理服务器)发出持久连接信号。每个持久连接仅适用于一个传输链路。

和:

代理服务器不得与 HTTP/1.0 客户端建立 HTTP/1.1 持久连接(但有关许多 HTTP/1.0 客户端实现的 Keep-Alive 标头问题的信息和讨论,请参见 RFC 2068 [33]) .

和:

  • 如果代理收到包含 Expect 请求的请求 - 具有“100-continue”期望的标头字段,以及代理 要么知道下一跳服务器符合 HTTP/1.1 要么 更高,或者不知道下一跳的 HTTP 版本 服务器,它必须转发请求,包括 Expect 标头 字段。
  • 如果代理知道下一跳服务器的版本是 HTTP/1.0 或更低版本,它不能转发请求,它必须 以 417(预期失败)状态响应。
  • 代理应维护记录 HTTP 版本的缓存 从最近引用的下一跳服务器收到的号码。
  • 代理不得转发 100(继续)响应,如果 请求消息是从 HTTP/1.0(或更早版本)接收的 客户端,并且没有包含 Expect 请求标头字段 “100-继续”的期望。此要求覆盖 转发 1xx 响应的一般规则(参见第 10.1 节)。

HTTP 代理是一种极其复杂的野兽,对于没有编写网络代码经验的人来说可能是最糟糕的选择。

【讨论】:

  • 你的答案简直是完美的大卫,通过将你所说的融入到剧本中,我终于实现了我所追求的。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-06-23
  • 2012-06-24
  • 2013-09-14
  • 1970-01-01
  • 2022-10-19
  • 2018-06-28
  • 2021-01-04
相关资源
最近更新 更多