Top / TIPS / Winsock コントロールの使い方

Winsock コントロールには制限事項があり、下の URL に記述されています。

[VB] Winsock コントロールの制限事項と注意事項
http://support.microsoft.com/kb/409932/ja/

 

コントロールのLoad , Unload を繰り返さない

サーバーを作成する場合は、Listen 用と、実際の通信用の Winsock コントロールを用意します。

Listen 用の Winsock コントロールで ConnectionRequest イベントが発生したら、通信用の Winsock コントロールで Accept することにより、複数のクライアントと通信をすることができます。

接続要求時に通信用のコントロールを作成し、使い終わったら削除していると、削除時にメモリリークが発生します。

回避策は、一定数の WinSock コントロールを用意して使いまわすこと。

いったんロードしたら、死ぬまでコキ使え!といったことが下のURLに書いてあります。(^_^;)

[BUG] Winsock コントロールがアンロードされるときにメモリ リークが発生する
http://support.microsoft.com/kb/171843/ja/

Connect メソッドを使うときは、LocalPort プロパティを Zero にする

ftp の Active モードでは、ftp サーバーから ftp クライアントにデータコネクションを張りますが、このとき ftp サーバーは、20番ポートを使用して ftp クライアントに接続しなければなりません。

このように、接続する側がポートを固定する必要があるときのために、LocalPort プロパティに値がセットされていたら、bind して connect するように作られているようです。

ただし、接続を切断しても、しばらくは通信状態が残っているため、そのときに connect しようとすると、エラーが発生します。

これを解消するには、ソケットに対し、setsockopt で SO_REUSEADDR をコネクション確立前に設定する必要があるのですが、残念ながら Winsockコントロールには、その手段がありません。

API を使おうと思っても、コネクションが成功して初めて SocketHandle プロパティに値が入ります。

考慮不足だとは思いますが、実際に接続側のポートが制限を受けるのはまれなので、一般的には問題ないかなと思います。

複数の Winsock コントロールに SendData メソッドを連続してデータを送信するとデータが欠落する。

回避法は、「DoEvents を入れる」 だそうです。

・・・・
・・・
・・
wwww

これでいいのかマイクロソフト!と思ったら、出展元が書いてありません。

上の2つは、本国の出展元があります。

BUG: Winsock Control Leaks Memory When Unloaded
http://support.microsoft.com/kb/171843/en-us/

PRB: Winsock Control Generates Error 10048 - Address in Use
http://support.microsoft.com/kb/173619/en-us/

Winsock コントロールには、送信が正常終了したときに SendComplete イベントが発生します。

このイベントを待ってから次の送信に移る必要があるのですが、DoEvents を入れることによって、このイベントが発生することを期待しているのでしょう。

しかし、DoEvenst を実行したからといって、SendComplete イベントが発生するとは限らないので、何の解決にもなりません。

SendComplete イベントが発生するまで DoEvents を繰り返すべきです。




トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   最終更新のRSS
Last-modified: 2009-11-20 (金) 02:56:22 (2893d)