2016-03-29 6 views
0

Uygulamamın TCP SYN paketi oluşturmasını ve ağa göndermesini istiyorum. Çekirdeğin IP Header'ı doldurmasını istediğim için setsockopt kullanarak IP_HDRINCL ayarlamamıştım. C - ham soketi kullanarak IP üstbilgisini doldurmadan TCP SYN oluştur

Bir IP başlık + TCP başlık + Yükü dahil etmek için bir bayt tamponu kullanılarak TCP başlık + Yükü
  • dahil etmek için bir bayt tamponu kullanılarak
    1. çalıştı.

    İkisi Yukarıdaki yöntemler sendto hata döndürdü -1 ve errno i sendto hatası -1 ve errno 88 alıyorum Neden

    #include <sys/socket.h> 
    #include <sys/types.h> 
    #include <netinet/in.h> 
    #include <netinet/ip.h> 
    #include <netinet/tcp.h> 
    #include <errno.h> 
    
    int main() 
    { 
        int sockfd; 
    
        if(sockfd = socket(AF_INET, SOCK_RAW, IPPROTO_TCP) < 0) 
        { 
         printf("sokcet functin failed : \n"); 
         exit (-1); 
        } 
    
        char packet[512]; 
    
        struct sockaddr_in remote; // remote address 
    
        struct iphdr *ip = (struct iphdr *) packet; 
        struct tcphdr *tcp = (struct tcphdr *) packet + sizeof(struct iphdr); 
    
    
        /* 
        struct tcphdr *tcp = (struct tcphdr *) packet; // tcp header 
        */ 
        remote.sin_family = AF_INET; // family 
        remote.sin_addr.s_addr = inet_addr("192.168.0.57"); // destination ip 
        remote.sin_port = htons(atoi("3868")); // destination port 
    
        memset(packet, 0, 512); // set packet to 0 
    
        tcp->source = htons(atoi("6668")); // source port 
        tcp->dest = htons(atoi("3868")); // destination port 
        tcp->seq = htons(random()); // inital sequence number 
        tcp->ack_seq = htons(0); // acknowledgement number 
        tcp->ack = 0; // acknowledgement flag 
        tcp->syn = 1; // synchronize flag 
        tcp->rst = 0; // reset flag 
        tcp->psh = 0; // push flag 
        tcp->fin = 0; // finish flag 
        tcp->urg = 0; // urgent flag 
        tcp->check = 0; // tcp checksum 
        tcp->doff = 5; // data offset 
    
        int err; 
        if((err = sendto(sockfd, packet, sizeof(struct iphdr), 0, (struct sockaddr *)&remote, sizeof(struct sockaddr))) < 0) 
        { // send packet 
         printf("Error: Can't send packet : %d %d !\n\n", err, errno); 
         return -1; 
        } 
    

    kullanılan kod aşağıdadır 88 olarak ayarlanır?

    Ayrıca, sendto işlevinde ikinci bağımsız değişkende kullanılacak olan veri uzunluğunun nasıl belirleneceğini bilmek istiyorum. Eğer paket bayt tamponu yani 512 bayt boyutuna kodlarsam yanlış mıdır?

  • +2

    "herkes bana yardımcı olabilir ..

    int err = sendto(sockfd, packet, sizeof(struct iphdr), 0, (struct sockaddr *)&remote, sizeof(struct sockaddr))); int saved_error = errno; // Save errno flag that is set by sendto. if(err < 0) { fprintf(stderr, "Send Error: %s\n", strerror(saved_error)); } 

    Ben yardımcı olabilir düşünüyorum ... Ama bu size hatayı düzeltmek böylece bu hatanın anlamını verecek ... cevap değil Sendto hatası nedenini bilmek? " Hayır, ama kendine yardım edebilirsin. Sorunun nedenini belirlemek için dokümantasyon başına 'errno’yu kontrol edin. Bunu [okunabilir bir form] [http://stackoverflow.com/q/1546882/1329652] 'de sunduğunuzdan emin olun! –

    +0

    benim sorumu düzenledi – Subbu

    +0

    "errno 88" yardımcı olmuyor. 'return' -1 gönderir, başarısız olduğunu gösterir. Platformunuzdaki belgeleri izlerseniz, hatanın nedenini kontrol etmek için 'errno'yu incelemeniz gerektiğini ve" errno 88 "i ingilizce'ye çevirmek için' strerror' komutunu kullanabileceğinizi unutmayın. Yap bunu. –

    cevap

    0

    Burada bir çözüm vermiyoruz ama hatalarınızın anlamını kontrol edebilir ve hatayı düzeltebilir ve aynı zamanda yorum yapamıyorum çünkü çok fazla itibarım yok .. Sadece yardım etmek istiyorum ...

    +0

    Metodunu denedim, bana "errno = 88" verdi – Subbu

    +0

    @subhu Bu kod başarılı olamaz ya da "Gönderme Hatası: ..." çıktı, burada '...' İngilizce bir metindir. –

    İlgili konular