Форум программистов, компьютерный форум, киберфорум
C#: Web, ASP.NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
27 / 27 / 8
Регистрация: 30.03.2010
Сообщений: 380
Записей в блоге: 1
1

Отправить пакет данных через WebRequest

03.04.2015, 16:33. Показов 2059. Ответов 16
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Привет форумчане!
Интересует, можно ли как нибудь отправить пакет данных, который отправляет любой браузер, используя WebRequest или HttpWebRequest
Имею в виду вот такой пакет:
Код
GET http://mail.ru/ HTTP/1.1
Host: mail.ru
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:36.0) Gecko/20100101 Firefox/36.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Cookie: mrcu=9D8E511293E06DE6972A0A01060A; VID=3ilWyk1S-D1K00000102141K:; i=AQAk4QdVAQATAAgcCVAAAV0AASoBAYIBASMDASoDAXsEAQoIAQsIAQ==
Connection: keep-alive
к примеру вытащить из этого пакета хост, чтобы знать куда отправлять, и потом на этот хост отправить весь пакет.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.04.2015, 16:33
Ответы с готовыми решениями:

Подскажите как отправить пакет 10 байт на устройство через com порт
Из меня программист некудышный.. что то получается отправить на ком порт из содранного примера, а...

Почему если отправить пакет UDP и конечного адресата в сети не существует, то пакет не отправляется?
Добрый день! Вопрос для расширения кругозора. Мониторю свой трафик с помощью WireShark и...

Нужно отправить принятый пакет!
Принимаю в буфер char buf пакет функцией recv(). Читаю его содержимое. Хочу дальше отправить этот...

Отправить/принять пакет UDP
Требуется решить такую задачу: Создать приложение Win32 с оконным интерфейсом. По нажатию кнопки...

16
4 / 4 / 1
Регистрация: 03.04.2015
Сообщений: 5
03.04.2015, 16:41 2
Если правильно понял, то в контролере MVC это вытаскивается примерно так:
C#
1
string host=this.Request.Headers["Host"];
Ну а потом уже колдуете с результатом.
0
27 / 27 / 8
Регистрация: 30.03.2010
Сообщений: 380
Записей в блоге: 1
03.04.2015, 16:43  [ТС] 3
нет, как вытащить, это не проблема.
вопрос в том, как взять и отправить весь пакет
это не MVC приложение
0
2735 / 2041 / 380
Регистрация: 22.07.2011
Сообщений: 7,731
03.04.2015, 21:12 4
Это уже распарсенный результат в удобном для человека виде , на уровне сокетов - просто набор байтов , соответственно:
https://msdn.microsoft.com/ru-... .110).aspx
И придется вручную обрабатывать коды ответов от удаленного сервера.

Добавлено через 2 минуты
Цитата Сообщение от bupal Посмотреть сообщение
WebRequest или HttpWebRequest
У них нет открытого интерфейса на столь низком уровне.
0
27 / 27 / 8
Регистрация: 30.03.2010
Сообщений: 380
Записей в блоге: 1
03.04.2015, 21:28  [ТС] 5
с помощью сокетов делал, но тут проблема возникает, если сервер работает по SSL/TSL
то сервер всегда возвращает ошибку 400
может есть способ как это исправить?
0
2735 / 2041 / 380
Регистрация: 22.07.2011
Сообщений: 7,731
04.04.2015, 00:13 6
Потому что нужно шифровать сообщения , читать спецификацию ssl , в общем для развития может и полезно , но проще воспользоваться стандартными HttpClient_ами , продублировав коллекцию заголовков.- остальное там уже сделано.

http://blogs.msdn.com/b/joncol... ation.aspx
1
27 / 27 / 8
Регистрация: 30.03.2010
Сообщений: 380
Записей в блоге: 1
04.04.2015, 22:48  [ТС] 7
т.е. в C# есть стандартные средства для создания SSL соединений?
посмотрел ссылку, но не совсем понял этот проект, а точнее где именно там реализация того, что нужно именно в моём случае?
можете показать конкретный кусок кода из этого примера?
0
2735 / 2041 / 380
Регистрация: 22.07.2011
Сообщений: 7,731
05.04.2015, 15:54 8
т.е. в C# есть стандартные средства для создания SSL соединений?
Естественно ) , было бы странно , если бы этого небыло.
https://msdn.microsoft.com/ru-... .110).aspx
https://msdn.microsoft.com/ru-... .110).aspx

Но Вы то хотели сразу пакет целиком отправить , и тогда на ваши плечи ложится весь хардкодинг на уровне TcpClient-а. , тогда как есть более высоко абстрагированные классы , такие как HttpClient, WebClient, и т.п , но там треьбуется заполнять заголовки через соответствующие поля , что за рамками вашей постановки.

