我已经编写了自己的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
}
}
答案 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;
}
}
}