Форум программистов, компьютерный форум, киберфорум
Наши страницы

Delphi и сети

Войти
Регистрация
Восстановить пароль
 
 
DonniGood
5 / 5 / 0
Регистрация: 03.07.2013
Сообщений: 106
#1

Как принять информацию от TCP сервера вычитать ключ который он прислал? - Delphi

10.09.2014, 17:17. Просмотров 1010. Ответов 23
Метки нет (Все метки)

Собственно, все в названии.
Есть так же нужный код на C#, но перевести не могу, нет скилла=)
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
public bool Check(string login, string pass)
        {
            Result = false;
            Connected = false;
 
            TcpClient tcp = new TcpClient();
            try
            {
                tcp.Connect(IP, Port);
            }
            catch { return false; }
 
            Socket skt = tcp.Client;
            Connected = skt.Connected;
            while (skt.Connected)
            {
                byte[] buf = new byte[0xFF];
                skt.Receive(buf);
                if (buf[0] == 0x01)
                {
                    List<byte> Send = new List<byte>();
 
                    byte[] key = new byte[0x10];
                    for (int i = 0; i < 0x10; i++) key[i] = buf[i + 3];
 
                    byte[] loginbt = Encoding.GetEncoding(1251).GetBytes(login);
                    byte[] hash = GetHash(key, login, pass);
                    Send.Add((byte)loginbt.Length);
                    Send.AddRange(loginbt);
                    Send.Add((byte)hash.Length);
                    Send.AddRange(hash);
                    Send.Add(0x00);
 
                    Send.Insert(0,(byte)Send.Count);
                    Send.Insert(0, 0x03);
 
                    skt.Send(Send.ToArray());
                    continue;
                }
 
                Result = buf[0] == 0x02;
                break;
            }
            skt.Close();
            return Result;
        }
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.09.2014, 17:17
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Как принять информацию от TCP сервера вычитать ключ который он прислал? (Delphi):

Как принять JSON на tcp сервере? - C++ Qt
Я с клиента андроид на tcp сервер qt хочу отправить JSON как на сервере методами Qt его можно принять?? И методы парсинга JSON какие есть??

Как правильно принять данные по TCP протоколу функцией recv? - C++
Всем добрый вечер! Пытаюсь реализовать получение данных с устройства через TCP. linux OS. Данные принимаются. Только не всегда...

Как правильно принять изображение JPG и записать в файл TCP - C++ Qt
Я с TCP клиента андроид передаю на сервер файл JPEG.Данные вроде отправляются нормально, но на сервере при приеме возникают проблемы. Вот...

Как принять информацию из БД - PHP БД
Код ищет в строке 123 и заменяет символы на &quot;ok&quot; потом выводит. Проверено. &lt;?php $text='abc123fed'; $search = '123'; ...

Как программно принять сертификат сервера https - C#
Привет! У меня есть код который проходит регистрацию, но у сервера просрочен сертификат как сделать так что бы программа не проверял...

Как принять почту в Thunderbird с VPS-сервера? - Ubuntu Linux
Всем доброго времени суток! Недавно взял VPS на Ubuntu 12.04, поставил туда ISPmanager Lite. Тот автоматом установил почтовый сервер...

23
mss
2599 / 2255 / 250
Регистрация: 24.12.2010
Сообщений: 13,725
11.09.2014, 21:52 #16
Цитата Сообщение от DonniGood Посмотреть сообщение
прочитано 52, как и нужно
На основании чего именно 52 ?
Это WireShark так говорит ? Приведи hex-дамп пришедшего пакета (те самые 52 байта), который ты увидел в WireShark ..
1
FIL
Модератор
3407 / 2545 / 490
Регистрация: 19.09.2012
Сообщений: 7,905
11.09.2014, 21:55 #17
Цитата Сообщение от DonniGood Посмотреть сообщение
И количество байтов прочитано 52
Это случайность. Данные надо накапливать.
И цикл должен быть до BytesReadInFact-1.
И str инициализировать надо.
1
mss
2599 / 2255 / 250
Регистрация: 24.12.2010
Сообщений: 13,725
11.09.2014, 22:06 #18
Цитата Сообщение от FIL Посмотреть сообщение
Данные надо накапливать
Если это самый входящий первый пакет, то что там накапливать ?
К тому же, если Buffer - локальная переменная, то крайне маловероятно, что после удачного чтения именно 52-х байт там вместо мусора окажется 52 нуля.

То ли то не первый пакет, то ли это совсем иные данные, не соответствующие заявленному выше протоколу ..

Цитата Сообщение от FIL Посмотреть сообщение
И str инициализировать надо
Если это самое первое по времени использование str, начиная со времени ее попадания в область видимости приведенного фрагмента кода, то нафига ? Она и так заведомо пустая в этот момент ..

Добавлено через 15 секунд
Цитата Сообщение от FIL Посмотреть сообщение
Данные надо накапливать
Если это самый входящий первый пакет, то что там накапливать ?
К тому же, если Buffer - локальная переменная, то крайне маловероятно, что после удачного чтения именно 52-х байт там вместо мусора окажется 52 нуля.

