Как я могу проверить, если 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? Кроме того, не могли бы вы сообщить мне, почему это происходит в сетевом приложении?