network
自作自演(!?)のlibnetを利用してアプリを作ってみたら Connection Closeをハンドリングできないことに気づく. というわけでそのあたりを実装. のんびりやっていたら、サーバー側の実装で終わってしまった。 ライブラリ側は夜にでも。
パケット後半がQEMUには届くのにMonaには届かない件を調べる。 問題を切り分けよう。まずは「MonaがReadしても届いていない or Readしていない」のどちらかだ。 monadev.cppのreadのあたりにログを取るコードを入れると、パケットをとろうとreadして空振りし…
新しい朝ですよ。 todo 排他 STLで書き換え STLで書き換え 複数のEther Frameの管理を自前のコレクションクラスじゃなくでstd::queueで。 あっさり完了。 排他 念のため共有変数をvolatile指定。 Mutexで排他完了。 テスト 今のところパケットのシーケンスに…
ACK応答に'GET'の文字列が入っているのはバッファがゼロクリアされていないからでは?疑惑について。 uIPのデバイスドライバmonadev.cで memset(uip_appdata, 0, 64); // ACKにごみが残るので とやってみたがぬるぽで落ちた。 uIPの内部で使っているバッファ…
排他処理がやばそうなところできちんとMutexを利用して排他した。 別に待たされても良いので trylock でなく、lockで。 これでいったん動作を確認する。 ちなみに興味のある方は mones2/22.ネットワークサーバ/14.きちんと排他しようにソースがあるのでどう…
完全に作業ログとなっていて日記じゃない気がするけどこういう開発過程を全部見せるのがMona流ということでひとつ。 Ethereal, serial.log, QEMU.logを比べてどこでパケットが落ちているか調べる HTTP GETした際にアプリケーション側にパケットが全て届かな…
問題が再現するように、まずタイムアウト間隔を元にもどす。 QEMU内でパケットが消失しているか?→dumpの仕組みは作った SEQNOの不一致問題を調べる。ずれていないか? まずはIPのidが一致しているか?→一致している(swapShortをはさむ) TCPのプロトコル番号が…
今日も実況中継気味。 EtherealでTCPのコネクション開始からレスポンスの中途半端終了まで詳細に見渡してみる。 パケットは全部で54個やり取りされているので慣れるまでは全部見ていったほうがよさそう。 packet number source(port) destination(port) Seq …
uIPをラップしたサーバー(NetServer)とネットサーバーを利用するライブラリ(libnet)をCVSに追加しました。 以前から言っている通りネットワーク実装は、他の方の実装もあるので、NetServerはあえてcoreにはいれず、contrib_0.3に入れてあります。 libnetを利…
uIP上で動作するTcpClientがMonaで動きました。 我が家の無線LANアクセスポイントにアクセスしています。 これにAPIを用意すれば、id:Baysideさんがブラウザを作ってくれるに違いない(笑)。 あと名前解決もしないとなぁ。
uIPをラップして簡単にTcpClientを作成可能にしたuIPをMonaに移植。 コンパイルが通るところまで。動作未確認。
前回まではuIPで簡単に、ネットワークアプリがかけるようにWindows上で開発を進めていました。 これをMonaに移植するに当たって、Mona側のNICドライバをちょこっと修正しなければなりません。 Readの仕様を ・現状:Readを発行するとデータが受信されるまで…
const char* msg = "GET /file HTTP/1.0\r\nServer:192.168.11.1\r\n\r\n"; int msgLength = strlen(msg); Buffer data(msg, &msg[msgLength]); dword handle = client->Connect(IPAddress(192, 168, 11, 1), 80); if (handle == 0) return NULL; dword i = …
久しぶりにスタバで作業。 ネットワークAPIの実装をしているのにIP Unreachableな場所で作業するのがなんとも。 TcpClientのコードをほぼ書き上げる。 Effective STLを読みながら、試験的にSTLを使ってみています。 typedef std::vector Buffer; TcpClientの…
Effective STLを読みながらコードを書いているのでゆっくりめ。 頭を悩ませている原因が、クラインアント用API提供とサーバー用API提供APIをひとまとめで実装しようとしていることだと言う事に気づいた。 まずはクライアントをTcpClientとして実装しよう。 …
WinPcapを利用したデバイスドライバがread時にブロックしているのがだめだということが分かった。 pcap_open_liveの引数でタイムアウトを1msにして、readでタイムアウト時は0を返すようにしたら送信がうまくいくようになった。 その後、べた書きであれこれ整…
uIPを利用してNetServerを実装する。そのNetServerはC#のようなネットワークAPIを提供する。 そういう形を目指しているのですが、一つ前のエントリーの通りこれはかなり難しそう。 一つ前のエントリーで実現したことは NetServer内にそのままコードを直書き …
uIPで簡単なHTTPクライアントを書いてみる。 大げさなものではなくGETしてそれを画面に出力するだけ。 まずはuIPのドキュメント通りに、各状態に合わせたハンドラを呼んでやる void NetServer::DoEvent() { if (uip_aborted()) { AbortedHandler(); } if (ui…
NetServerを経由してのパケットの送信です。 uIP上でのパケット送信には2種類あって パケット受信ループからそのコネクションに対してパケット送信 コネクションをオープンして送信 前者の場合はWebサーバーが動いたときに検証済みだったのですが、後者を今…
uIPのドキュメントを読んでみます。 http://www.sics.se/~adam/uip/uip-0.9-refman/main.html メモ uIPはメモリ使用量が少ない(グローバルに1つしかパケットバッファがない) uIPはOS非依存にするためにCPUにやさしいブロック的なものがない uIPはパケット…
uIPの成果をMonaのツリーに取り込みました。 uIPの作者にportしたことをメールしてみました。 作者様はスウェーデンの方みたいですが返事があるといいですね。
Monaに無理やり移植したuIPを実行しても、動いていないように見える。 症状は Windows側からのpingに反応しない Windows側からのwgetに反応しない こういうときのデバッグの際に、どうやって犯人を追い詰めるかの過程を書いてみると、だめな点が分かったり他…
昨日の受信に引き続いて、パケットの送信をしてみました。 結果から言うと簡単でした。 pcap_sendpacket(handle, (byte*)(&reply), 100); のように、引数にアダプタのハンドル、パケット、パケットサイズを渡してやれば送信終了です。 これを使用して存在し…
Monaのネットワーク実装に、なぜWinPcapが関係あるのか?と思われた方もいるかもしれません。 がんばってWinPcapの使い方を学んだのには理由があります。 それは、Mona用のプロトコルスタックの開発のほとんどをWindows上で行ってしまおうという意図があるか…
id:higepon:20051206:1133877107の続きです。WinPcapでは2つの方法でパケットを受信できます。 1つ目の方法はパケット受信ハンドラを登録する方法。 2つ目の方法はパケットを能動的にループで受信する方法です。 今回は今後のMonaでの実装を考えて後者の方法…
namaenaiさんから情報をいただきました。 Windows XP Service Pack 2 でこの機能に追加された新機能 raw ソケット経由のトラフィックの制限詳細説明raw IP ソケットは、ごくわずかな Windows アプリケーションで使用されており、アプリケーションが TCP/IP …
このあたりを読むと、Windows XP SP2では、セキュリティの関係上Raw Socketが無効化されているようだ。 有効にしたい場合は、自己責任で「Windows Firewall/Internet Connection Sharing (ICS) サービス」(ファイアーウォール系)を無効化すればよいらしい…
IPヘッダを含めて送るのは、setsocketoptでIP_HDRINCLを設定してやればよいとアドバイスをいただきました。 例がないかと探していたところTCPPing↓が見つかりました。 http://www.xfocus.net/articles/200202/343.html こいつのコードをそのまま cygwin でビ…
任意のIPパケットを送りたいという動機で、WSASendToを使ってみました。 bool RawSocket::Write(byte* buff, dword size, dword* writeSize) { unsigned long length; unsigned long flags = 0; IP::Header* h = (IP::Header*)buff; SOCKADDR_IN addr_in; ad…
msdn-WSASendを参考に、生パケットを送るコードを書いてみる bool RawSocket::Write(byte* buff, dword size, dword* writeSize) { unsigned long length; unsigned long flags = 0; WSABUF wsb; wsb.buf = (PTCHAR)buff; wsb.len = size; if (SOCKET_ERROR …