|
Новичкам Информация для всех новичков, новичкам рекомендуется задавать свои вопросы здесь |
|
Опции темы | Поиск в этой теме | Опции просмотра |
03.10.2012, 16:52 | #1 |
Ученый
Регистрация: 07.03.2010
Адрес: Беларусь,Брест
Сообщений: 188
Сказал(а) спасибо: 131
Поблагодарили 34 раз(а) в 27 сообщениях
|
winsock и с++
Сижу вот и разбираю как соединяется клиент с сервером. Использую библиотеки winsock.
вот кое что начертал: Код:
int PORT = 3724; WSADATA data; SOCKET hSocket; sockaddr_in sock_in; void main() { if (WSAStartup(0x0202, &data)==0) { std::cout<<"initialization socket true\n"; hSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_IP); if (hSocket==INVALID_SOCKET) { std::cout<<"ERROR OPEN SOCKET\n"; } sock_in.sin_family = AF_INET; sock_in.sin_port = htons(PORT); sock_in.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); int i = bind(hSocket, (sockaddr*)(&sock_in), sizeof(sock_in)); if (i==0) { std::cout<<"bind port 3724\n"; } int l = listen(hSocket, SOMAXCONN); if (l==0) { std::cout<<"listen port 3724\n"; } /* дальше как я понимаю должно отправляться клиенту что-что? Или же клиент должен отослать что-то? */ } std::cin.get(); } Вообще какие данные передаются далее? Или мне надо ждать пока клиент не передаст что то в сокет? Если это так то покажите на примере кода... добавил такую конструкцию: Код:
while(true) { try { throw -1; int bytesReceived = recv(hSocket, buffer, sizeof(buffer), 0); std::cout<<bytesReceived; } catch (int x) { } } спустя пол часа... все теперь понял, оказалось создается новый сокет, и конструкция не понадобилась....Буду пока дальше копать... в данный момент код выглядит так: Код:
int RS_PORT = 3724; WSADATA data; SOCKET hSocket, newSocket; sockaddr_in sock_in; void main() { if (WSAStartup(0x0202, &data)==0) { std::cout<<"initialization socket true\n"; hSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_IP); if (hSocket==INVALID_SOCKET) { std::cout<<"ERROR OPEN SOCKET\n"; } sock_in.sin_family = AF_INET; sock_in.sin_port = htons(RS_PORT); sock_in.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); int i = bind(hSocket, (sockaddr*)(&sock_in), sizeof(sock_in)); if (i==0) { std::cout<<"bind port 3724\n"; } int l = listen(hSocket, SOMAXCONN); if (l==0) { std::cout<<"listen port 3724\n"; } int k = sizeof(sock_in); newSocket = accept(hSocket, (sockaddr*)&sock_in, &k); if (newSocket==INVALID_SOCKET) { std::cout<<"error"; } else { char buffer[128]; int bytesReceived; std::cout<<"socket true\n"; bytesReceived = recv(newSocket, buffer, sizeof(buffer), 0); std::cout<<bytesReceived; } //closesocket(hSocket); // закрываем сокет //WSACleanup(); // освобождение } std::cin.get(); }
__________________
sql-language.ru Последний раз редактировалось lovepsone; 03.10.2012 в 18:26. |
03.10.2012, 18:33 | #2 |
Ученый
Регистрация: 07.03.2010
Адрес: Беларусь,Брест
Сообщений: 188
Сказал(а) спасибо: 131
Поблагодарили 34 раз(а) в 27 сообщениях
|
Собственно уже назрел вопрос... Что теперь нужно отправить клиенту, или что нужно отсылать клиенту в ответ?
А также будет ли создаваться новый сокет ?
__________________
sql-language.ru Последний раз редактировалось lovepsone; 03.10.2012 в 18:49. |
03.10.2012, 18:50 | #3 |
Пользователь
Регистрация: 06.01.2012
Сообщений: 98
Сказал(а) спасибо: 12
Поблагодарили 33 раз(а) в 21 сообщениях
|
получил CMD_AUTH_LOGON_CHALLENGE.
отправлять SMD_AUTH_LOGON_CHALLENGE. оно тебе точно надо? |
04.10.2012, 19:36 | #4 |
Ученый
Регистрация: 07.03.2010
Адрес: Беларусь,Брест
Сообщений: 188
Сказал(а) спасибо: 131
Поблагодарили 34 раз(а) в 27 сообщениях
|
C windows sock я разобрался... Теперь прошу помощи по sha1. Пытаюсь использовать OpenSSL, нечего не понимаю. Может есть у кого нить книга или что то в этом роде..
__________________
sql-language.ru |
16.10.2012, 18:40 | #5 |
Ученый
Регистрация: 07.03.2010
Адрес: Беларусь,Брест
Сообщений: 188
Сказал(а) спасибо: 131
Поблагодарили 34 раз(а) в 27 сообщениях
|
Объясните мне плиз... Получил я пакет CMD_AUTH_LOGON_CHALLENGE
Я так понял кроме логина (еще я смог достать версию клиента, и платформу ОС)с этого пакета можно нечего не брать. Далее я формирую пакет SMD_AUTH_LOGON_CHALLENGE для отправки клиенту... Побайтно я формировал поля B,N,g,S. Как теперь формировать поле unk3(записал пока туда нули, но не думаю что это правильно, хотя клиент принимает, отправляет мне пакет и ждет следующего пакета)? За что это поле отвечает?
__________________
sql-language.ru Последний раз редактировалось lovepsone; 17.10.2012 в 13:55. |
16.10.2012, 22:51 | #6 |
WowCore Dev
Регистрация: 31.03.2010
Сообщений: 468
Сказал(а) спасибо: 73
Поблагодарили 106 раз(а) в 70 сообщениях
|
вообще говоря оттуда все данные нужны.
по какому формату то работаешь? кто такой unk3 и где он в пакете? мы ж не телепаты. не сочтите за кэпа, но прежде чем постить вопрос, неплохо было бы его самому прочитать (для некоторых раза два-три) и попытаться понять что написано. все ли данные и ссылки включены в вопрос? вот щас что нам предлагается? погуглить порыть формат челленжа и кто есть такой унк3? да никто не будет это делать... вот если бы были все необходимые ссылки в вопросе, что бы можно было тыкнуть и посмотреть, я думаю многие бы нашлись что сказать. Код:
T_AUTH_LOGON_CHALLENGE = record // from client ErrorCode: byte; Size: word; Client: string; Version1: byte; Version2: byte; Version3: byte; Build: word; CPU: longint; OS: longint; Lang: string; TimeZone: longint; IP: longint; LoginLen: byte; Login: string; end; T_AUTH_LOGON_CHALLENGE_RESPONSE = record // from server Answer: byte; ErrorCode: byte; SRP6_B: array[0..31] of byte; SRP6_g_len: byte; SRP6_g: array[0..0] of byte; SRP6_N_len: byte; SRP6_N: array[0..31] of byte; SRP6_Salt: array[0..31] of byte; SRP6_CRC: array[0..15] of byte; Security: byte; // Possible values: 0 - None, 1 - PIN, 2 - Matrix, 4 - Require Security Token SecurityPIN_unk1: longint; SecurityPIN_unk2: uInt64; SecurityPIN_unk3: uInt64; SecurityMATRIX_unk1: byte; SecurityMATRIX_unk2: byte; SecurityMATRIX_unk3: byte; SecurityMATRIX_unk4: byte; SecurityMATRIX_unk5: uInt64; SecurityTOKEN_unk1: byte; end; |
16.10.2012, 23:04 | #7 |
Ученый
Регистрация: 07.03.2010
Адрес: Беларусь,Брест
Сообщений: 188
Сказал(а) спасибо: 131
Поблагодарили 34 раз(а) в 27 сообщениях
|
вот пример
Код:
User="NINAR1" aut="NINAR1:NINAR2" B = B3060A37D50CA642F5C521C2C9A4F76B8FDBF993C1354073BFA96BC25949D04B 32bytes ;Server's public key g = 07 1byte N = B79B3E2A87823CAB8F5EBFBF8EB10108535006298B5BADBD5B53E1895E644B89 32bytes ;modulus Salt = 731ABA56A18D780915E97E6F076204CBE4A7D9793E1443E5E15A6C80DD95A4D5 32bytes unk3 = F92CA0BCA6E28295E594D58C4D2536CD 16bytes
__________________
sql-language.ru Последний раз редактировалось lovepsone; 16.10.2012 в 23:07. |
17.10.2012, 00:12 | #8 |
WowCore Dev
Регистрация: 31.03.2010
Сообщений: 468
Сказал(а) спасибо: 73
Поблагодарили 106 раз(а) в 70 сообщениях
|
SRP6_CRC
насколько мне известно, клиент читает, но нигде не использует это. следовательно слать здесь мы можем все что угодно. ну, я шлю нули. |
17.10.2012, 15:49 | #9 |
Ученый
Регистрация: 07.03.2010
Адрес: Беларусь,Брест
Сообщений: 188
Сказал(а) спасибо: 131
Поблагодарили 34 раз(а) в 27 сообщениях
|
ясно! спасибо! Может есть другие мнения?
.... Далее пытаюсь разбирать... приходит мне пакет в размере 75 байт Код:
01 AUTH_LOGON_PROOF 26 9F FA 00 B8 9E B5 82 83 0A 8E 44 0E 26 0D C5 A 32 byte 23 03 09 7F 6C 28 92 40 3B 1E F9 A7 54 2C DA 0D DC CC 67 0A D9 C0 C0 A2 E6 25 A0 A3 92 7D 05 76 M1 20 byte 16 19 1C 35 6C 5A 98 E8 A7 53 08 4F DC F7 09 B8 F9 1C 4C 84 CRC hash AA 24 42 00 00 number_of_keys И еще плиз подскажите.. 1. Получил запрос на CMD_AUTH_LOGON_CHALLENGE от клиента 2. отправил CMD_AUTH_LOGON_CHALLENGE клиенту 3. далее получил запрос на CMD_AUTH_LOGON_PROOF (далее пока не получается) от клиента 4. далее думаю что нужно оправить CMD_AUTH_LOGON_PROOF 5. далее думаю что приходит пакет CMD_REALM_LIST 5. далее наверное нужно отправить CMD_REALM_LIST (то есть 0х10 ) и тд... пакеты CMD_AUTH_RECONNECT_CHALLENGE и CMD_AUTH_RECONNECT_PROOF я как понимаю что ненужно отправлять если все заходит далее норм? Пока я не могу собрать пакет CMD_AUTH_LOGON_PROOF...
__________________
sql-language.ru Последний раз редактировалось lovepsone; 17.10.2012 в 16:16. |
18.10.2012, 16:58 | #10 | |
Ученый
Регистрация: 07.03.2010
Адрес: Беларусь,Брест
Сообщений: 188
Сказал(а) спасибо: 131
Поблагодарили 34 раз(а) в 27 сообщениях
|
Нашел статью по SRP-6 тык ....
там сказано: Цитата:
В общем я запутался... и еще вопрос: Если я клиенту присылаю не верные первые данные(CMD_AUTH_LOGON_CHALLENGE), то он должен мне присылать что то в ответ? Вопрос возник потому - что у меня при сравнении M1(которые прислал клиент на подтверждение авторизации) и M (вычисленные мною) не совпадают, хотя вычисляю все верно.
__________________
sql-language.ru Последний раз редактировалось lovepsone; 18.10.2012 в 17:22. |
|
18.10.2012, 23:59 | #11 |
WowCore Dev
Регистрация: 31.03.2010
Сообщений: 468
Сказал(а) спасибо: 73
Поблагодарили 106 раз(а) в 70 сообщениях
|
по поводу "что нужно отправить далее" - нужно почитать спецификацию SRP6. ну собственно начали читать...
клиент не валидирует данные, это делает сервер. клиент просто присылает свою часть данных на сервер, а сервер принимает решение пускать / не пускать. и сервер будет отвечать клиенту "окей" / "давай до свидания". если хеши не совпадают, значит вычислено неверно. я кэп? есть же куча готового кода, и сишный мангос, и мангос на джаве, и дельфевый сандбок. неужели там непонятно написано? и протокол читается, и какие данные следует отправлять, и алгоритмы. сидите ведь на всем готовом. тогда, в 2005ом этого ничего не было. если у вас столько вопросов на этом этапе, то сколько же их будет дальше... помню, авторизацию я осилил за пару недель практически без вопросов. по настоящему вопросы стали возникать после входа в мир, до сего момента - все игрушки. хоть и трудоемкие. Последний раз редактировалось RomanRom2; 19.10.2012 в 00:03. |
19.10.2012, 08:51 | #12 |
Ученый
Регистрация: 07.03.2010
Адрес: Беларусь,Брест
Сообщений: 188
Сказал(а) спасибо: 131
Поблагодарили 34 раз(а) в 27 сообщениях
|
Для меня готовое брать - не вариант. Уже дашел до выбора реалма. Спасибо вашему сендбоксу. Если брать готовое с мангоса, то придется рассматривать классы такие как ByteBuffer, BufferedSocket и тд. Я же пытаюсь своими силами. Сейчас начал разбирать ACE (ADAPTIVE Communication Environment), так как winsock мне посоветовали что не удобно использовать, и думаю добавить себе эту библиотечку. Пока пыркаюсь на месте из за плохого знания английского, но думаю что разберусь.
__________________
sql-language.ru Последний раз редактировалось lovepsone; 19.10.2012 в 08:53. |
|
|