Модераторы: feodorv
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> raw ip флаги фрагментации 
:(
    Опции темы
Maledictus
Дата 9.6.2009, 18:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 99
Регистрация: 7.9.2008
Где: Республика Белару сь, Борисов

Репутация: 1
Всего: 1



Вопрос такой:

отправляю raw ip пакет. В нем установлен флаг MORE_FRAGMENT, но Wireshark говорит что ничего не установлено.

Код

    iph.ip_frag_off |= htons(0x2000);


user posted image

И если можете покажите пример отправки пакета с установкой type of service и  Prioritet отличной от нуля.

Заранее благодарю...


PM MAIL ICQ Jabber   Вверх
semibug
Дата 9.6.2009, 21:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 323
Регистрация: 27.3.2009

Репутация: нет
Всего: нет



Maledictus, каким образом вы формируете и отправляете сырой пакет? Приведите пожалуйста код.
PM   Вверх
Maledictus
Дата 9.6.2009, 21:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 99
Регистрация: 7.9.2008
Где: Республика Белару сь, Борисов

Репутация: 1
Всего: 1



uMain.cpp:
Код

CGenPacket* packet = new CGenPacket();

    if(packet->InitLib(2,2) != 0){
        MessageBox(frmMain->Handle,"","",MB_ICONERROR);
        return;
    }

    if(packet->CheckLibVersion(2,2) != 0){
        MessageBox(frmMain->Handle,"","",MB_ICONERROR);
        return;
    }

    packet->setLocalIP();

    packet->createIPHdr(0, StrToInt(eId->Text), 0, atoi(eLifeTime->Text.c_str()), protocol,"192.168.139.1", eDestAddress->Text.c_str());

    if(packet->createSocket() == -1){
        MessageBox(frmMain->Handle,"","",MB_ICONERROR);
        return;
    }

    if(packet->setRaw() == -1){
        MessageBox(frmMain->Handle,"","",MB_ICONERROR);
        return;
    }
        packet->sendPacket();


CGenPacket.cpp
Код

void CGenPacket::createIPHdr(unsigned char tos, unsigned short id,
                             unsigned short frag_off, unsigned char ttl,
                             unsigned char protocol, char* saddr,
                             char* daddr)
{
    iph.ip_ihl = 5;
    iph.ip_version = IP_VERSION;
    iph.ip_tos = tos;
    iph.ip_tot_len = sizeof(struct IPHdr);
    iph.ip_id = htons(id);
    iph.ip_frag_off = 0;
    iph.ip_frag_off1 = 0;
    iph.ip_rf = 0;
    iph.ip_df = 1;
    iph.ip_mf    = 0;
    iph.ip_ttl = ttl;
    iph.ip_protocol = protocol;
    iph.ip_check = 0;
    iph.ip_saddr = inet_addr(saddr);
    iph.ip_daddr = inet_addr(daddr);
}

int CGenPacket::InitLib(int v_major, int v_minor)
{
    if(WSAStartup(MAKEWORD(v_major, v_minor), &wsadata)!= 0)
        return -1;

    return 0;
}


int CGenPacket::CheckLibVersion(int v_major, int v_minor)
{
    if (LOBYTE(wsadata.wVersion) != v_minor || HIBYTE(wsadata.wVersion) != v_major)
        return -1;

    return 0;
}

void CGenPacket::setLocalIP()
{
    hostent *P;
    char s[128];
    in_addr in;
    char *P2;
    gethostname(s, 128);
    P = gethostbyname(s);
    in.S_un.S_un_b.s_b1 = P->h_addr_list[0][0];
    in.S_un.S_un_b.s_b2 = P->h_addr_list[0][1];
    in.S_un.S_un_b.s_b3 = P->h_addr_list[0][2];
    in.S_un.S_un_b.s_b4 = P->h_addr_list[0][3];
    src_addr = inet_ntoa(in);                   
}

int CGenPacket::createSocket()
{
    if((sd = socket(AF_INET,SOCK_RAW,IPPROTO_RAW)) == INVALID_SOCKET)
        return -1;

    return 0;
}

int CGenPacket::setRaw()
{
    bool bOpt;
    if(setsockopt(sd, IPPROTO_IP, 2, (char *)&bOpt, sizeof(bOpt)) < 0)
        return -1;

    return 0;
}


int CGenPacket::sendPacket()
{
 char * buffer;
 int result;
 sockaddr_in target;

 unsigned char header_length;
 unsigned int packet_length;

 memset (&target, 0, sizeof (target));

 target.sin_family = AF_INET;
 target.sin_addr.s_addr = iph.ip_daddr;
 target.sin_port = htons(0);

 header_length = sizeof (struct IPHdr); // !!! If IP_OPTIONS, increase...
 packet_length = header_length + 0;

 iph.ip_check = 0;

 if (!iph.ip_tot_len) iph.ip_tot_len = htons (packet_length);

 buffer =(char *) calloc (packet_length, sizeof (char));

 memcpy (buffer, &iph, sizeof (struct IPHdr));

  char *data = NULL;
 if (data) memcpy (buffer + header_length, data, 0);

 iph.ip_check = getCheckSum((unsigned short *) buffer, packet_length);

 memcpy (buffer, &iph, sizeof (struct IPHdr));

 result = sendto (sd, buffer, packet_length, 0,(struct sockaddr *)&target, sizeof (target));
    return 0;

}

unsigned short CGenPacket::getCheckSum(unsigned short *buffer, int buf_size)
{
    unsigned long cksum=0;

    while (buf_size > 1){
        cksum += *buffer++;
        buf_size -= sizeof(unsigned short);
    }
    if (buf_size)
        cksum += *(unsigned short*)buffer;

    cksum = (cksum >> 16) + (cksum & 0xffff);
    cksum += (cksum >>16);

    return (unsigned short)(~cksum);
}

PM MAIL ICQ Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0400 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.