network

コネクションの切断を知りたい

自作自演(!?)のlibnetを利用してアプリを作ってみたら Connection Closeをハンドリングできないことに気づく. というわけでそのあたりを実装. のんびりやっていたら、サーバー側の実装で終わってしまった。 ライブラリ側は夜にでも。

パケット後半がQEMUには届くのにMonaには届かない件の調査

パケット後半がQEMUには届くのにMonaには届かない件を調べる。 問題を切り分けよう。まずは「MonaがReadしても届いていない or Readしていない」のどちらかだ。 monadev.cppのreadのあたりにログを取るコードを入れると、パケットをとろうとreadして空振りし…

パケット順序を正しくしよう

新しい朝ですよ。 todo 排他 STLで書き換え STLで書き換え 複数のEther Frameの管理を自前のコレクションクラスじゃなくでstd::queueで。 あっさり完了。 排他 念のため共有変数をvolatile指定。 Mutexで排他完了。 テスト 今のところパケットのシーケンスに…

Etherバッファの0クリア

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した際にアプリケーション側にパケットが全て届かな…

今後のtodoまとめ

問題が再現するように、まずタイムアウト間隔を元にもどす。 QEMU内でパケットが消失しているか?→dumpの仕組みは作った SEQNOの不一致問題を調べる。ずれていないか? まずはIPのidが一致しているか?→一致している(swapShortをはさむ) TCPのプロトコル番号が…

パケットが切れる件の調査3

今日も実況中継気味。 EtherealでTCPのコネクション開始からレスポンスの中途半端終了まで詳細に見渡してみる。 パケットは全部で54個やり取りされているので慣れるまでは全部見ていったほうがよさそう。 packet number source(port) destination(port) Seq …

NetServer、libnetを追加

uIPをラップしたサーバー(NetServer)とネットサーバーを利用するライブラリ(libnet)をCVSに追加しました。 以前から言っている通りネットワーク実装は、他の方の実装もあるので、NetServerはあえてcoreにはいれず、contrib_0.3に入れてあります。 libnetを利…

Webクライアント

uIP上で動作するTcpClientがMonaで動きました。 我が家の無線LANアクセスポイントにアクセスしています。 これにAPIを用意すれば、id:Baysideさんがブラウザを作ってくれるに違いない(笑)。 あと名前解決もしないとなぁ。

uIPのTcpClientをMonaに移植

uIPをラップして簡単にTcpClientを作成可能にしたuIPをMonaに移植。 コンパイルが通るところまで。動作未確認。

NICドライバのReadにタイムアウトを指定する

前回まではuIPで簡単に、ネットワークアプリがかけるようにWindows上で開発を進めていました。 これをMonaに移植するに当たって、Mona側のNICドライバをちょこっと修正しなければなりません。 Readの仕様を ・現状:Readを発行するとデータが受信されるまで…

uIPでHTTP

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 = …

uIP@スタバ

久しぶりにスタバで作業。 ネットワークAPIの実装をしているのにIP Unreachableな場所で作業するのがなんとも。 TcpClientのコードをほぼ書き上げる。 Effective STLを読みながら、試験的にSTLを使ってみています。 typedef std::vector Buffer; TcpClientの…

あいかわらずuIP作業中

Effective STLを読みながらコードを書いているのでゆっくりめ。 頭を悩ませている原因が、クラインアント用API提供とサーバー用API提供APIをひとまとめで実装しようとしていることだと言う事に気づいた。 まずはクライアントをTcpClientとして実装しよう。 …

NetServerの送信がうまくいかない件

WinPcapを利用したデバイスドライバがread時にブロックしているのがだめだということが分かった。 pcap_open_liveの引数でタイムアウトを1msにして、readでタイムアウト時は0を返すようにしたら送信がうまくいくようになった。 その後、べた書きであれこれ整…

NetServer実装の悩み

uIPを利用してNetServerを実装する。そのNetServerはC#のようなネットワークAPIを提供する。 そういう形を目指しているのですが、一つ前のエントリーの通りこれはかなり難しそう。 一つ前のエントリーで実現したことは NetServer内にそのままコードを直書き …

uIPのイベント

uIPで簡単なHTTPクライアントを書いてみる。 大げさなものではなくGETしてそれを画面に出力するだけ。 まずはuIPのドキュメント通りに、各状態に合わせたハンドラを呼んでやる void NetServer::DoEvent() { if (uip_aborted()) { AbortedHandler(); } if (ui…

NetServer with uIP

NetServerを経由してのパケットの送信です。 uIP上でのパケット送信には2種類あって パケット受信ループからそのコネクションに対してパケット送信 コネクションをオープンして送信 前者の場合はWebサーバーが動いたときに検証済みだったのですが、後者を今…

uIPのドキュメントを読む

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が動作しない原因を探る会

Monaに無理やり移植したuIPを実行しても、動いていないように見える。 症状は Windows側からのpingに反応しない Windows側からのwgetに反応しない こういうときのデバッグの際に、どうやって犯人を追い詰めるかの過程を書いてみると、だめな点が分かったり他…

WinPcapでEther Frame送信 ARP応答

昨日の受信に引き続いて、パケットの送信をしてみました。 結果から言うと簡単でした。 pcap_sendpacket(handle, (byte*)(&reply), 100); のように、引数にアダプタのハンドル、パケット、パケットサイズを渡してやれば送信終了です。 これを使用して存在し…

Nicドライバを抽象化

Monaのネットワーク実装に、なぜWinPcapが関係あるのか?と思われた方もいるかもしれません。 がんばってWinPcapの使い方を学んだのには理由があります。 それは、Mona用のプロトコルスタックの開発のほとんどをWindows上で行ってしまおうという意図があるか…

WinPcapでEther Frame受信・Dump

id:higepon:20051206:1133877107の続きです。WinPcapでは2つの方法でパケットを受信できます。 1つ目の方法はパケット受信ハンドラを登録する方法。 2つ目の方法はパケットを能動的にループで受信する方法です。 今回は今後のMonaでの実装を考えて後者の方法…

Windows XPでのRaw Socketの扱い

namaenaiさんから情報をいただきました。 Windows XP Service Pack 2 でこの機能に追加された新機能 raw ソケット経由のトラフィックの制限詳細説明raw IP ソケットは、ごくわずかな Windows アプリケーションで使用されており、アプリケーションが TCP/IP …

Windows XP SP2ではRaw Socketが使えない?

このあたりを読むと、Windows XP SP2では、セキュリティの関係上Raw Socketが無効化されているようだ。 有効にしたい場合は、自己責任で「Windows Firewall/Internet Connection Sharing (ICS) サービス」(ファイアーウォール系)を無効化すればよいらしい…

IP_HDRINCLオプション

IPヘッダを含めて送るのは、setsocketoptでIP_HDRINCLを設定してやればよいとアドバイスをいただきました。 例がないかと探していたところTCPPing↓が見つかりました。 http://www.xfocus.net/articles/200202/343.html こいつのコードをそのまま cygwin でビ…

WSASendToを試してみた

任意の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…

RawSocketでパケット送信実験中

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 …