Почему получаю пустое сообщение от google.com xamarin c#
Хочу отправить запрос и получить ответ с помощью сокета на xamarin(android) для реализации прокси сервера, но при получении ответа от удалённого сервера очень часто ловлю пустые сообщения. На компьютере в консольке всё прекрасно работало, а на андроид не очень.
Код:
private static void ExecuteRequest(object arg)
{
//tcp listener с IPAddress.Parse("192.168.49.1"), 8889 если это имеет значение
Socket myClient = (Socket)arg;
// соединяемся
if (myClient.Connected)
{
try
{
// получаем тело запроса
byte[] httpRequest = ReadToEnd(myClient);
// ищем хост и порт
Regex myReg = new Regex(@"Host: (((?<host>.+?):(?<port>\d+?))|(?<host>.+?))\s+", RegexOptions.Multiline | RegexOptions.IgnoreCase);
string req = System.Text.Encoding.ASCII.GetString(httpRequest);
Match m = myReg.Match(System.Text.Encoding.ASCII.GetString(httpRequest));
string host = m.Groups["host"].Value;
int port = 0;
// если порта нет, то используем 80 по умолчанию
if (!int.TryParse(m.Groups["port"].Value, out port)) { port = 80; }
// получаем апишник по хосту
IPHostEntry myIPHostEntry = Dns.GetHostEntry(host);
// создаем точку доступа
IPEndPoint myIPEndPoint = new IPEndPoint(myIPHostEntry.AddressList[0], port);
// создаем сокет и передаем ему запрос
using (Socket myRerouting = new Socket(myIPEndPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp | ProtocolType.IP))
{
myRerouting.Connect(myIPEndPoint);
myRerouting.Send(httpRequest);
byte[] httpResponse = new byte[myRerouting.ReceiveBufferSize];
//--------------------------------------------------------------------------------------------------------------------------------
//В массиве httpResponse очень часто просто нули. Не думаю, что это есть хорошо. То, что в сумме не работает, подкрепляет эту идею
try//Защита от сброшеного соединения
{
myRerouting.Receive(httpResponse, httpResponse.Length, SocketFlags.None);
}
catch(Exception ex)
{
}
//Если использовать byte[] httpResponse = ReadToEnd(myRerouting);
//:
// получаем ответ 0 байт всегда, НО на компе норм ловит
//--------------------------------------------------------------------------------------------------------------------------------
string d = System.Text.Encoding.ASCII.GetString(httpResponse);
//Если есть что-то то обрезаем конец нулей(как правило, конец заполнен нулями), а иначе передаем ноль и уходим
#region Вот
if (httpResponse.FirstOrDefault(x => x != 0) == default)
{
myClient.Send(new byte[] { 0});
return;
}
int countZero = 0;
int i = 0;
for (i = 0; i < httpResponse.Length; i++)
{
if (httpResponse[i] == 0)
{
countZero++;
if (countZero >= 5)
{
i -= 4;
break;
}
continue;
}
countZero = 0;
}
httpResponse = httpResponse.Take(i).ToArray();
#endregion
// не суть
if (httpResponse != null)
{
string d2 = System.Text.Encoding.Unicode.GetString(httpResponse);
string deorgi = System.Text.Encoding.UTF8.GetString(httpResponse);
string aski = System.Text.Encoding.ASCII.GetString(httpResponse);
myClient.Send(httpResponse);
}
}
}
catch (Exception ex)
{
Debug.WriteLine(ex.Message);
}
myClient.Close();
}
}
private static byte[] ReadToEnd(Socket mySocket)
{
byte[] b = new byte[mySocket.ReceiveBufferSize];
int len = 0;
using (MemoryStream m = new MemoryStream())
{
while (mySocket.Poll(1000000, SelectMode.SelectRead) && (len = mySocket.Receive(b, mySocket.ReceiveBufferSize, SocketFlags.None)) > 0)
{
m.Write(b, 0, len);
}
return m.ToArray();
}
}
Хост обычный гугл
1 000 000 нулей