З.Ы пример в предыдущем посте показывает как реализовать ssl клиента на уровне Tcp сокетов
1
27 / 27 / 8
Регистрация: 30.03.2010
Сообщений: 380
Записей в блоге: 1
05.04.2015, 18:41  [ТС] 9
по поводу этого:
C#
1
public X509CertificateCollection ClientCertificates { get; }
таким образом я могу получить у сервера сертификаты, с которыми он работает, правильно?
и в первой ссылке, как я понял, эта функция уже реализована в этой функции public static bool ValidateServerCertificate, правильно я понял?
там обязательно в конце каждого сообщения ставить <EOF>?
0
27 / 27 / 8
Регистрация: 30.03.2010
Сообщений: 380
Записей в блоге: 1
08.04.2015, 02:59  [ТС] 10
попробовал создать по примеру https://msdn.microsoft.com/ru-... .110).aspx
сервер вернул так же ошибку 400
делал так:
host - вытаскивал из запроса, пример которого в первом посте
на вход функции test2 подаётся массив байт, который является запросом из первого поста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
byte[] test2(byte[] input)
        {
            // Create a TCP/IP client socket.
            // machineName is the host running the server application.
            TcpClient client = new TcpClient(host, 443);
            // Create an SSL stream that will close the client's stream.
            SslStream sslStream = new SslStream(
                client.GetStream(),
                false,
                new RemoteCertificateValidationCallback(ValidateServerCertificate),
                null
                );
            // The server name must match the name on the server certificate.
            try
            {
                sslStream.AuthenticateAsClient(host);
            }
            catch (AuthenticationException e)
            {
                MessageBox.Show("Exception: {0}", e.Message);
                if (e.InnerException != null)
                {
                    MessageBox.Show("Inner exception: {0}", e.InnerException.Message);
                }
                MessageBox.Show("Authentication failed - closing the connection.");
                client.Close();
                return null;
            }
            
            // Send hello message to the server.
            byte[] mess = input.Concat(Encoding.UTF8.GetBytes("<EOF>")).ToArray();
            sslStream.Write(mess);
            sslStream.Flush();
            ///////////////////////////////////////////////////////
            byte[] buffer = new byte[2048];
            StringBuilder messageData = new StringBuilder();
            int bytes = -1;
            do
            {
                bytes = sslStream.Read(buffer, 0, buffer.Length);
 
                // Use Decoder class to convert from bytes to UTF8
                // in case a character spans two buffers.
                Decoder decoder = Encoding.UTF8.GetDecoder();
                char[] chars = new char[decoder.GetCharCount(buffer, 0, bytes)];
                decoder.GetChars(buffer, 0, bytes, chars, 0);
                messageData.Append(chars);
                // Check for EOF.
                if (messageData.ToString().IndexOf("<EOF>") != -1)
                {
                    break;
                }
            } while (bytes != 0);
 
            string s = messageData.ToString();
            client.Close();
            return Encoding.UTF8.GetBytes(s);
        }
        // The following method is invoked by the RemoteCertificateValidationDelegate.
        public static bool ValidateServerCertificate(
              object sender,
              X509Certificate certificate,
              X509Chain chain,
              SslPolicyErrors sslPolicyErrors)
        {
            if (sslPolicyErrors == SslPolicyErrors.None)
                return true;
 
            Console.WriteLine("Certificate error: {0}", sslPolicyErrors);
 
            // Do not allow this client to communicate with unauthenticated servers.
            return false;
        }
0
2735 / 2041 / 380
Регистрация: 22.07.2011
Сообщений: 7,731
08.04.2015, 03:22 11
Так надо нормальный http пакет отправлять , естественно веб.сервер не поймет <EOF> , еще читайте спецификацию http протокола )
0
27 / 27 / 8
Регистрация: 30.03.2010
Сообщений: 380
Записей в блоге: 1
08.04.2015, 03:35  [ТС] 12
<EOF> убрал
осталось только то, что посылает браузер, так же 400 ошибка
0
2735 / 2041 / 380
Регистрация: 22.07.2011
Сообщений: 7,731
08.04.2015, 03:36 13
Прокси для https - будет ли работать приведенный код?
Ну эта ошибка говорит только об одном , неверно формируете запрос для веб.сервера.

byte[] mess = input.Concat(Encoding.UTF8.GetBytes("<EOF>")).ToArray();
и где же тут нормальные http заголовки , адрес запрашиваемой страницы и т.п ?
1
27 / 27 / 8
Регистрация: 30.03.2010
Сообщений: 380
Записей в блоге: 1
08.04.2015, 03:44  [ТС] 14
сейчас так:
C#
1
sslStream.Write(input);
input - массив байтов, который я получаю от браузера, если это массив расшифровать, то получается:
Код
CONNECT mail.ru:443 HTTP/1.1
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:36.0) Gecko/20100101 Firefox/36.0
Proxy-Connection: keep-alive
Connection: keep-alive
Host: mail.ru:443
т.е. я получил этот массив от браузера, и ничего не меняя, сразу же передаю

