Я написал свой собственный 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
}
}
1 ответ
Попробуйте что-то вроде этого:
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 изменился на что-то другое.
Изменить - это позволит многократно вызывать mySocket.Receive
, когда встречается больше данных, чем 1024 байта:
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;
}
}
}
new StreamReader(tcpClient.GetStream())
. Его метод ReadLine может решить все эти проблемы :)
Похожие вопросы
Новые вопросы
c#
C# (произносится как «see Sharp») — это высокоуровневый мультипарадигменный язык программирования со статической типизацией, разработанный Microsoft. Код C# обычно нацелен на семейство инструментов и сред выполнения Microsoft .NET, которое включает в себя .NET, .NET Framework, .NET MAUI и Xamarin среди прочих. Используйте этот тег для ответов на вопросы о коде, написанном на C#, или о формальной спецификации C#.
have no idea what's causing this
. Потому что вы не используетеi
, возвращаемый изReceive
при использованииEncoding.ASCII.GetString
. Вы просто предполагаете, что прочиталиbReceive.Length
байт ....\0
, которую вы получаете, вероятно, является результатом чтения менее 1024 байтов данных. то есть там всего 100 байт данных, поэтому у вас будет 924 экземпляра/0
.