3.6 22:30 【Pingを打ってみる】 持ち金が20円になってしまったのでおろしにいかないと……と思っていたのだが、風邪で動けず。20円のまま2日目に突入(苦笑)。コーヒーくらいしかないので、、それを飲みつつなんとか。。 sentTCPにpingを打つ機能を追加しようかなと思ったのだけどどうもうまくいかない。まず方法からしてわからないのでRFCを探すと……わからん。試しにSherlockで検索をかけてみると、おー、いっぱい出てきた。関係ありそうなのを開いて調べていくと、どうやらICMP(Internet Control Message Protocol)というものを使うらしいことがわかった。TCPとかUDPとかでエラーが起こった時に送られてくるのがそんな名前だったかなと思いつつ、今度はICMPで検索してみた。するとRFC792というのを見つけ、その中の「Echo or Echo Reply Message」というのを使えばできるというところまではわかった。 それを実装する方法は……、TCP以外はやったことないのでわからん(笑)。仕方ないので今度はMacTCPのドキュメントを開いてICMPを探す(ほんとはOTでやりたいところだけどさっぱりわからんので)。と、その他のところにICMP echoという項目を発見。おお、まさにこれかも。構造体に値を設定してコールバックルーチンを指定して呼んでやるとechoが送られた時間と戻ってきた時間をそれぞれ1/60秒単位で調べてくれるらしい。ふむふむ。replyが戻ってくるかタイムアウトになるかしたときにコールバックルーチンが呼ばれるということだから、結果がわかるまでしばらく待ってやる必要がある。これをXCMDでどうしたらいいのかわからないが、試しにダミーのループをまわしてチェックしてみることに。 最初はPBControlの時点でエラーが返ってきてしまって「あれ?」って感じだったが、実はTCPドライバを開くのを忘れていただけだった(おいおい)。それをちゃんとして、構造体の他の(おそらく)使用されていないメンバも初期化してやるようにして再度挑戦……と、なぜか永久ループに入ってしまった。Replyが戻ってくるまで待つようにしたところで回ってしまっている。アプリケーションで作っていればなんとかなりそうな気がするのだが、XCMD内でダミーのループをまわすというのはやはりだめなんだろうか。 確かにマルチタスクじゃないから、ループを回っている間になにか返答が来てもそれに反応できないという可能性は高い。が、、だったらどうしたらいいのだろう(^^;; アプリケーションならとりあえず送っておいて自分のイベントループをまわしておき、返答があればコールバックルーチンで結果を受け取ってuserDataを使ってメインルーチンに渡すというふうにやればいいが、XCMDではそうはいかない。一度XCMDから抜けてしまったらXCMD自体がメモリ上からなくなってしまうから(おそらく)コールバックに戻ってくる……なんてのはそもそも無理だ。XCMD内でイベントループ……というのも無理だろう。外部ウィンドウでも作ってイベントを受けられるようにするという手もあるが、コールバックからの返答をHyperCardに戻す方法が面倒だ。 とはいえ、MacTCPのサンプルにあるTCPNameToAddrというXFCNではぼくがやろうとしていることと同じようなことが実現できているから(こちらはDNRからの応答を待っているわけだけど)おそらくはできるんじゃないかと思うんだが。コールバックルーチンの内部にブレークポイントを設定してもひっかからないようなのでなにかしょうもない勘違いをしているだけなんじゃないかと思いつつ……謎。そもそもEcho自体が正しく送信できているのかどうかも怪しい気がするが……。 風邪でしんどいような気がするので(笑)、今日はこんなもんで。 |