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


HSPTV!掲示板


未解決 解決 停止 削除要請

2008
0502
X-platepcbnet2 チャットが正常に動作しない2停止


X-plate

リンク

2008/5/2(Fri) 16:52:44|NO.15589

pcbnet2に付属しているチャットプログラムをHSP3用に改造しているところなのですが
以下のスクリプトを実行しエンターキーでメッセージ送信をすると
永遠にメッセージが送信されてしまいます

クライアント側

#include "pcbnet2.as" #define PORT 3301 ;ポート番号 ;///////////////////////////////////////////// 初期化 randomize sdim name,64 sdim host,256 sdim msg,256 sdim memberlist,16000 sdim buf,2000 sdim s,2000 sdim ss,2000 host="192.168.0.2" r=rnd(100) name="Test"+r title "Simple Chat" objmode 2 ;///////////////////////////////////////////// メニュー画面 *menu cls 1 pos 10,10 mes "接続先:" pos 20,30 input host,200,24,255 pos 10,70 mes "ニックネーム:" pos 20,90 input name,200,24,63 pos 40,150 objsize 120,24 button "接続",*connect objsel 0 stop ;///////////////////////////////////////////// 接続開始 *connect if (name="")|(host="") : dialog "必要事項を入力してください" : stop cls 1 tcpopen soc,host,PORT if stat : dialog "tcpopenに失敗しました!",1 : end mes host+" に接続中..." *@ tcpiscon soc if stat=0 : wait 1 : goto *@b if stat>1 : tcpclose soc : dialog "接続に失敗しました!",1 : goto *menu mes "接続が完了しました." wait 50 cls 1 pos 0,ginfo_winy-24 mesbox msg,ginfo_winx-160,24,1 pos ginfo_winy-160,0 objsize 160,ginfo_winy listbox dummy,0,"" tcpput "login "+name+"\n",soc goto *main ;///////////////////////////////////////////// メイン *main tcpfail soc if stat : tcpclose soc : dialog "接続が切断されました!",1 : end tcpgetl buf,1024,soc if stat : gosub *recv a = instr (msg,0,"\n") if a!-1 : gosub *send wait 1 goto *main *recv sdim cmd,1024 sdim arg,1024 getstr cmd,buf,0,' ' getstr arg,buf,strsize if cmd="joined" : gosub *joinedmember if cmd="left" : gosub *leftmember if cmd="msg" : gosub *message return *joinedmember memberlist+=arg+"\n" objprm 1,memberlist objsel 0 return *leftmember notesel memberlist members = noteinfo(0) repeat members noteget s,cnt if s=arg : notedel cnt : break loop objprm 1,memberlist objsel 0 return *message redraw 2 pos 0,0 gcopy 0,0,20,ginfo_winx,ginfo_winy-20 pos 0,ginfo_winy-24-20 mes arg redraw 1 return *send s=msg a = instr (msg,0,"\n") getstr ss,s,a+2 poke s,a,0 s+=ss buf="say "+s+"\n" tcpput buf,soc objprm 0,"" return
サーバー側

#include "pcbnet2.as" #define PORT 3301 ;ポート番号 #define MAXCLIENTS 8 ;最大クライアント数 ;///////////////////////////////////////////// 初期化 dim socs,MAXCLIENTS sdim name,64,MAXCLIENTS sdim host,256,MAXCLIENTS sdim lastrecv,2000 sdim buf,2000 sdim s,2000 sdim ss,2000 sdim inaddr,1024 sdim exaddr,1024 title "Simple Chat Server" objmode 2 ;///////////////////////////////////////////// スタートアップ cls 1 tcpmake lis,PORT if stat : dialog "ソケットの作成に失敗しました!",1 : end ownip inaddr isip inaddr if stat=2 : priv=1 mes "ローカルアドレスは"+inaddr+"です." if priv { mes "プライベートアドレスです." mes "インターネットゲートウェイの検出中..." *@ natinit if stat=0 : wait 1 : goto *@b if stat=1 { mes "インターネットゲートウェイが検出されました." mes "ポートマッピングを登録しています..." natbind lis,PORT *@ natcheck lis if stat=0 : wait 1 : goto *@b if stat>1 { mes "Bindに失敗しました." } else { exaddr=refstr getstr exaddr,exaddr,0,':' mes refstr+"が割り当てられました." } } else { mes "インターネットゲートウェイが検出できませんでした." } } mes "待機を開始します..." wait 200 cls 1 goto *main ;///////////////////////////////////////////// メイン *main tcpwait lis if stat : gosub *accept repeat MAXCLIENTS n=cnt soc=socs.n if soc=0 : continue repeat tcpgetl buf,1024,soc if stat=0 : break gosub *recv loop tcpfail soc if stat : gosub *disconnect loop gosub *drawstat wait 1 goto *main *accept tcpaccept soc,lis t=-1 repeat MAXCLIENTS if socs.cnt=0 : t=cnt : break loop if t<0 : tcpclose soc : return repeat MAXCLIENTS if socs.cnt=0 : continue tcpput "joined "+name.cnt+"\n",soc loop socs.t=soc tcpinfo host.t,soc return *recv lastrecv=buf sdim cmd,1024 sdim arg,1024 getstr cmd,buf,0,' ' getstr arg,buf,strsize if cmd="login" : gosub *login if cmd="say" : gosub *say return *login name.n = strmid (arg,0,63) s="joined "+name.n+"\n" gosub *sendall s="msg SYSTEM> "+name.n+"がログインしました.\n" gosub *sendall return *say ss = strmid (arg,0,255) s="msg "+name.n+"> "+ss+"\n" gosub *sendall return *disconnect tcpclose soc socs.n=0 s="left "+name.n+"\n" gosub *sendall s="msg SYSTEM> "+name.n+"がログアウトしました.\n" gosub *sendall return *drawstat redraw 2 color 192,192,192 boxf color 0,0,0 pos 0,0 mes "Address: "+inaddr if exaddr!"" : mes "Address: "+exaddr mes " " repeat MAXCLIENTS if socs.cnt=0 { mes ""+cnt+": <LISTENING>" } else { mes ""+cnt+": "+name.cnt+" ("+host.cnt+")" } loop mes " " mes "Last Received: "+lastrecv redraw 1 return *sendall repeat MAXCLIENTS if socs.cnt=0 : continue tcpput s,socs.cnt loop return
クライアント側のプログラムをいろいろいじっているのですが
変化がなく行き詰っている状態です
どなたか解決方法を教えてください

よろしくお願いします



この記事に返信する


SYAM

リンク

2008/5/2(Fri) 18:11:39|NO.15590

クライアント側のmainとsendラベル以下だけしか見てませんが、少なくとも原因の1つがそこにあります。

msgを入力ボックスの内容に設定した あと、
""を入力ボックスの内容に設定すること は、
msg に ""を代入する事にはならないことに注意してください。

そして、サブルーチンジャンプから戻った後のmsgの内容と、それによってmainラベル以下で何が起きているかに注意して下さい。



X-plate

リンク

2008/5/2(Fri) 22:42:04|NO.15601

あぁ msg を初期化していなかったのが原因だったのか
見事に解決しました

ありがとうございます



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