2016-03-29 10 views
0

私のアプリケーションでTCP SYNパケットを作成し、ネットワークで送信します。カーネルにIPヘッダーを書き込ませたいので、私はIP_HDRINCLsetsockoptに設定していませんでした。C - rawソケットを使用してIPヘッダを埋めることなくTCP SYNを作成する

私はIPヘッダ+ TCPヘッダ+ペイロードが含まれるようにバイトのバッファを使用してTCPヘッダ+ペイロード

  • が含まれるようにバイトのバッファを使用して

    1. を試してみました。

    どちらの上記の方法はsendtoエラーを返し-1 errnoが、私はsendtoエラー-1およびerrnoが88を取得していますなぜ私は

    #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; 
        } 
    

    を使用したコードされた後88 に設定されていますか?

    また、sendto関数の2番目の引数で使用されるデータの長さを決定する方法を知りたいと思います。パケットバイトバッファ、つまり512バイトのサイズにハードコードすると間違っていますか?

  • +2

    ..エラーの意味を与えますsendtoエラーの背後にある理由を知っていますか? "いいえ、でも自分で助けることができます。ドキュメントごとに 'errno'をチェックして、問題の原因を調べます。それを[人間が読める形式](http://stackoverflow.com/q/1546882/1329652)で提示してください! –

    +0

    編集した質問 – Subbu

    +0

    「errno 88」は役に立ちません。 -1を返す 'sendto'は単にそれが失敗したことを示します。あなたのプラットフォームのドキュメントに従うならば、エラーの原因を調べるために 'errno'を調べなければならないことに気付くでしょうし、' strerror'を使って "errno 88"を英語に翻訳することができます。それを行う。 –

    答えて

    0

    私は解決策を教えていませんが、 あなたはあなたのエラーの意味をチェックして、あなたのエラーを修正することができますまた私は多くの評判を持っていないのでコメントできません..私はただ助けたいあなたのエラーを修正することができるように

    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)); 
    } 
    

    私はそれに役立つかもしれないと思う...しかし、これが答えではない...これは誰もが私を助けることができる」

    +0

    私はあなたの方法を試してみました、それは私に "errno = 88"を与えました – Subbu

    +0

    @subhuこのコードは、 "Send Error:..."という名前で成功します。 –

    関連する問題