如何处理奇怪的套接字请求(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
}
}
试试这样:
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;
}
}
}