🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: fj.lang.visualbasic
2 messages
2 total messages Started by Syuji Okumura Mon, 16 Feb 1998 00:00
winsockプログラミングの質問。
#658
Author: Syuji Okumura
Date: Mon, 16 Feb 1998 00:00
30 lines
1629 bytes
$B<ALd(B
TCP$B$G$N(Bsoket$BDL?.$K$D$$$F(B

$B$o$+$i$J$$$3$H-!(B
server$B$N(Blocal$B%]!<%H$r(Bclose$B$7$F$+$i(Bclient$B$N(Blocal$B%]!<%H$r(Bclose$B$7!"(B
connect$B$9$k$HD>$0$K@\B3$G$-$k$,!"(B
client$B$N(Blocal$B%]!<%H$r(Bclose$B$7!"(Bserver$B$rMW5a<u$1F~$l>uBV$K$7$F(B
connect$B$9$k$HI,$:@\B3<:GT$9$k$N$O2?8N$+!)(B

$B$o$+$C$?$3$H(B
client$B$N(Blocal$B%]!<%H$rJL$N%]!<%H$K$9$k$HD>$0$K@\B3$,2DG=$K$J$C$?!#(B
$B$7$+$7!"(B
$B<B9T%(%i!<(B'10048" $B%"%I%l%9$,;HMQ$5$l$F$$$^$9!#(B
$B$HI=<($5$l$k;~$,$"$k!#(B

$B$7$j$?$$$3$H(B
$B0J2<(Bclient$BB&$N(Blocal$B%]!<%H$G$9!#(B
$B!&;HMQ$G$-$k(Blocal$B%]!<%H$N8!:wJ}K!(B
$B!&;HMQ$G$-$J$$(Blocal$B%]!<%H$r;HMQ2DG=$K$9$kJ}K!(B

$B$o$+$i$J$$$3$H-"(B
$B8=>](B
server$B$N(BDataArrival$B$G!"(BA($B2>(B)$B%]!<%H$+$i(BGetData$B$7$F!"(BA$B%]!<%H$K(BSendData$B$7$?8e!"(B
B($B2>(B)$B%]!<%H$K(BSendData$B$9$k$H!"(Bclient$BB&$K(BB$B%]!<%H$N%G!<%?$OAw$i$l$?$,(BA$B%]!<%H$N%G!<(B
$B%?$,Aw$i$l$J$+$C$?!#(B
$B<!$N(BDataArrival$B$G(BA$B%]!<%H$K(BSendData$B$7$?$iA02s$N%G!<%?$H$$$C$7$g$KAw$i$l$?!#(B

$B$7$j$?$$$3$H(B
SendData$B$G!"%P%C%U%!$KN/$C$?$^$^Aw$i$l$J$+$C$?M}M3(B
Re: winsockプログラミングの質問。
#468
Author: 市崎 大介
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)に記述されています。

市崎 大介
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads