pingクライアントについて

はじめて投稿いたします。

けんけんと申します。

以下環境下でpingクライアントを実装したいのですが、実装された方がいましたら実装方法を教えて頂きたいのですが?

PCと双方で疎通確認が行いたいのです。

マイコン:R5F565NEDxFB

スマートコンフィグレータコンポーネント

r_ether_rx ver1.20

r_t4_driver_rx ver1.08

r_t4_rx ver2.09

RXシリーズは初めてのプログラミングとなります。

宜しくお願い致します。

以上。

Parents
  • けんけん さん、こんにちは。NoMaYです。

    試そうとして、私が勘違いしていた/私のアドバイスが的外れだった、とか分かったら、その旨を教えて下さい。というか、実は、Google検索の結果だけを見て「Socket APIでいけるっぽい」と思ってリプライしたのですが、HiRoSanさんのリプライ&アドバイスの過去スレッドのICMPに気を付けながらGoogle検索にヒットしたページを読んでみたら以下の指定が必要だったことが分かったのですが、T4の簡易ソケットAPIのアプリケーションノートにはIPPROTO_ICMPの記載がないことに気が付き、これは私が早トチリしたようだ、と思い始めたところです、、、ごめんなさい、、、

    簡単なpingの作成(ICMPの送受信)- Geekなページ
    www.geekpage.jp/programming/linux-network/simple-ping.php

    /* RAWソケットを作成します */
    sock = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);

     

  • NoMayさん。こんにちは。けんけんです。

    済みません。私の説明の仕方が不十分だったのかもしれません。
    作成したいものはRX65Nからのping送信プログラムでして、開発環境はCS+ V8.03で作成しております。
    M3S-T4-Tiny V2.09を組み込んでいまして、組み込み用T4ユーザーマニュアルを見ましたところエコー応答
    のみサポートと記述されていた為、
    かふぇルネさんで過去に作成された方の投稿を見つけ
    japan.renesasrulz.com/.../m3s-t4-tiny
    現バージョンでの組み込みをされている方がいるのではないかと思い投降した次第です。
Reply
  • NoMayさん。こんにちは。けんけんです。

    済みません。私の説明の仕方が不十分だったのかもしれません。
    作成したいものはRX65Nからのping送信プログラムでして、開発環境はCS+ V8.03で作成しております。
    M3S-T4-Tiny V2.09を組み込んでいまして、組み込み用T4ユーザーマニュアルを見ましたところエコー応答
    のみサポートと記述されていた為、
    かふぇルネさんで過去に作成された方の投稿を見つけ
    japan.renesasrulz.com/.../m3s-t4-tiny
    現バージョンでの組み込みをされている方がいるのではないかと思い投降した次第です。
Children
  • けんけんさん
    たぶんあまり参考にならないとは思いますが、ずいぶん昔に作成したことがありまして
    それなりに使用していましたが、T4ではありませんし、全体のソースを投稿しても混乱のもとなので
    骨はIP層に作りこまないといけませんし、コマンドラインができる仕組みも必要です
    以下ソースの一部です
    const char pingdata[]={
    0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F,0x70
    ,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69
    };

    void pingrequest_100()
    {
    char buf[ETHER_MAX_PACKET];

    if(sub_proc[sub_proci].ret == 0){
    printf("見つかりません.\r");
    sub_delproc
    prompt;
    return;
    }

    //ICMPH
    icmph_(buf)->Type = ICMP_ECHO;
    icmph_(buf)->Code = 0;
    icmph_(buf)->Checksum = 0;
    icmph_(buf)->ID = rand();
    icmph_(buf)->SequenceNumber = 0;
    memcpy(&icmph_(buf)->Data , &pingdata , sizeof(pingdata));
    icmph_(buf)->Checksum = make_crc((char*)icmph_(buf) ,(WORD)IcmpHeader_size +sizeof(pingdata));

    //IPH
    iph_(buf)->Version = 4;
    iph_(buf)->IHL = IpHeader_size /4;
    iph_(buf)->DifferentiatedServices = 0;
    iph_(buf)->Totallength = IpHeader_size + IcmpHeader_size + sizeof(pingdata);
    iph_(buf)->Identifi = (WORD)rand() +(WORD)cpu_sec;
    iph_(buf)->Flags = 0;
    iph_(buf)->Fragmentoffset = 0;
    iph_(buf)->TTL = 128;
    iph_(buf)->Protocol = IP_ICMP;
    iph_(buf)->Headerchecksum = 0;
    cpy4(&iph_(buf)->SourceIPaddress , &sparam.myip);
    cpy4(&iph_(buf)->DestinationIPaddress , &sub_proc[sub_proci].param);//getmac->ip
    iph_(buf)->Headerchecksum = make_crc((char*)iph_(buf) ,(WORD)iph_(buf)->Totallength);

    //ETH
    cpy6(&eth_(buf)->DestinationMACaddress , sub_proc[sub_proci].ret);//getmac->mac
    cpy6(&eth_(buf)->SourceMACaddress , &eedata.mymac);
    eth_(buf)->Protocol = IP_TYPE;
    ether_put((char*)eth_(buf) , iph_(buf)->Totallength + EtherHeader_size);
    msec1start
    sub_proc[sub_proci].pc = pingrequest_110;
    }

    int pingrequest(char *str)
    {
    IPLINEINPUT ipl;
    if(strlen(str) == 0)return Invalid_Value_Parameter;
    iplineinput(str , &ipl);
    if(!ipl.f) return Invalid_Value_Parameter;

    //まずMACアドレスを取得する
    setproc(&getmac, ipl.ipadr, 0,0,0, &pingrequest_100 );
    return NULLSTR;
    }

    以上です。
  • IKUZOさん。こんにちは、けんけんです。

    返信有難うございました。
    情報ご参考にさせていただきます。