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

时间:2014-08-13 17:14:24

标签: c# .net http

我已经编写了自己的HTTP服务器来嵌入桌面应用程序并且它可以工作(在localhost上旋转服务器),除了我在导致连接的套接字上收到一个奇怪的请求关闭,以便不处理新的请求。我打开网页后大约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
    }    
}

1 个答案:

答案 0 :(得分:0)

尝试这样的事情:

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改为其他东西,还有一个额外的好处就是不需要更改子串长度。

编辑 - 当遇到超过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;
                }
            }
        }