Разбираюсь с протоколом mail-агента. Пакет представляет из себя структуру.
Код | //отсюда: http://agent.mail.ru/proto.h typedef struct mrim_packet_header_t { u_long magic; // Magic u_long proto; // Версия протокола u_long seq; // Sequence u_long msg; // Тип пакета u_long dlen; // Длина данных u_long from; // Адрес отправителя u_long fromport; // Порт отправителя u_char reserved[16]; // Зарезервировано } mrim_packet_header_t;
|
Чтобы послать ее, можно нудно слать каждое поле одно за другим, однако интересней и красивей было бы послать каким-то образом саму структуру, или как бы копию ее области памяти. Видел, как в паскале просто вторым параметром функции send делают переменную структуры. Я пытаюсь делать следующим образом:
Код | class Protocol { public: struct mrim_packet_header_t h; Protocol();
}; //............ Protocol::Protocol() { h.seq=2; h.magic=CS_MAGIC; h.proto=PROTO_VERSION; h.from=0; h.fromport=0; for(int i=0;i<16;i++) { h.reserved[i] = char(0); } } //..........
Protocol *p = new Protocol(); p->h.msg=MRIM_CS_HELLO_ACK; p->h.dlen=0; char*snd = (char*)malloc(sizeof(p->h)); memcpy(snd,&p->h,sizeof(p->h)); send(sock,snd,sizeof(snd),0);
|
Однако пакет получается не совсем такой, какой нужен, хотя данные из структуры сниффер засек(а именно, значение MRIM_CS_HELLO_ACK/DE AD BE EF/)
Кто имел опыт с протоколом агента или вообще с работой со структурой как с пакетом, подскажите пожалуйста. |