あと1回でジャンルランキングから消すぞとアメブロに脅されています。
こういうジャンルって、日常の中で「あ、これ記事になりそうだな」とか「これはメモしておこう」とかがあったときに書くもので毎日書くものではないと思うのですが…運営さん
ということで、まだ成功していない、途中なのですが記事にしておきます。
PCのブラウザでH8マイコンのアドレスを呼び出すとWelcomeメッセージが表示される記事はよく見かけますし、付属のCDでもhttpprogとして提供されていますが、H8マイコンからサーバーを呼び出す記事が無いのです。(私が探した範囲では)
そこでH8マイコンで3ウェイハンドシェイクを試してみようという記事です。
参考ページ:
TCPプロトコル
http://www.picfun.com/lan19a.html
Windows計算機でTCPチェックサムを計算する方法
http://el.jibun.atmarkit.co.jp/hiro/2013/07/tcp-f933.html
まず、ローカルPCのブラウザでH8マイコンのIPアドレスを呼び出しWelcomeメッセージを表示させます。
H8マイコンのIPアドレスは192.168.254.113に変更しています。
Wiresharkでキャプチャしてみます。
ip addr == 192.168.1.113でフィルタしています。
PC(192.168.254.199)からH8(192.168.254.113)にSYNが送られて通信が開始していることがわかります。
終了処理が出来ていないのか、最後はFIN,ACKを5回繰り返してRST,ACKで終わっています。
1行目のSYNを選択すると下に16進が表示されます。
これをTCPフレームと比較しながらmain.cに落とし込むと
上のプログラムでは宛先と発信元を入れ替えてH8からSYNを送信するようにしています。
送信する部分はこんな感じ
#include <h8/reg3067.h>
#include <h8/syscall.h>
#define ETHER_BASE_ADDR 0x200000
#define MY_ADDR IPADDR(192,168,254,113)
#define MY_MASK IPADDR(255,255,255,0)
#define MY_GATEWAY IPADDR(192,168,254,254)
//NICの初期設定
ether_init(ETHER_BASE_ADDR);
//NICのセットアップ
ether_setup();
//Etherステータスを取得する
dummy = get_ether_status();
if (get_ether_status() == 0){
printf("NIC invalid.\r\n"); //NIC無効
return -1;
} else {
printf("NIC valid.\r\n"); //NIC有効
}
//TCP/IPのセットアップ
ip_setup(MY_ADDR, MY_MASK);
//ゲートウェイのセットアップ
set_gateway(MY_GATEWAY);
//NICバッファに書き込む
dummy = ether_write(DM, 0, num);
printf("Ether_Write=%d\n", dummy);
//ネットワークへパケットを送信する
dummy = ether_flush(num);
printf("Ether_Flush=%d\n", dummy);
Wiresharkで見たところ。
上の例では、発信元と宛先を入れ替えただけなので動作しました。
宛先をサーバーに変えます。この場合、TCPヘッダーのチェックサムを計算する必要があります。
長くなるので次回へ