То ли то не первый пакет, то ли это совсем иные данные, не соответствующие заявленному выше протоколу ..

Цитата Сообщение от FIL Посмотреть сообщение
И str инициализировать надо
Если это самое первое по времени использование str, начиная со времени ее попадания в область видимости приведенного фрагмента кода, то нафига ? Она и так заведомо пустая в этот момент ..
0
DonniGood
5 / 5 / 0
Регистрация: 03.07.2013
Сообщений: 106
11.09.2014, 22:06  [ТС] #19
Вот то что присылает сервер 013210790000c000000000a7e4c6745d0600ce00010501001a333030303030366137363533663537393036353066376261383300
Что то я совсем запутался... http://pumpshooter.com/lNqTBxXa
0
FIL
Модератор
3407 / 2545 / 490
Регистрация: 19.09.2012
Сообщений: 7,905
11.09.2014, 22:15 #20
Цитата Сообщение от mss Посмотреть сообщение
Если это самый входящий первый пакет, то что там накапливать ?
А как ты отличишь первый пакет от непервого, обработчик-то один. Ему их все принимать.
И где гарантии, что весь первый пакет придет за один раз.
По str - аналогично - этот обработчик будет принимать все пакеты, а не только первый.

Добавлено через 58 секунд
Кстати, нигде не нашел: разве принимаемый пакет не может быть больше 256 байт?
0
DonniGood
5 / 5 / 0
Регистрация: 03.07.2013
Сообщений: 106
11.09.2014, 22:19  [ТС] #21
Пакет приходит только один, я уверен.
0
mss
2599 / 2255 / 250
Регистрация: 24.12.2010
Сообщений: 13,725
11.09.2014, 22:55 #22
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от FIL Посмотреть сообщение
обработчик-то один
Ну я так полагаю, что ТС привел данные о результатах самого первого чтения из канала сразу после установки соединения)
Если это не так, то тут и рассуждать не о чем - нет достоверных сведений о неукоснительном следовании протоколу..

Цитата Сообщение от FIL Посмотреть сообщение
И где гарантии, что весь первый пакет придет за один раз
Да нет никаких гарантий)
Но опять же - рассматривается тестовый пример в предположении что это самое первое чтение из потока после установки соединения.

Цитата Сообщение от FIL Посмотреть сообщение
принимаемый пакет не может быть больше 256 байт?
В дан.случае может. Но об этом потом.

Добавлено через 26 минут
Цитата Сообщение от DonniGood Посмотреть сообщение
Что то я совсем запутался
О-о-о, парень, да у тебя основательные проблемы в знании OSI ..
Сниффер-то тебе кажет дамп IP-дейтаграммы, а не дамп пэйлоуда в составе TCP-сегмента, инкапсулированного в IP-дейтаграмму !

Из дампа я вижу что поле KeyLen равно $1A (26.) и за ним следуют 26 байт собственно данных ключа:
3330303030303661373635336635373930363530663762613833

Откуда у тебя нули в буфере и почему приведенное содержимое строки при этом вполне соответствует дампу - ума не приложу.. Косяк где-то за пределами этого кода
1
DonniGood
5 / 5 / 0
Регистрация: 03.07.2013
Сообщений: 106
11.09.2014, 23:02  [ТС] #23
Мда... Все ооочень плохо. Рано мне еще сюда. Всем спасибо за ответы.
0
mss
2599 / 2255 / 250
Регистрация: 24.12.2010
Сообщений: 13,725
11.09.2014, 23:09 #24
Цитата Сообщение от FIL Посмотреть сообщение
А как ты отличишь первый пакет от непервого, обработчик-то один
В дан.случае я предполагвю что у ТС это первое срабатывание OnRead
Т.е. об аккумуляции пока вообще речь не идет - об этом чуть позже, когда ТС вдуплит разницу между тем что кажет WireShark и тем что он ожидает увидеть у себя в программе)

Добавлено через 1 минуту
Цитата Сообщение от DonniGood Посмотреть сообщение
Рано мне еще сюда
Может и рано)
Но уж коль скоро начал разбираться, то разберись до конца в уже полученной инф-ции !
А мы тебе в этом чем можем поможем, на то мы тут и протираем штаны)
1
11.09.2014, 23:09
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.09.2014, 23:09
Привет! Вот еще темы с ответами:

Как принять сообщения от сервера в нужные колонны в ListView? - Delphi
Помогите мне доделать программу клиент сервер, нужно отправить с сервера 3 разных текста с edt2 , edt3 , edt4 а в клиенте обработать и...

Как правильно передать и принять файлы на (с) Ftp-сервера? - C#
Как правильно передать и принять файлы на (с) Ftp-сервера?

Подскажите самый простой пример TCP клиента и TCP сервера - C++ Qt
Подскажите пример самого простого TCP клиента и TCP сервера.

Не приходит ответ на TCP клиент андроид с TCP сервера Qt - C++ Qt
У меня есть TCP клиент андроид и TCP сервер Qt с клиента на сервер сообщения доходят нормально. Ну а с сервера на клиент сообщения(ответы)...


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

Или воспользуйтесь поиском по форуму:
24
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru