Пытаюсь понять как работает.Пока ничего невыходит.Абсолютно непонятно как пакеты формировать Пробывал так Код (Text): int _tmain(int argc, _TCHAR* argv[]) { SOCKET s;SOCKADDR_IN adr;WSADATA wsd; WSAStartup(MAKEWORD(2,0),&wsd); hostent *h; char Ip[1024]; char *datain=new char[1024*1024]; memset(datain,NULL,1024*1024); h=gethostbyname("mrim.mail.ru"); sprintf(Ip,"%d.%d.%d.%d",(unsigned char)h->h_addr_list[0][0],(unsigned char)h->h_addr_list[0][1],(unsigned char)h->h_addr_list[0][2],(unsigned char)h->h_addr_list[0][3]); adr.sin_family=AF_INET; adr.sin_addr.s_addr =inet_addr(Ip); adr.sin_port = htons(2042); s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); connect( s,(sockaddr *)&adr, sizeof(adr)); recv(s,datain,1024*1024,0); closesocket(s); int mraport; char *buf=new char[1024]; strtok(datain,"\n"); strcpy(buf,strstr(datain,":")); buf+=1; mraport=atoi(buf); buf-=1; delete []buf; strtok(datain,":"); strcpy(Ip,datain); memset(datain,NULL,strlen(datain)+1); adr.sin_family=AF_INET; adr.sin_addr.s_addr =inet_addr(Ip); adr.sin_port = htons(mraport); s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); connect( s,(sockaddr *)&adr, sizeof(adr)); mrim_packet_header_t data; mrim_packet_header_t _data; mrim_connection_params_t params; data.dlen=0; data.msg=MRIM_CS_HELLO; data.magic=PROTO_VERSION; data.seq=0; data.magic=CS_MAGIC; data.fromport=mraport; data.from=0; cout<<send(s,(char*)&data,sizeof(data),0)<<endl; int received=0;WSASetLastError(0); received=recv(s,(char*)&_data,sizeof(_data),0); cout<<received<<_data.seq<<endl; printf("%d",WSAGetLastError()); closesocket(s); getch(); WSACleanup(); return 0; } А ответ не бубум .То есть recv возвращяет 0.Как же надо правильно формировать эти пакеты?
Так, ну, во-первых, MMP (Mail.Ru Messaging Protocol). Далее: fromport в заголовке ставить не обязательно (оно вроде только в P2P используется, но могу и ошибаться). mrim_connection_params_t – извращение даже для MMP (несмотря на то, что в официальном хэдере есть), читай по-нормальному – это всего лишь один UL. Пакеты формировать: пишешь Packet_AppendUL, Packet_AppendLPS (на С++ это будет класс Packet и <<, переопределённый для добавления данных в пакет), когда пакет готов, обновляешь заголовок и выдаёшь пакет байтами. Читать в том же стиле (но сначала копить в буфере минимум sizeof(mrim_packet_header_t) байтов, читать заголовок, потом копить ещё mrim_packet_header.dlen байтов и затем кормить полученный пакет парсеру – а у тебя пока нет никаких гарантий даже того, что recv прочитает весь заголовок). И ещё далее: MRIM_CS_HELLO_ACK тебе приходит (seq там такой же, как и у твоего запроса, поэтому и 0), received = 44 (ты не перепутал цифры в консоли?). Шли логин с паролем.
Мне ничего не приходит .Тута received=recv(s,(char*)&_data,sizeof(_data),0); НУЛЬ ,а в _data.seq мусор как и в _data.dlen И что самое странное сервер сокет незакрывает,бред какой то.
Я к сожалению тоже пользуюсь агентом и что-то он вызывает у меня странные подозрения. Как научусь пользоваться отладчиком - обязательно пройдусь! По-моему, мэил как гугль хочет захватить мир). Агент постоянно обращается к серваку(как правило соединений туча!к разным адресам!), причем через чужие процессы. Файрвол постоянно на него ругается. Очень подозрительная софтина, ИМХО.
В первом варианте нашол у себя ляпы в пакете, переделал Код (Text): data.dlen=0; data.proto=PROTO_VERSION; data.seq=1; data.msg=MRIM_CS_HELLO; data.magic=CS_MAGIC; data.fromport=0; data.from=0; for(int i=0;i<16;i++) { data.reserved[i] = char(0); } И всеравно те же яйца только в профиль, те по нулям Заметил особенность если dlen сделать больше 0 то сервер начинает ожидать данных то есть мой recv виснет.Значит оно все же парсит то что я шлю,но сцуко молчит что же там не так
_nic, да не молчит оно. Молчало бы – как раз и висел бы твой recv до принудительного дисконнекта (полминуты вроде). Сниффером чтоль убедись, что данные приходят. У меня, по крайней мере, твой код работает и в 98, и в XP. Отлаживай свой EXE-шник, ищи у себя проблему. И в личку глянь, да. Кстати, когда в последний раз ковырялся, серверу на мусор в reserved было пофиг (по крайней мере, в первом пакете точно).
Спасибо! Буду разбираться! :cool: когда-то ящики брутились подменой параметров ссылки почтовому роботу..) :rolleyes:
Никогда они так не брутились. Это соц. инженерия, или развод по другому. В тех параметрах о которых ты говоришь надо было свой ящик указать и пароль. И на него якобы прийдёт пароль от ящика который указан вторым в запросе. И некоторые мегахацкеры повелись, даже не подумав что они сами сливают пароль от своего ящика. В общем старо это как мир. Хотят ломануть чужой ящик и сливают свой. Головой надо думать а не верить всему что пишут.