Mra протокол.помогите разобраться

  • Автор темы Автор темы ReindeeR
  • Дата начала Дата начала
и ноль,и не ноль пробовал.

зы.
наверное дело в том,что там еще заголовок стучиться+80 байт :blink:
оказалось это пришли данные о только что подсоединившеся юзвере,
его ник,сколько писем и т.д.Обнаружил чисто случайно это/
D описании протокола ниче по этому поводу не сказано,
типа после автризации к вам придет MRIM_CS_USER_INFO. :(

Или не влияет,что данные не все еще приняты и идет отправка?
 
ReindeeR
Взаимодействие с сервером происходит поверх постоянно установленного tcp-соединения посредством асинхронного обмена командами. Инициатором установления соединения может быть только клиент, команды могут посылаться как клиентом, так и сервером.
Так что, по идее, приложение должно быть всегда готовым к приёму (непрошенных) пакетов с сервера. Можно уже писать здоровый switch для обработки команд с сервера :(

Или не влияет,что данные не все еще приняты и идет отправка?
утверждает, что "socket-to-socket virtual connection, is established with a remote client, providing a duplex byte stream", т.е. данные могут идти одновременно в обоих направлениях.
 
Пытаюсь получить информацию о пользователе.
Описание
Пакет: Информация о пользователе

Имя пакета: MRIM_CS_USER_INFO
Тип пакета: sc
Параметры:

LPS, LPS, ... ##name1, value1, name2, value2, ... ## дополнительная информация о пользователе, имя параметра, значение параметра, имя параметра, значение параметра, ... На данный момент определены MESSAGES.TOTAL - количество писем в ящике, MESSAGES.UNREAD - количество непрочитанных писем в ящике, MRIM.NICKNAME - ник пользователя
В заголовке указан размер данных в 80 байт.
получаю MESSAGES.TOTAL, MESSAGES.UNREAD и MRIM.NICKNAME
и того 56 байт.Думаю че за фигня,пытаюсь получить длину следующих данных.
Код:
iResult=recv(mySock,(char*)&bufSize,sizeof(bufSize),0);
cout << bufSize << endl;
и вот это приходит
bufSize=3735928559
:blink:
где я им такой буфер возьму? :angry: ))
WSAGetLastError() молчит,все в порядке.
 
Ох-хо-хо... :angry:
Код:
#define CS_MAGIC	0xDEADBEEF		// Клиентский Magic ( C <-> S )
Это начало нового пакета...
 
:angry: мда..
Я когда прочитал deadbeef я чуть со стула не упал,
о том,что это они так мэджик обозначили мне и в голову уже придти не могло.
шутники мля..
 
я чето не понял.
пришел заголовок MRIM_CS_USER_INFO
размер пакета=80 байт.
принимаю данные,вдруг туда вклинивается заголовок MRIM_CS_USER_INFO
размер пакета=28 байт.
56 из обещанных 80 я принял,
80-56=24 байта еще должны по идее придти.
но приходит еще пакет размером размером 28.
итого перебор 4 байта.
Еще как я догадываюсь,скоро припрется контакт лист :angry:

зы.чуть не забыл.
после 56 байт приходит пакет MRIM_CS_USER_STATUS
Код:
Пакет: Смена статуса другого пользователя 

Имя пакета: MRIM_CS_USER_STATUS
Тип пакета: sc
Параметры:

UL ## status ## новый статус пользователя ##

STATUS_OFFLINE ## Пользователь отключен от сети Агента
STATUS_ONLINE ## Пользователь находится в сети
STATUS_AWAY ## Пользователь в сети, но отошел от компьютера
STATUS_UNDETERMINATED ## Настройки пользователя запрещают показывать его статус
STATUS_FLAG_INVISIBLE ## Пользователь находится в сети, но невидим для всех, кроме привилегированных пользователей из его списка видимости.
LPS ## user ## email сменившего свой статус пользователя 

