🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: fj.lang.visualbasic
Article #468

Re: winsockプログラミングの質問。

#468
From: 市崎 大介
Date: Sun, 01 Mar 1998 00:00
91 lines
4101 bytes

Syuji Okumura wrote in message <6c9pes$c2r@isv02.ilinx.co.jp>...
>質問
>TCPでのsoket通信について


Microsoft Winsock ControlとVBでの実装と考えてよろしいでしょうか?
以下、その環境を想定しての回答です。

>わからないこと①
>serverのlocalポートをcloseしてからclientのlocalポートをcloseし、
>connectすると直ぐに接続できるが、
>clientのlocalポートをcloseし、serverを要求受け入れ状態にして
>connectすると必ず接続失敗するのは何故か?
>
>わかったこと
>clientのlocalポートを別のポートにすると直ぐに接続が可能になった。
>しかし、
>実行エラー'10048" アドレスが使用されています。
>と表示される時がある。
>
>しりたいこと
>以下client側のlocalポートです。
>・使用できるlocalポートの検索方法
>・使用できないlocalポートを使用可能にする方法

Server側のWinsock Controlは配列になっていますか?
基本的にはServer側のWinsock Control配列の(0)をListenしておき、
ConnectionRequestイベントで新たなWinsock Controlを配列に追加し、
追加されたWinsock ControlのAcceptメソッドを用いて接続を開始しま
す。これが、サーバ側の実装方法です。
ServerのCloseイベントで、Close要求を受けたWinsock Controlのイン
スタンスをUnloadしてやれば、確実にセッションは切断されるはずです
ね。この後、同じクライアントからConnect要求を発行しても、実際に
Acceptするのは上記のように、まったく別のインスタンスとなるので、
ポートやアドレスの重複は起こらないはずです。

というわけで、この問題については、
「しりたいこと」
で列挙されている項目は、問題の解決にはつながらないと思います。

ちなみに、TCPの場合、Client側のLocal Portは基本的に利用しませ
ん。Client側で設定するのはRemotePortだけで、逆にServer側では
LocalPortだけを設定しておけば、Portに関しては問題ないはずです。

>わからないこと②
>現象
>serverのDataArrivalで、A(仮)ポートからGetDataして、AポートにSendDataした
後、
>B(仮)ポートにSendDataすると、client側にBポートのデータは送られたがAポートの
デー
>タが送られなかった。
>次のDataArrivalでAポートにSendDataしたら前回のデータといっしょに送られた。
>
>しりたいこと
>SendDataで、バッファに溜ったまま送られなかった理由

コード中で連続的にSendDataメソッドを利用してデータを送信する場合、
つまり、複数のPortやWinsock Controlのインスタンスに一括してデータ
を送信する場合、各SendDataメソッドの間にDoEventsステートメントを実行
する必要があります。これはWinsock Controlの仕様です。

例;
sckWinsock(0), sckWinsock(1),sckWinsock(2)は、それぞれWinsockの
インスタンス。

以下NG

Dim intCount As Integer

For intCount = 0 To 2
    sckWinsock(intCount).SendData "Hello!!"
Next

以下OK

Dim intCount As Integer

For intCount = 0 To 2
    DoEvents
    sckWinsock(intCount).SendData "Hello!!"
Next


以上が回答です。

ちなみに、今回の回答の内容はすべてVB 5.0に付属のオンラインド
キュメント(Help, BooksOnline)に記述されています。

市崎 大介
Technical Details
Message-ID: <6da3t9$a29$1@nn-tk003.ocn.ad.jp>
Path: arc1-ca.pugleaf.net!unknown!not-for-mail
References: <6c9pes$c2r@isv02.ilinx.co.jp>

Show Full Headers
Complete Article Headers
X-Google-Language: Japanese,JIS
X-Google-Thread: 105c2e,627160140d670efa
X-Google-Attributes: gid105c2e,public
From: "市崎 大介" <ichizaki@triad.ne.jp>
Subject: Re: winsockプログラミングの質問。
Date: 1998/03/01
Message-ID: <6da3t9$a29$1@nn-tk003.ocn.ad.jp>
X-Deja-AN: 329552939
Content-Transfer-Encoding: 7bit
References: <6c9pes$c2r@isv02.ilinx.co.jp>
Mime-Version: 1.0
Content-Type: text/plain; charset="iso-2022-jp"
X-MimeOLE: Produced By Microsoft MimeOLE V4.71.1712.3
Organization: NTT Open Computer Network
Newsgroups: fj.lang.visualbasic