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


HSPTV!掲示板


未解決 解決 停止 削除要請

2019
0722
名無三hspsockの代替ソケットについて6解決


名無三

リンク

2019/7/22(Mon) 18:35:29|NO.87912

学部内で対戦(ハルヒvsコンピュータ部のアレ)するゲームを作ろうと思っています。サーバー立てて
クライアント作って…まではうまくいったのですが、sockwaitの代替ソケットを利用してソケットを
割り振る(?)方法がわからず苦戦しています。代替ソケットの使い方を教えてください。
また、hspsockでのデータ送信の限度はどのように求めればいいですか?bpsを信じるならば、1Gbps
であれば60fpsで9MB/f通信できることになりますが、それより少なく感じます。



この記事に返信する


zakki

リンク

2019/7/23(Tue) 14:09:27|NO.87917

代替ソケットはこんな感じです
http://hsp.tv/play/pforum.php?mode=pastwch&num=85706

9MBのバッファを一括でsockputb/sockgetb して帯域の数割で通信できていれば各種オーバーヘッド含めると御の字だと思います。



名無三

リンク

2019/7/25(Thu) 21:00:59|NO.87936

ありがとうございます、調査不足申し訳ないです…
この先でのソースを見るに、途中入場はむつかしい感じですかね?



zakki

リンク

2019/7/25(Thu) 22:10:53|NO.87939

元のプログラムが事前に全員の接続を待って開始するようになっていたのでそうなっているだけで
sockwaitをメインループ側に移動して新規のクライアント接続無いか毎回チェックすればいいのでは。

sockwaitが10ms程度ブロックするのが致命的なケースだとそうも行きませんが普通は問題なさそうです。



名無三

リンク

2019/7/25(Thu) 23:27:03|NO.87941

sockmakeをクライアントの追加ごとにやらないといけないように思うのですが?



zakki

リンク

2019/7/26(Fri) 08:46:39|NO.87943

その通りですがsockmakeもブロックしないので問題ないと思います。懸念点は何ですか?



名無三

リンク

2019/7/26(Fri) 14:22:44|NO.87944

あぁできた!できました!最初に作ったときの考えにとらわれすぎていたようです。

ありがとうございます!

戒めのソース

#include "hspsock.as" onexit *exit screen 0,100,ginfo_dispy,0,0,0 title "サーバー" #define Client_MAX 8 //クライアント台数 #define Free_Port 2000 //クライアント受付用ポート ipget:Server_IP = refstr //サーバーIP dim on_cl , Client_MAX dim pr , Client_MAX ddim px , Client_MAX ddim py , Client_MAX repeat client_id=-1 repeat Client_MAX if(on_cl(cnt)==0){client_id=cnt:break} loop if(client_id==-1){ goto*exit } sockmake 0, Free_Port repeat sockwait 0, client_id+1 if(stat == 0){ on_cl(client_id)=1 sockputc client_id , client_id+1 break } repeat Client_MAX if(on_cl(cnt)==1){ sockcheck cnt+1 if(stat==0){ r=0 sockgetc r, 1 + cnt m=0 sockgetc m, 1 + cnt pr(cnt)+=r r=deg2rad(360*pr(cnt)/255) px(cnt)+=sin(r)*m py(cnt)+=cos(r)*m if (stat!=0){ on_cl(cnt)=0 } } if (stat>=2){goto*exit} } loop // repeat Client_MAX if(on_cl(cnt)==1){ s="" repeat Client_MAX if(on_cl(cnt)==1){ s+=""+cnt+"|"+int(px(cnt))+","+int(py(cnt))+";" } loop sockput s, cnt+1 } loop redraw 0 color 255,255,255:boxf color : pos 0,0 repeat Client_MAX mes "ID"+cnt+" = "+on_cl(cnt) loop redraw 1 await 0 loop loop *exit repeat Client_MAX if(on_cl(cnt)==1){ sockput "end", cnt+1 } loop sockclose 0 end

クライアント戒め

#include "hspsock.as" onexit *exit screen 0,300,300,0,100+300,0 title "クライアント" #define Client_MAX 8 //クライアント台数 #define Free_Port 2000 //クライアント受付用ポート Server_IP="0.0.0.0" //サーバーIP sockopen 0, Server_IP, Free_Port : if(stat != 0) { goto *exit } repeat sockcheck 0 if(stat==0){ break } loop on_c=0 dim on_cl , Client_MAX ddim pr , Client_MAX dim px , Client_MAX dim py , Client_MAX sockgetc My_ID, 0 repeat sockcheck 0 if(stat==0){ p="" sockget p,14*16, 0 if (stat != 0 || instr(p,0,"end")!=-1) { goto *exit } repeat Client_MAX on_cl(cnt)=0 loop repeat if (instr(p,0,";")!=-1){ on_c = int( strmid(p,0 ,instr(p,0,"|")-0 ) ) on_cl(on_c) = 1 px(on_c) = int( strmid(p,instr(p,0,"|")+1 ,instr(p,0,",")-(instr(p,0,"|")+1) ) ) py(on_c) = int( strmid(p,instr(p,0,",")+1 ,instr(p,0,";")-(instr(p,0,",")+1) ) ) p = strmid(p,instr(p,0,";")+1,strlen(p)) }else{ break } loop } getkey keyup, 38 getkey keydw, 40 getkey keyri, 39 getkey keyle, 37 r=keyri-keyle m=keydw-keyup sockputc r,0 sockputc m,0 redraw 0 color 255,255,255:boxf color 0,0,0 pos 0,0 mes "mine : "+strf("%x",My_ID)+";" repeat Client_MAX if (on_cl(cnt)==1){ x=px(cnt) y=py(cnt) boxf x-5,y-5,x+5,y+5 } loop mes p redraw 1 await 16 loop *exit sockputc 99,0 end



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