如何处理奇怪的套接字请求(HTTP服务器)

本文关键字:套接字 请求 HTTP 服务器 何处理 处理 | 更新日期: 2023-09-27 18:17:46

我已经编写了自己的HTTP服务器嵌入到桌面应用程序中,它可以工作(在本地主机上启动服务器),除了我在套接字上收到一个奇怪的请求,导致连接被关闭,因此没有处理新的请求。这个请求在我打开网页大约15秒后出现。当我检查它时,包中包含一长串'0'0'0'0'0'0'0'0'0'0'0'0......。我不知道是什么引起的也不知道该怎么处理。在最初的15秒内,我可以做所有需要做的事情,但是一旦发生这种情况,就不能发出新的请求,服务器也不会响应任何新的请求。每次我启动应用程序时也不会发生这种情况,但我不能确定原因。

while (true)
{
    //Accept a new connection
    Socket mySocket = _listener.AcceptSocket();
    if (mySocket.Connected)
    {
        Byte[] bReceive = new Byte[1024];
        int i = mySocket.Receive(bReceive, bReceive.Length, 0);
        string sBuffer = Encoding.ASCII.GetString(bReceive); 
        if (sBuffer.Substring(0, 3) != "GET")
        {
            Console.WriteLine(sBuffer);
            mySocket.Close();
            return;
        }    
        ........handle valid requests
    }    
}

如何处理奇怪的套接字请求(HTTP服务器)

试试这样:

while (true)
{
    //Accept a new connection
    Socket mySocket = _listener.AcceptSocket();
    if (mySocket.Connected)
    {
        Byte[] bReceive = new Byte[1024];
        int i = mySocket.Receive(bReceive, bReceive.Length, 0);
        if(i > 0) // added check to make sure data is received
        {
            string sBuffer = Encoding.ASCII.GetString(bReceive, 0, i); // added index and count
            if (sBuffer.Substring(0, 3) != "GET")
            {
                Console.WriteLine(sBuffer);
                mySocket.Close();
                return;
            }    
            ........handle valid requests
        }
    }    
}

最终-如果i == 1024,你需要做一些事情-因为如果它这样做,有比你在mySocket.Receive中读取的数据更多的数据。

作为旁注-我可能会改变if (sBuffer.Substring(0, 3) != "GET")if (sBuffer.StartsWith("GET"))

它稍微容易阅读—并且有一个额外的好处,即如果(由于某些奇怪的原因)GET更改为其他内容,则不需要更改子字符串长度。

Edit -这将允许在遇到超过1024字节的数据时多次调用mySocket.Receive:

        while (true)
        {
            //Accept a new connection
            Socket mySocket = _listener.AcceptSocket();
            if (mySocket.Connected)
            {
                StringBuilder sb = new StringBuilder();
                Byte[] bReceive = new Byte[1024];
                int i;
                while ((i = mySocket.Receive(bReceive, bReceive.Length, 0) > 0))
                {
                    sb.Append(Encoding.ASCII.GetString(bReceive, 0, i)); // added index and count
                }
                string sBuffer = sb.ToString();
                if (sBuffer.Substring(0, 3) != "GET")
                {
                    Console.WriteLine(sBuffer);
                    mySocket.Close();
                    return;
                }
            }
        }