Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Сети > Послать структуру в сокет


Автор: SMiX 11.8.2007, 22:18
Разбираюсь с протоколом 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/)


Кто имел опыт с протоколом агента или вообще с работой со структурой как с пакетом, подскажите пожалуйста.

Автор: SMiX 11.8.2007, 22:36
Извините, уже подсказали решение. 
Код

send(sock,(char*)&p->h,sizeof(p->h),0);

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)