5 / 5 / 0
Регистрация: 03.07.2013
Сообщений: 106
1

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

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

Author24 — интернет-сервис помощи студентам
Собственно, все в названии.
Есть так же нужный код на 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)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.09.2014, 17:17
Ответы с готовыми решениями:

TCP клиент: Не получается принять сообщение от сервера
Добрый день, хочу попробовать реализовать на Indy обмен с сервером. Я ему посылаю сообщение, он...

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

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

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

23
2664 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
10.09.2014, 21:12 2
Не проще ли будет реализовать все это по формальному описанию протокола, а не тупо портируя в делфи сомнительный по надежности чужой код ?
0
5 / 5 / 0
Регистрация: 03.07.2013
Сообщений: 106
10.09.2014, 23:03  [ТС] 3
Может и проще, но... я в этой теме(tcp) совершенно новенький, так что толком ничего не знаю. И обгуглили я уже много всего, но ничего кроме банальной передачи текста(а это просто) я не нашел...
0
2664 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
10.09.2014, 23:08 4
Так оно у тебя есть или оно у тебя нет - формальное описание протокола ?
1
5 / 5 / 0
Регистрация: 03.07.2013
Сообщений: 106
10.09.2014, 23:13  [ТС] 5
Вот блин, я так глуп. Намекните что это?)
0
2664 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
10.09.2014, 23:25 6
Ну к примеру:

1. Клиент (К) устанавливает соединение с сервером (С)
2. (К) отправляет (С) сообщение "Привет !"
3. (С) в ответ на именно такое полученное сообщение отправляет (К) сообщение "Пока !"
4. (С) разрывает соединение с (К)

Это последовательные этапы протокола информационного обмена между (К) и (С).

Заметь что в них вообще не идет речь о способах доставки сообщений от (К) к (С) и в обратном направлении, ибо это транспортный (а не прикладной) уровень инф.взаимодействия. Это м.б. и TCP и любой другой протокол - суть от этого не меняется: (С) отвечает (К) только при условии что получит именно такое-то предопределенное протоколом сообщение, и ответит он на это сообщение именно таким-то предопределенным тем же протоколом сообщением.
1
5 / 5 / 0
Регистрация: 03.07.2013
Сообщений: 106
10.09.2014, 23:42  [ТС] 7
Ага, значит у меня так.
1. Клиент подключается к серверу
2. Сервер отправляет клиенту пакет в котором содержится ключ для HMACMD5 хеширования + еще кое какую инфу.
3. Клиент хеширует данные и отправляет их серверу.
4. Сервер отправляет клиенту результат обработки.
И моя проблема состоит уже во 2 пункте. Не могу я вычитать ключ из этого пакета...
Вот такой у него вид

Добавлено через 17 секунд
C#
1
2
3
4
5
byte KeyLen;
byte[KeyLen] Key;
byte AuthType;
byte[4] ServerVersion;
byte Bonus;
0
Модератор
3490 / 2613 / 741
Регистрация: 19.09.2012
Сообщений: 7,974
10.09.2014, 23:45 8
DonniGood, ты вообще на чем пишешь?
Это раздел Delphi - если что...
1
5 / 5 / 0
Регистрация: 03.07.2013
Сообщений: 106
10.09.2014, 23:48  [ТС] 9
На делфях я пишу, но цепляюсь за куски C# кода найденного на просторах интернета=)
0
2664 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
11.09.2014, 09:17 10
byte KeyLen;
byte[KeyLen] Key;
byte AuthType;
byte[4] ServerVersion;
byte Bonus;

Итого N = 7 + KeyLen байт.

Последовательность приема пакета:

1. Читаешь 1 байт - из него получаешь значение KeyLen.
2. Читаешь KeyLen байт
3. Читаешь оставшиеся N - KeyLen - 1 байт

Все, пакет принят, можно переходить к п.3 своего протокола
1
5 / 5 / 0
Регистрация: 03.07.2013
Сообщений: 106
11.09.2014, 15:02  [ТС] 11
Спасибо огромное! И пожалуй последний вопросик. Как прочитать этот самый первый байт? Опять же понятной инфы я не нашел, одни чаты везде.
0
2664 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
11.09.2014, 15:23 12
Delphi
1
2
3
4
5
6
7
8
9
10
11
var
  BytesReadInFact: Integer;
  Buffer: Byte;
..
  BytesReadInFact := Socket.ReceiveBuf(Buffer, SizeOf(Buffer));
  case  BytesReadInFact of
    0: .. ничего не прочитано - соединение закрыто по инициативе партнера
    -1: .. ничего не прочитано - возникла ошибка в канале соединения с партнером
  else
    .. в переменную Buffer прочитано BytesReadInFact байт
  end;
0
5 / 5 / 0
Регистрация: 03.07.2013
Сообщений: 106
11.09.2014, 16:33  [ТС] 13
Ага, а сам ключ и все остальное уже читать из переменной Buffer, так?
0
2664 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
11.09.2014, 16:48 14
Да, так
0
5 / 5 / 0
Регистрация: 03.07.2013
Сообщений: 106
11.09.2014, 21:45  [ТС] 15
Ну как бы у меня что то заработало
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var
 BytesReadInFact,i: Integer;
  Buffer: array[0..255] of Byte;
  str:string;
begin
BytesReadInFact := Socket.ReceiveBuf(Buffer,SizeOf(Buffer));
case  BytesReadInFact of
 0: mmo1.Text:='Error 0';
 -1: mmo1.Text:='Error -1';
else
  for I := 0 to BytesReadInFact do
  str:=str+inttostr(Buffer[BytesReadInFact]);
  mmo1.Text:='Данные '+str;
end;
end;
И количество байтов прочитано 52, как и нужно, но... Это 52 ноля. Смотрел через WireShark, там все вроде нормально. В чем я еще напортачил не подскажете?
0
2664 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
11.09.2014, 21:52 16
Цитата Сообщение от DonniGood Посмотреть сообщение
прочитано 52, как и нужно
На основании чего именно 52 ?
Это WireShark так говорит ? Приведи hex-дамп пришедшего пакета (те самые 52 байта), который ты увидел в WireShark ..
1
Модератор
3490 / 2613 / 741
Регистрация: 19.09.2012
Сообщений: 7,974
11.09.2014, 21:55 17
Цитата Сообщение от DonniGood Посмотреть сообщение
И количество байтов прочитано 52
Это случайность. Данные надо накапливать.
И цикл должен быть до BytesReadInFact-1.
И str инициализировать надо.
1
2664 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
11.09.2014, 22:06 18
Цитата Сообщение от FIL Посмотреть сообщение
Данные надо накапливать
Если это самый входящий первый пакет, то что там накапливать ?
К тому же, если Buffer - локальная переменная, то крайне маловероятно, что после удачного чтения именно 52-х байт там вместо мусора окажется 52 нуля.

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

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

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

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

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

Добавлено через 58 секунд
Кстати, нигде не нашел: разве принимаемый пакет не может быть больше 256 байт?
0
11.09.2014, 22:15
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.09.2014, 22:15
Помогаю со студенческими работами здесь

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

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

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

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


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

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

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