2013-11-19 2 views
0

Мой учитель хочет, чтобы мы выполняли упражнение на raw-сокете в C++ в Windows (для обучения tcp-связи).Raw Socket отправить TCP SYN-FIN- .. в C++

У меня проблема с этим. Я видел много документации, но я не знаю, как ее решить.

int raw() 
{ 
    WSADATA WSAData; 
    SOCKET sock; 
    SOCKADDR_IN sin,din; 
    WSAStartup(MAKEWORD(2, 2), &WSAData); 

    char datagram[MAX_PACKET_SIZE]; 
    struct iphdr *iph = (struct iphdr *)datagram; 
    struct tcphdr *tcph = (struct tcphdr *)((UCHAR *)iph + sizeof(tcphdr)); 
    char new_ip[sizeof "255.255.255.255"]; 

    sock = socket(PF_INET, SOCK_RAW, IPPROTO_TCP); 
    if (sock == INVALID_SOCKET) 
     cout << "failled init socket" << endl ; 
    else{ 
     memset(datagram, 0, MAX_PACKET_SIZE); // Clear the data 
     setup_ip_header(iph); 
     setup_tcp_header(tcph); 

     sin.sin_family = AF_INET; 
     sin.sin_port = htons(8888); 
     sin.sin_addr.s_addr = inet_addr("192.168.1.10"); //source ip 

     din.sin_family = AF_INET; 
     din.sin_port = htons(DEST_PORT); 
     din.sin_addr.s_addr = inet_addr(TARGET_SERV_IP); //ip serv to connect 

     tcph->port_dest = htons(DEST_PORT); 
     iph->ip_dest = din.sin_addr.s_addr; 
     iph->ip_source = sin.sin_addr.s_addr; 
     iph->ip_dest = inet_addr(TARGET_SERV_IP); //ip serv to connect 
     iph->ip_source = inet_addr("192.168.1.10"); //source ip 

     //iph->checksum = csum((unsigned short *)datagram, iph->tot_len >> 1); 
     iph->checksum = csum((unsigned short *)datagram, sizeof(struct iphdr)); 

     int one = 1; 
     const int *val = &one; 

     if (setsockopt(sock, IPPROTO_IP, IP_HDRINCL, (char *)val, sizeof(one)) < 0) 
      printf("failled set socket option IP_HDRINCL"); 
     else{ 
       if (sendto(sock,  /* our socket */ 
        datagram,   /* the buffer containing headers and data */ 
        ntohs(iph->tot_len),  /* total length of our datagram */ 
        0,  /* routing flags, normally always 0 */ 
        (struct sockaddr *) &sin, /* socket addr, just like in */ 
        sizeof(sin)) < 0)  /* a normal send() */ 
         cout << stderr << "sendto() error!!!.\n " << WSAGetLastError() << endl; 
       else 
        cout << "packet send\n" << endl; 
     } 
    closesocket(sock); 
    } 
} 

Произошла ошибка в sendto(). он возвращает 10022 ошибка = WSAEINVAL

Я видел, что это может быть новая защита окон?

У вас какие-либо идеи, чтобы исправить мою проблему или обойти защиту (идти глубже, водитель и т.д.)

+0

Работает ли ваше приложение с правами администратора? Сокеты RAW ограничены администраторами. –

+0

Я пытаюсь щелкнуть правой кнопкой мыши и запустить «как администратор». – user1778354

+0

Вы полностью заполняете tcph? Есть несколько фанковых дублирующихся полей iph. –

ответ

0

Вы не установите iph-> tot_len в вашем коде.

Моя рекомендация для сетевого кода с использованием C++ будет использовать зЬй :: строку или зЬй :: вектор:

std::vector<uint8_t> packet(MAX_PACKET_SIZE, 0); 
... 
packet.resize(real_size); 

затем использовать адрес (& пакет [0]) для указателя манипуляций.

Смежные вопросы