c# - C# (.net) 下带有 HTTP 服务器的 Keep-Alive 套接字如何发送多个查询?

标签 c# sockets http keep-alive

菜鸟问题。 所以我尝试使用此代码在同一个套接字上多次调用 http 服务器获取资源:

 public void TryReuseSameSocket(){
            var addr = Dns.GetHostAddresses("stackoverflow.com");
            var socket = new Socket(SocketType.Stream, ProtocolType.Tcp);
            try
            {
                // i thought that i must to use this option
                socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.KeepAlive, 1);
                socket.Connect(addr, 80);
                var bigbuff = new byte[10000];
                for (var i = 0; i < 20; i++)
                {
                    //now i try to call some URL many times without socket closing
                    var buff = Encoding.ASCII.GetBytes("GET /help/badges HTTP/1.1\r\nHost: stackoverflow.com\r\nConnection: Keep-Alive\r\n\r\n");
                    socket.Send(buff);
                    var reciveCount = 0;
                    var totalCount = 0;
                    while (true)
                    {
                        reciveCount = socket.Receive(bigbuff);
                        totalCount += reciveCount;
                        if (0 == reciveCount) break;
                    }
                    //only first call will proceed, all others will not have a result
                    Assert.AreNotEqual(0,totalCount);

                }

            }
            finally
            {
                socket.Dispose();
            }
        }

但只有第一个调用继续,所有其他调用在接收时根本不返回任何数据。

如何正确复用 HTTP 服务器的套接字。

最佳答案

您一直在读取流,直到它被远程端关闭。在那之后您将不会获得任何数据,这是有道理的。

您需要让服务器保持连接有效。这是通过设置保持事件状态的 HTTP header 来完成的。您似乎正在这样做。

使用 HTTP keep alive,服务器将设置 Content-Length header 来告诉您要读取多少字节。准确读取那么多字节。之后,发送下一个请求。

TCP 保活 (SocketOptionName.KeepAlive) 与 HTTP 保活无关。删除该代码。

关于c# - C# (.net) 下带有 HTTP 服务器的 Keep-Alive 套接字如何发送多个查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25612557/

相关文章:

c# - ITextSharp - PDF 在首页以外的页眉区域书写

c# - Unity3D/C# - 向游戏对象添加一个变量

mysql - 应用程序无法连接到本地 MySQL - osx

http - 主流浏览器支持哪些字符集?

c# - 如何在我的 View 中仅显示不同的名称(来 self 的模型)?

c# - 机器人计时器

python - GUnicorn 提供的 Flask-sockets 并发连接问题

c - 在 Windows 中的套接字上使用 fprintf

http - 自定义 HTTP header : naming conventions

javascript - 将表单的内容发布到 rest api