Win7 + Raw socket

Тема в разделе "WASM.NETWORKS", создана пользователем float, 24 фев 2010.

  1. float

    float New Member

    Публикаций:
    0
    Регистрация:
    7 янв 2010
    Сообщения:
    113
    Код (Text):
    1. int bOpt = 1;
    2.  
    3.     WSADATA asd;
    4.     WSAStartup(MAKEWORD(2,2),&asd);
    5.            SOCKET s = socket(PF_INET, SOCK_RAW, IPPROTO_RAW);
    6.     setsockopt(s, IPPROTO_IP, IP_HDRINCL, (char *)&bOpt, sizeof(bOpt));
    7.            
    8.     struct sockaddr_in sin;
    9.  
    10.     sin.sin_family = AF_INET;
    11.     sin.sin_port = htons(80);
    12.     sin.sin_addr.s_addr = inet_addr("192.168.0.101");
    13.    
    14.     char datagram[40];
    15.     ipheader *iph = (ipheader *)datagram;
    16.     tcpheader *tcph = (tcpheader *)(datagram + sizeof(ipheader));
    17.     PS_HDR pseudo_header;
    18.  
    19.     memset(datagram, 0, sizeof(datagram));
    20.  
    21.     iph->ip_hl       = 5;
    22.     iph->ip_v        = 4;
    23.     iph->ip_tos      = 0;
    24.     iph->ip_len      = sizeof(ipheader) + sizeof(tcpheader);
    25.     iph->ip_id       = rand();
    26.     iph->ip_off      = 0;
    27.     iph->ip_ttl      = 255;
    28.     iph->ip_p        = IPPROTO_TCP;
    29.     iph->ip_sum      = 0;
    30.     iph->ip_src      = inet_addr("192.168.0.100");
    31.     iph->ip_dst      = sin.sin_addr.s_addr;
    32.  
    33.     tcph->th_sport   = htons(getrandom(0, 1500));
    34.     tcph->th_dport   = sin.sin_port;
    35.     tcph->th_seq     = rand();
    36.     tcph->th_ack     = 0;
    37.     tcph->th_x2      = 0;
    38.     tcph->th_off     = 5;
    39.     tcph->th_flags   = TH_SYN;
    40.     tcph->th_win     = htons(512);
    41.     tcph->th_sum     = 0;
    42.     tcph->th_urp     = 0;
    43.  
    44.     pseudo_header.source_address  = iph->ip_src;
    45.     pseudo_header.dest_address    = sin.sin_addr.s_addr;
    46.     pseudo_header.placeholder     = 0;
    47.     pseudo_header.protocol        = IPPROTO_TCP;
    48.     pseudo_header.tcp_length      = htons(sizeof(tcpheader));
    49.  
    50.     memcpy((char*)&pseudo_header.tcp, (char*)tcph, sizeof(tcpheader));
    51.     iph->ip_sum  = checksum((unsigned short *)&iph, sizeof(ipheader));
    52.     tcph->th_sum = checksum((unsigned short *)&pseudo_header, sizeof(pseudo_header));
    53.  
    54.     if (sendto(s, datagram, sizeof(datagram), 0, (SOCKADDR *)&sin, sizeof(sin)) == SOCKET_ERROR)
    55.         return -1;
    Собственно пытаюсь отправить сырой СИН, но не выходит никак. Это у меня ошибка или действует ограничение Windows?
     
  2. d2k9

    d2k9 Алексей

    Публикаций:
    0
    Регистрация:
    14 сен 2008
    Сообщения:
    325
    В пред. версиях винды это было ограничено - скорее всего и в этой тоже.
     
  3. float

    float New Member

    Публикаций:
    0
    Регистрация:
    7 янв 2010
    Сообщения:
    113
    Вопрос решен. TCP data cannot be sent over raw sockets. - msdn
     
  4. d2k9

    d2k9 Алексей

    Публикаций:
    0
    Регистрация:
    14 сен 2008
    Сообщения:
    325
    И чем они ето предлагают заменять?)
     
  5. reverser

    reverser New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2004
    Сообщения:
    615
    TCP sockets?