Описание: Это сообщение отправляется сервером при смене статуса пользователям всем тем, у кого он находится в контакт-листе (за исключением группы "Жду Авторизации" и тех, кого он включил в список игнорируемых или невидящих). Данное сообщение может быть доставлено клиенту ДО получения им контакт-листа. В такой ситуации оно должно игнорироваться.
а как игнорировать?можно впринципе буфер большой выделить и забить все туда сразу :blink:
но кто их знает,че они там еще пришлют,вдруг че пропущу важное.
 
А как полностью выглядит принятое по MRIM_CS_USER_INFO? (ник можно звёздочками)
 
Код:
iResult=recv(mySock,(char*)&packFrom,sizeof(packFrom),0);		  //Пришел пакет
if(iResult>0 && packFrom.msg == MRIM_CS_USER_INFO)
{
int sizeData=packFrom.dlen;							//записываю скока байт обещают
int realSizeData=0;						 //в переменную будет дописываться размер принятых данных

iResult=recv(mySock,(char*)&bufSize,sizeof(bufSize),0);		 //в bufSize записываем длину следующей строки.
char msgTotal[4096];
iResult=recv(mySock,msgTotal,bufSize,0);		//в переменной msgTotal будет строка "MESSAGES.TOTAL"
realSizeData+=iResult;

iResult=recv(mySock,(char*)&bufSize,sizeof(bufSize),0);	 //в bufSize записываем длину следующей строки.
char numMsgTotal[4096];
iResult=recv(mySock,numMsgTotal,bufSize,0);	 //приходит кол-во MESSAGES.TOTAL в виде строки.В моем случае это 81
realSizeData+=iResult;
printf("%s = %s\n",msgTotal,numMsgTotal);

iResult=recv(mySock,(char*)&bufSize,sizeof(bufSize),0);		 
char msgUnread[4096];
iResult=recv(mySock,msgUnread,bufSize,0);		 //строка "MESSAGES.UNREAD"
realSizeData+=iResult;

iResult=recv(mySock,(char*)&bufSize,sizeof(bufSize),0);	 //Количетсво непрочтенных писем
char numMsgUnread[4096];
iResult=recv(mySock,numMsgUnread,bufSize,0);		 //приходит кол-во MESSAGES.UNREAD в виде строки.В моем случае это 1
realSizeData+=iResult;
printf("%s = %s\n",msgUnread,numMsgUnread);

iResult=recv(mySock,(char*)&bufSize,sizeof(bufSize),0);	  //получаем строку "MRIM.NICKNAME
char nickName[4096];
iResult=recv(mySock,nickName,bufSize,0);								 
realSizeData+=iResult;

iResult=recv(mySock,(char*)&bufSize,sizeof(bufSize),0);	 //ну и получаем сам ник
char nick[4096];
iResult=recv(mySock,nick,bufSize,0);
realSizeData+=iResult;
printf("%s = %s \n",nickName,nick);

printf("Ожидаемый размер данных= %d \n Размер полученных данных = %d \n",sizeData,realSizeData); // чтобы сразу было видно.
}
в результате получаем
MESSAGES.TOTAL = 81
MESSAGES.UNREAD = 1
MRIM.NICKNAME = ***********
Ожидаемый размер данных= 80
Размер полученных данных = 56

1 вопрос,нафига такие вот char nickName[4096]; ?
потому что если массив будет меньше,даже при 2048,
в конец добавляется много всяких значков и прочей лабуды,
иногда вообще захавает конец строки и всяких значков напехается.
Почему,не знаю,вот и спрашиваю. :blink:

ну а так вроде все по коду понятно остальное.
извиняюсь за названия переменных :angry:
 
Код:
iResult=recv(mySock,(char*)&bufSize,sizeof(bufSize),0);		 //в bufSize записываем длину следующей строки.
realSizeData+=iResult;  //<--- Добавить это. И так шесть раз. 6*4 = 24 "потерянных" байта
char msgTotal[4096];	 
iResult=recv(mySock,msgTotal,bufSize,0);		//в переменной msgTotal будет строка "MESSAGES.TOTAL"
realSizeData+=iResult;

