あぶね〜
2007/7/26
— posted by mu at 10:38 am
Comment [0]
TrackBack [0]
.NET非同期通信の切断
2007/7/24
今日も今日とて.NET。.NETで非同期ソケット通信 (←このリンクが切れていた場合、".NET", "ソケット", "非同期"などで検索すれば出てくるでしょう)する場合、データを受信するたびにSystem.Net.Sockets.Socket.BeginReceiveで指定した関数・メソッドが呼ばれます。接続が切れるときにもこの関数が呼ばれますが、その場合受信サイズが0になっているので、切断を知ることができるという仕掛けです。
相手から切断してきたときはSystem.Net.Sockets.Socket.Close()なりインスタンスの破棄なり処理すればいいのですが、こちらから切断したいときはSystem.Net.Sockets.Socket.Disconnect()で切断する必要があるようです。以下の方法では不具合がありました。
- System.Net.Sockets.Socket.Socketインスタンスの破棄
- 破棄のタイミングはプログラマーが制御できない
ようなのでいつ切断されるか分かりません。下手すると延々と接続されています。
- System.Net.Sockets.Socket.Socket.Close()
- このメソッドは切断後全てのリソースを開放してしまいます
。この後サイズ0の受信を通知しようとBeginReceiveで指定した関数が呼ばれますが、引数のIAsyncResultクラスインスタンスがCloseメソッドで開放されてしまっているため、EndReceiveでこのインスタンスにアクセスするとエラーを起こします。try〜catchで例外処理など対策が必要。
ただSystem.Net.Sockets.Socket.Socket.Disconnect()メソッドは.NET Framework 2.0以降らしいので、1.xではEndReceiveをtry〜catchで捕まえるか、独自にフラグ管理するなどするしかないのでしょうか?
— posted by mu at 08:51 pm
Comment [0]
TrackBack [0]
MA4R コンクエスト2 達成

PSOBB Maximum Attach 4 Reload のコンクエスト2が達成されたようです。
このイベント、Reloadと言う通り去年私も参加していたMaximum Attach 4 の再登場。去年も同じ指令(撃破数をEP1>EP2>EP4にする)がありましたが物の見事失敗し、その後も続けて失敗するという(つд`)な状態だったと思います。まぁ撃破数の下の桁をいくらにしろなんていう運頼みのやつもありましたけどね。そのせいか最後のほうはクリアできないと馬鹿にされるというくらいぬるい指令が来たのですがw
原因のひとつにEP2が難しいというのがあると。去年もアルティメットはチーム内の精鋭4人(チャージバルカン持った化け物火力キャストx3と補助テクニック&メギド担当フォニュエールx1)くらい組まないとゴールにたどり着かない。おまけに去年はEP4がリリースから1年経っておらず、EP4で出るアイテム目当てに行く人も多かった。てなわけで、EP2は終始不人気 。
Reloadにはほとんど参加してない私ですが、先週の経過 見る限り今回も失敗するなと思ってました。が、週末からきちっと数合わせをしてきたようです。なんか今のプレーヤーは去年より目標達成力が高いのでしょうか。それとも参加者が少なくて、チームなど組織的行動を取る人たちで撃破数の調整ができちゃうのでしょうか・・・
— posted by mu at 12:53 pm
Comment [0]
TrackBack [0]
.NETで値が無い返り値
2007/7/23
時々長さ0の文字列("")とは別に「結果が無い」という返し方をする関数を作らないといけないことがあります。またはあらゆる数値が結果になりえるので、ある特定値(0とか-1とか)を「結果が無い」という割り当てにできない関数とか。例としては、まだ名前の入力をしていないのと入力した結果空白だったとを区別しなければいけないなど。
SQLならばNULLと扱われる内容。SQLではNULLはいかなる数字でも長さ0の文字列でもなく、「値が無い」状態です。値が無いので等号・不等号で比較することすら禁止されています。は文法間違いですし、SELECT * FROM t1 WHERE name=NULL
はnameがNULLであるレコードには引っかかりません(値なし=""は否なわけです)SELECT * FROM t1 WHERE name=""
以前なら(構造体とか使って)値を入れるのとは別に、値の有無を示す整数やブール値と二つの値をセットで返す関数を作ってたのですが、.NETではIntegerやStringも含めありとあらゆるものがクラス扱いされているので、オブジェクトが存在しないという状態Nothing(VB.NET)やnull(C++/C#.NET)が使えます。例えばVB.NETでは
Function foo() as String If a>0 Then foo = str1 Else foo = Nothing End If End Function
Function foo() as Integer If a>0 Then foo = int1 Else foo = Nothing End If End Functionという関数が定義できるわけです。これでstr1が長さ0を含むいかなる文字列でも、int1がどんな整数でも、それとは別に「値が無い」という結果を返すことができます。
まぁ、当たり前といえば当たり前なんですが^^;
— posted by mu at 08:53 pm
Comment [0]
TrackBack [0]
タイムマシン
2007/7/21
夕飯時の会話の記録として。
タイムマシンに乗って過去を自分の都合の良いように変える。タイムマシンを題材にすると必ずといって良いほど展開されます。ドラえもんがのび太の家にやってきた理由もこれ。場合によっては、それを許さない管理側との対決なども。これ以外だと観光と未来を知って事前に対策したり利益を上げるくらいでしょうか、使い道は。
以下映画のネタばれ含む。
私は2002年の映画タイムマシン やターミネーター3
の考え方のほうがしっくり来ます。これらは過去に不都合が無ければそもそもタイムマシンを使うことも無い、タイムマシンを使えばそこ至る課程は変わるかもしれないが、結局は同じ不都合な状態になるとしています。
守れたなら過去に行こうとはしない、よって過去に行っても原因は変れど妻は死ぬ。未来からターミネーターを刺客として送ってきた以上、少年を守っても核戦争は起きる。タイムマシンで変ったのは死に方と起きる時期だけだと。
そして・・・レジスタンスのリーダーとしてジョン・コナーが存在している以上、刺客を送っても失敗するということに気づけw > スカイネット
— posted by mu at 11:21 am
Comment [0]
TrackBack [0]














- Basic
Comments