HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2009
0117
丸山ネット5未解決


丸山

リンク

2009/1/17(Sat) 10:11:42|NO.22906

こんにちは、丸山と申します。
pcbnet2.asを使用してリモートデスクトップを作っています。
それで、サーバー用のスクリプトにソケットを3つ作りたいのですが、
作成できません。
お力を貸してください。



この記事に返信する


.Hrk

リンク

2009/1/17(Sat) 18:27:16|NO.22919

>http://72.14.235.132/search?q=cache:5HU4PO15XUwJ:program.dot.thebbs.jp/1018482605.101-200+sockmake+同じポート&hl=ja&ct=clnk&cd=3&gl=jp&lr=lang_ja
によると、sockmakeは同じポートで複数のソケットは作れないようです。
自分もこれでつまづきました。

なので、
案内用ポートx1と接続用ポートxNを用意し、

クライアントは案内用ポートに接続して接続用ポートを得た後、再度そのポートに接続
するというやり方にするしかなさそうです。

他にこれより良さそうな方法知っている方がいらっしゃれば教えてほしいです。



.Hrk

リンク

2009/1/17(Sat) 20:20:44|NO.22923

遅くなりましたが、サンプルプログラムを作ってみました。
必ず、サーバーから先に起動してください。

サーバー側を起動させたまま、クライアントを立ち上げたり、終了してみたりしてサーバー側の表示を確認してください。
また、クライアントが3台以上起動できないことも確かめてみてください。

サーバー側のプログラム

#include "hspsock.as" #const PORT_ST 1333 #define ctype PORT(%1) (PORT_ST + (%1)) ;指定されたIDのポートを返す #const CONMAX 4 #const STATE_CLOSED 0 ;ソケットを開く前 #const STATE_OPENED 1 ;接続前 #const STATE_CONNECTED 2 ;接続中 dim constat_, CONMAX ;stat repeat CONMAX constat_(cnt) = STATE_CLOSED loop concnt_ = 0 ;接続案内用(x1)と接続用(x3)にソケットを初期化 repeat CONMAX sockmake cnt, PORT(cnt) if( stat ): dialog "sockmake error. (code="+stat+")",1: goto *sock_error constat_(cnt) = STATE_OPENED loop ;接続待ち title "接続待ち..." *main repeat CONMAX switch constat_(cnt) case STATE_OPENED ;接続待ち sockwait cnt if( stat > 1 ){ dialog "sockwait error. (code="+stat+", index="+cnt+")",1: goto *sock_error }else:if( stat == 0 ){ ;接続された if( cnt == 0 ){ ;接続案内 ;利用可能なポート番号を探す index = -1 repeat CONMAX-1,1 ;index=0は案内用に使っているので除く if( constat_(cnt) == STATE_OPENED ): index=cnt: break loop msg="" if( index == -1 ){ msg = "failed." }else{ msg = ""+PORT(index) } sockput msg, 0 if( stat ): dialog "sockput error. (code="+stat+")",1: goto *sock_error ;接続案内用ソケットを再び接続待ち可能にする (切断→初期化) sockclose 0 sockmake 0, PORT_ST if( stat ): dialog "sockmake error. (code="+stat+")",1: goto *sock_error }else{ ;本接続 constat_(cnt) = STATE_CONNECTED mes "system: port="+PORT(cnt)+" のソケットが接続されました" concnt_++ title "接続中のソケット数="+concnt_ } } swbreak case STATE_CONNECTED ;接続中 sockcheck cnt:ret=stat if( stat == 2 ){ dialog "sockcheck error. (code="+stat+")",1: goto *sock_error }else:if( stat == 0 ){ ;データが到着 sdim buf, 64 sockget buf, 64, cnt if( stat ){ ;切断されてるっぽい ;切断 sockclose cnt constat_(cnt) = STATE_CLOSED mes "system: port="+PORT(cnt)+" のソケットが切断されました" concnt_-- title "接続中のソケット数="+concnt_ ;初期化 sockmake cnt, PORT(cnt) if( stat ): dialog "sockmake error. (code="+stat+")",1: goto *sock_error constat_(cnt) = STATE_OPENED }else{ ;受信データを処理 mes "port="+(PORT_ST+cnt)+" <"+buf+">received." } } swbreak swend loop await 0 goto *main *sock_error repeat CONMAX if( constat_(cnt) != STATE_CLOSED ): sockclose cnt loop end

クライアント側のプログラム

#include "hspsock.as" #define HOST "localhost" #const INFORM_PORT 1333 port_ = 0 ;接続案内用ポートに接続 sockopen 0, HOST, INFORM_PORT if( stat ): dialog "sockopen error. (code="+stat+")",1: end ;データ受信待ち title "ポート番号受信待ち..." repeat sockcheck 0 if( stat == 2 ): dialog "sockcheck error. (code="+stat+")",1: goto *sock_error if( stat == 0 ): break await 0 loop ;データを受信 sdim buf, 64 sockget buf, 64, 0 if( stat ): dialog "sockget error. (code="+stat+")",1: goto *sock_error if( buf == "failed." ): dialog "server is busy.",1: goto *sock_error port_ = int(buf) ;切断 sockclose 0 ;本接続 sockopen 0, HOST, port_ if( stat ): dialog "sockopen error. (code="+stat+")",1: end title "サーバー '"+HOST+"', ポート="+port_+" に接続しました。" sdim msg_, 64 input msg_, 200, 20 button gosub "送信", *sock_sendmsg *main await 25 goto *main *sock_sendmsg sockput msg_, 0 if( stat ): dialog "sockput error. (code="+stat+")",1: goto *sock_error return *sock_error sockclose 0 end



.Hrk

リンク

2009/1/17(Sat) 20:28:38|NO.22924

追記ですが、ヘルプのsockcheckの説明が間違っていると思われます。

sockcheckの戻り値(stat)

0 : 受信データが到着している, あるいは切断された(sockget系の命令でエラーが発生するかで判定)
1 : 受信データは到着していない(タイムアウト)
2 : 通信中にエラーが発生した

切断されたのなら2が返ってくるのが普通だと思ったのですが、なぜか0が返ってきます。



.Hrk

リンク

2009/1/17(Sat) 21:25:09|NO.22925

pcbnet2.asをhspsock.asと間違えました。すみません。



丸山

リンク

2009/1/24(Sat) 13:45:45|NO.23011

.Hrkさんどうもありがとうございました。
おかげで何とか通信はできました。
それでつぎの問題は常時サーバーに接続できるようにしたいのですが、
クライアントの接続が切れるとサーバーも起動しなくなります。
どうしてでしょうか?



ONION software Copyright 1997-2023(c) All rights reserved.