Насчёт выделения 4кБ для буфера - можно и меньше, конечно - лишь бы хватало.
А ещё лучше -- выделять ровно столько, сколько необходимо:
Код:
char* msgTotal = (char*)malloc(bufSize+1);
msgTotal[bufSize]='\0';
Сразу получится нормальная СИшная строка. Только потом нужно вовремя освободить память: free(mgsTotal).
 
в том то и дело,
указываю меньше 4 кб,
всякая фигня оказывается в строке
 
Фигня, очевидно, показывается из-за того, что C/C++ понимает строки как массивы, завершающиеся нулём, а mail.ru их понимает как (4 байта длины)+(массив указанной длины, без нуля в конце).
 
ну ладно,это не так важно пока что.
что делать с этими пакетами,которые идут как-то не так.
щас попробую до конца все принять,пока не успокоятся))
 
Yason
вам памятник надо ставить за истреблении нубства в программировании. :)
спс огромное,дальше надеюсь сам разберусь уж как-нибудь. :huh:
 
ыыы,авторизировался B) )))
щас буду пробовать таймер установить.
Потоки=темный лес для меня пока что.

зы.
как синхронизировать все это,чтобы косяков не было? :wacko:

ап.
Таймер использовать не получилось,так как он сразу убивается у меня.
Всмысле запускаю таймер,выполняется только первый раз при запуске,
а потом программа завершается,и абсолютно пофиг,что там таймер запущен.

ну а поток создать у меня тем более не получается.
ошибок вылезает хз скока.
Мне надо передать в функцию потока сокет и интервал пинга.
А если учитывать то,что про потоки я прочитал несколько часов назад,
для меня эта задача вообще невыполнимая :ph34r:
слушай, привет, это, помоги мне тут с авторизацией) :) а то я вижу ты уже это сделал) а у меня тугова-то чё-т......посылаю всё как надо, но ничего в ответ :angry: ....а если послать MRIM_CS_HELLO хоть тысячу раз, он стоолько же раз вернёт MRIM_CS_HELLO_ACK(значит заголовок рабочий)

вот сам код:
Код:
void AuthMe(SOCKET RemoteSocket)
{
mrim_packet_header_t LoginPacket;
LoginPacket.dlen=0;
LoginPacket.from=0;
LoginPacket.fromport=5050;
LoginPacket.magic=CS_MAGIC;
LoginPacket.msg=MRIM_CS_LOGIN2;
LoginPacket.proto=PROTO_VERSION;
LoginPacket.seq=21;
send(RemoteSocket, (char*)&LoginPacket, sizeof(LoginPacket), NULL);

LoginPacket.dlen=20;
LoginPacket.seq=22;
send(RemoteSocket, (char*)&LoginPacket, sizeof(LoginPacket), NULL);
send(RemoteSocket, "kiber_shurik@mail.ru", 20, NULL);


LoginPacket.dlen=16;
LoginPacket.seq=23;
send(RemoteSocket, (char*)&LoginPacket, sizeof(LoginPacket), NULL);
send(RemoteSocket, "****************", 16, NULL);

LoginPacket.dlen=sizeof(STATUS_FLAG_INVISIBLE);
LoginPacket.seq=24;
send(RemoteSocket, (char*)STATUS_FLAG_INVISIBLE, sizeof(STATUS_FLAG_INVISIBLE), NULL);
send(RemoteSocket, "****************", 16, NULL);

LoginPacket.dlen=15;
LoginPacket.seq=25;
send(RemoteSocket, (char*)&LoginPacket, sizeof(LoginPacket), NULL);
send(RemoteSocket, "ABC, Матрёшкин©", 15, NULL);

ZeroMemory(&LoginPacket, sizeof(LoginPacket));
for(int i=0; i<INFINITE; i++)
{
Sleep(100);
if(recv(RemoteSocket, (char*)&LoginPacket, sizeof(LoginPacket), NULL)>0)
{
MessageBox(NULL, _T("Incoming data!"), NULL, NULL);
}
}
}
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!