Chrisstone07 Ответов: 1

Как я могу проверить, если HTTP-запросы направляются по отправки асинхронных запросов и полученных сокет приемника трансляция


Я разрабатываю HTTP-прокси-сервер для приложения UWP(C#), но сталкиваюсь с проблемами с запросами, отправленными и полученными при создании сокета.Я сначала создать объект сокета потока и затем прослушивать HTTP-запросы, отправленные с помощью отправки асинхронных запросов к гнезду слушателя поток.Однако я сталкиваюсь с HTTP-исключениями и закрытием сокетов до того, как запросы будут отправлены полностью, причина этого я подозреваю, что либо данные не отправляются в Socket stream listener должным образом, либо не принимаются Socket stream listener должным образом.Где я ошибаюсь?

Что я уже пробовал:

//Called for each request received on StreamSocketListner , a new task is created to make connections to remote Proxy and retirve data from backend.
           public async Task listenerTask(StreamSocketListener sender, StreamSocketListenerConnectionReceivedEventArgs args)
           {
               try
               {
                   Debug.WriteLine("In listenerTask************ ");

                   string snirequest = null;
                   string hostName = null;
                   string reqUri = null;
                   string uriReqStr = null;
                   String orgRequest = null;

                   using (IInputStream input = args.Socket.InputStream)
                   {
                       //Reading data arrived at socket
                       orgRequest = await GetSocketDataString(input);
                   }


                   reqUri = getOriginalRequestUri(orgRequest);
                   Debug.WriteLine("*************Org uri req", reqUri);
                   string totalHostName = null;

                   if (reqUri != null)
                   {

                       if (reqUri.StartsWith("https"))
                       {
                           Debug.WriteLine("Req is https");
                           if (orgRequest.Contains("redirectrequest") == false)
                               totalHostName = reqUri.Substring(8, reqUri.Length - 8).TrimEnd('/');
                           else
                               totalHostName = reqUri.Substring(8, reqUri.Length - 8);

                           int uriIndx = totalHostName.IndexOf('/');
                           if (uriIndx > 0)
                           {
                               uriReqStr = totalHostName.Substring(uriIndx);
                               hostName = totalHostName.Substring(0, totalHostName.Length - uriReqStr.Length + 1).TrimEnd('/'); ;

                           }
                           else
                           {
                               uriReqStr = "/";
                               hostName = totalHostName.Substring(0, totalHostName.Length - uriReqStr.Length + 1);

                           }

                           Debug.WriteLine(hostName);
                           Debug.WriteLine(uriReqStr);

                           snirequest = "CONNECT " + hostName + ":443 HTTP/1.1\r\nHost: " + hostName + ":443\r\nProxy-Connection: Keep-Alive\r\nConnection: Keep-Alive\r\n\r\n";


                       }
                       else
                       {
                           if (orgRequest.Contains("redirectrequest") == false)
                               totalHostName = reqUri.Substring(7, reqUri.Length - 7).TrimEnd('/');
                           else
                               totalHostName = reqUri.Substring(7, reqUri.Length - 7);

                           int uriIndx = totalHostName.IndexOf('/');
                           if (uriIndx > 0)
                           {
                               uriReqStr = totalHostName.Substring(uriIndx);
                               hostName = totalHostName.Substring(0, totalHostName.Length - uriReqStr.Length + 1).TrimEnd('/'); ;

                           }
                           else
                           {
                               uriReqStr = "/";
                               hostName = totalHostName.Substring(0, totalHostName.Length - uriReqStr.Length + 1);

                           }

                           Debug.WriteLine(hostName);
                           Debug.WriteLine(uriReqStr);


                           snirequest = getSniRequest(reqUri, orgRequest, hostName, uriReqStr);

                       }

                       //Debug.WriteLine(snirequest);

                       Byte[] bytesSent = System.Text.Encoding.ASCII.GetBytes(snirequest);


                       // Create a socket connection with the specified server and port.
                       Windows.Networking.Sockets.StreamSocket socket = new Windows.Networking.Sockets.StreamSocket();
                       socket.Control.KeepAlive = true;
                       Windows.Networking.HostName serverHost = new Windows.Networking.HostName(PROXY_IP);

                       string serverPort = PROXY_PORT.ToString();

                       socket = await ConnectToProxy(snirequest, hostName);
                       System.IO.Stream streamOut = socket.OutputStream.AsStreamForWrite();
                       StreamWriter writer = new StreamWriter(streamOut);
                       HostName destHost = new HostName(hostName);

                       IInputStream inputStream = socket.InputStream;

                       //Debug.WriteLine(hostName);
                       //Debug.WriteLine(uriReqStr);
                       //Debug.WriteLine(reqUri);
                       //Debug.WriteLine(orgRequest.ToString());

                       String testreq = getSniRequest(reqUri, orgRequest.ToString(), hostName, uriReqStr);


                       if (reqUri.StartsWith("https"))
                       {
                           snirequest = testreq;

                           await upgradeDatamiSocket(socket, hostName, snirequest, uriReqStr);

                       }

                       StreamSocket writeSocket = args.Socket;
                       await ReadSocketData(inputStream, writeSocket);
                       socket.Dispose();  // Dispose the socket after reading data from remote proxy

                       Debug.WriteLine("Socket disposed");

                       //await System.Threading.Tasks.Task.Delay(TimeSpan.FromSeconds(5));

                   }
               }

               catch (Exception ex)
               {
                   Debug.WriteLine("Listener task Exception" + ex.Message);

               }


           }

RickZeeland

Это требует некоторого изучения, но Wireshark может контролировать почти все виды сетевого трафика.

Chrisstone07

Привет, Рик, как именно я могу этого добиться?Не могли бы вы дать мне какие-нибудь контактные данные, чтобы я мог общаться чаще

RickZeeland

Я не часто пользуюсь WireShark, и поскольку пользовательский интерфейс значительно изменился, я не могу точно сказать, как именно, но в прошлом я определил фильтр для ip-адреса, например "ip eq 127.0.0.1", а затем начал захват.
Когда вы видите интересную строку в журнале, вы можете щелкнуть правой кнопкой мыши и выбрать `следить за потоком".
Этот учебник показывает, что я имею в виду: https://www.howtogeek.com/104278/how-to-use-wireshark-to-capture-filter-and-inspect-packets/

Chrisstone07

Спасибо, Рик, я воспользуюсь wireshark и дам вам знать, если эта проблема будет решена.Однако я также сталкиваюсь с другой проблемой, то есть максимальное количество одновременных http-запросов фиксируется до 13 в приложении UWP.Есть ли какой-нибудь способ увеличить это количество запросов до значения, скажем, 100? Кроме того, не могли бы вы сообщить мне, почему это происходит в сетевом приложении?

1 Ответов

Рейтинг:
1

RickZeeland

Я не являюсь частым пользователем приложение Wireshark, и поскольку пользовательский интерфейс значительно изменился, я не могу точно сказать, как именно, но в прошлом я определил фильтр для ip-адреса, например `ip.addr eq 127.0.0.1- а потом начался захват.
Когда вы видите интересную строку в журнале, вы можете щелкнуть правой кнопкой мыши и выбрать'Следуйте за потоком`.

Этот учебник показывает, что я имею в виду: Как использовать Wireshark для захвата, фильтрации и проверки пакетов[^]
Параметры фильтра описаны здесь: DisplayFilters - The Wireshark Wiki[^]
Вот еще один интересный учебник о " нюхательных инструментах": Этические Хакерские Утилиты Нюхают [^]