Добавлено через 2 минуты
если быть точным, то вот так:
C#
1
"CONNECT mail.ru:443 HTTP/1.1\r\nUser-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:36.0) Gecko/20100101 Firefox/36.0\r\nProxy-Connection: keep-alive\r\nConnection: keep-alive\r\nHost: mail.ru:443\r\n\r\n"
0
2735 / 2041 / 380
Регистрация: 22.07.2011
Сообщений: 7,731
08.04.2015, 03:47 15
Просто сравните через tcp снифер пакеты отправляемые вашим приложением и браузером , добейтесь идентичного результата. В общем , чем смог - помог ) , все нужные классы у вас есть , примеров вроде тоже хватает , дальше msdn+гугл. , ну или путем экспериментов.
0
27 / 27 / 8
Регистрация: 30.03.2010
Сообщений: 380
Записей в блоге: 1
08.04.2015, 04:12  [ТС] 16
посмотрел через CommView, и нашёл вероятную причину:
у меня в файле hosts стоит так скажем защита для всех программ adobe, чтоб не могли обратиться к серверу за проверкой подлинности.
и как видно на скрине, видимо когда я отправляю данные, он обращается к этому файлу и вытаскивает от туда activate.adobe.com
только я не пойму почему так происходит
Миниатюры
Отправить пакет данных через WebRequest  
0
27 / 27 / 8
Регистрация: 30.03.2010
Сообщений: 380
Записей в блоге: 1
09.04.2015, 14:13  [ТС] 17
посмотрел проект по ссылке Прокси для https - будет ли работать приведенный код?
всё работает, но только при включённом фидлере. как только выключаю его, то получаю тот же 400 bad request
ещё не могу понять, для чего эта часть:
и как это работает
C#
1
2
3
4
5
6
7
TcpClient client = new TcpClient(proxy, proxyPort);
            NetworkStream stream = client.GetStream();
 
            // Establish Tcp tunnel
            byte[] tunnelRequest = Encoding.UTF8.GetBytes(String.Format("CONNECT {0}:443  HTTP/1.1\r\nHost: {0}\r\n\r\n", host));
            stream.Write(tunnelRequest, 0, tunnelRequest.Length);
            stream.Flush();
потому что там указан
C#
1
2
string proxy = "127.0.0.1";//host;
            int proxyPort = 8888;//443;
и из за этого возникает у меня вопрос, почему создаётся соединение клиента с локалхостом на этот порт?

Добавлено через 3 часа 48 минут
Методом гугла и "тыка" смог сообразить такой вариант, работающий без фиддлера:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
using System;
using System.Text;
using System.Net.Sockets;
using System.Net.Security;
using System.Security.Cryptography.X509Certificates;
 
namespace SslTcpClient
{
    public class SslTcpClient
    {
        public static void Main(string[] args)
        {
            string host = "mail.ru";
            string proxy = host;
            int proxyPort = 443;
 
            byte[] buffer = new byte[2048];
            int bytes;
 
            // Connect socket
            TcpClient client = new TcpClient(proxy, proxyPort);
            NetworkStream stream = client.GetStream();
 
            // Wrap in SSL stream
            SslStream sslStream = new SslStream(stream,true,new RemoteCertificateValidationCallback(ValidateServerCertificate),null);
            sslStream.AuthenticateAsClient(host);
 
            // Send request
            byte[] request = Encoding.UTF8.GetBytes(String.Format("GET https://{0}/  HTTP/1.1\r\nHost: {0}\r\n\r\n", host));
            sslStream.Write(request, 0, request.Length);
            sslStream.Flush();
 
            // Read response
            do
            {
                bytes = sslStream.Read(buffer, 0, buffer.Length);
                Console.Write(Encoding.UTF8.GetString(buffer, 0, bytes));
            } while (bytes != 0);
 
            client.Close();
            Console.ReadKey();
        }
 
        public static bool ValidateServerCertificate(
              object sender,
              X509Certificate certificate,
              X509Chain chain,
              SslPolicyErrors sslPolicyErrors)
        {
            if (sslPolicyErrors == SslPolicyErrors.None)
                return true;
 
            Console.WriteLine("Certificate error: {0}", sslPolicyErrors);
 
            // Do not allow this client to communicate with unauthenticated servers.
            return false;
        }
    }
}
0
09.04.2015, 14:13
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.04.2015, 14:13
Помогаю со студенческими работами здесь

Отправить TCP пакет на заданный адрес
Есть tcp пакет в в хекс коде типа: 00 21 56 D8 DC 1B 00 16-36 95 AE AB 88 64 11 00 EA 98 00 2D...

Как отправить пакет с определенного порта?
Подскажите возможно ли отправить пакет с определенного порта?1

Как программно отправить udp пакет?
нужно отправить udp пакт на определенный url через сокеты что то не могу! кто может помогите!и...

Как маршрутизатор узнаёт кому какой пакет отправить
Здравствуйте! Недавно я начал играться с сетью, кидать туда-сюда сообщения через TCP. В общем всё...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru