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


HSPTV!掲示板


未解決 解決 停止 削除要請

2023
1227
buhioHSPSOCKを使った対戦などの実装について21解決


buhio

リンク

2023/12/27(Wed) 13:46:05|NO.100925

みなさんコンニチワ

あまりHSPSOCKについての情報がないのは、中々使い勝手が難しい点があるようですが、
テストとして、サーバーとクライアントがリアルタイムにデータを送受信するコードを作ってみました。

①ただし、TCP/IPの知識が適当なので、コードは正しくないかもしれません。
②質問:ソケットとポート番号はワンセットで、HSPSOCKでは32個のソケットが作成できる(32人接続が限界)という理解でよいのか
③質問:サーバー側とクライアント側のソケット番号というのは一致させる?別々でも構わない?
④接続する人数が10人なら、10個のポートを用意していますが、そういう考え方でよいのか。
⑤テストはローカルエリアでしかできていませんが、このコードで、サーバーのポート開放したら動くのか
⑥リアルタイムゲームを想定していますが、このようなコードでよいのか
⑦受信・送信エラー処理等の注意点があればご教示ください。

あまりネット対戦モノをHSPで見かけませんが、やっぱりゲームに限らず、他人と繋がるアプリ作成がしてみたいなぁということからの質問です。
よろしくお願いいたします。長々と失礼します。

サーバー側

#include "hspsock.as" //サーバーの起動 port=10000 //今回はport 10000~10031を使用 ipget title "アドレス"+refstr+" ポート"+port+"で接続を待っています..." sockmake 0,port if stat : dialog "Socket error": goto *errbye //変数初期化 state=0 //待ち受け状態 s_id=1 //準備ソケットの番号 dim socklist,32 //ソケットの状態管理 ;======================================================== ;メインループ *main redraw 0 color 125,0,0 boxf ;======================================================== if state=0{//最初の接続待ち sockwait 0 if stat>1 : dialog "server0:Socket error": goto *errbye if stat=0 {//Clientからの接続要求が成功 sockput ""+s_id,0//Clientへ空いているソケット番号を通知 sockclose 0//最初の接続待ち完了 sockmake s_id,port+s_id//通知したソケット番号と新しいポート番号でソケット作成 state=1//次のステップへ } } ;======================================================== if state=1{//割当てたソケットの接続待ち sockwait s_id title "CHK="+stat+"/"+a if stat>1 : dialog "server1:Socket error": goto *errbye if stat=0 {//割り当てたソケットでの接続に成功 sockput "接続完了"+s_id+":",s_id title "割当ソケットの接続待ち完了"+s_id socklist(s_id)=1//接続完了したソケットを記録 s_id++//次の空き番号を準備 sockmake 0,port//再びソケット0で接続を待つ state=0//前のステップへ } } ;===================== ;全ソケットのうち、接続が完了したソケットから受信 ;全ソケットのうち、接続が完了したソケットへ送信 repeat 32 if cnt>0{ if socklist(cnt)=1{ ;受信 sockcheck cnt if stat=0{ data="" sockget data,64,cnt color 0,0,0 pos 300,cnt*20 mes ""+data } if stat { pos 300,cnt*20 mes ""+cnt+"番=client:socket error:"+stat } ;送信 servertxt="Serverから"+cnt+"番へ送信"+timer sockput servertxt,cnt timer++ } } loop ;======================================================== ;ここにゲーム等の処理を記述 redraw 1 await 1000/60 goto *main ;===================== ;エラー等終了処理 *errbye sockclose mes "終了" stop

クライアント側

#include "hspsock.as" //変数初期化 adr="192.168.0.4" //→サーバーのアドレス:自分の環境に合わせて変更 port=10000 //今回はport 10000~10031を使用 ipget ipaddress=refstr state=0 //サーバーへの接続状態 ;======================================================== ;メインループ *main redraw 0 color 255,255,255 boxf ;======================================================== if state=0{//まずソケット0でサーバーの指定ポートに接続要求 title adr+"、ポート"+port+"に接続中..." sockopen 0,adr,port if stat {//接続できなかった title "サーバーに接続できません:socket error"+stat count++ pos 0,0 color 0,0,0 mes "接続を試行中"+count+"回目" }else{//接続できた data="" count=0 state=1//次のステップへ } } ;======================================================== if state=1{//0番に接続できたので、サーバーから割り当てられた番号を取得 sockcheck 0 if stat=0{//番号を取得 ;サーバーから受信 sockget data,64,0 int_data=int(data) sockopen int_data,adr,port+int_data//そのソケット番号で接続 if stat {//接続できなかった title "ソケット番号"+int_data+"でサーバーに接続できません:socket error:"+stat count++ pos 0,0 color 0,0,0 mes "接続を試行中"+count+"回目" }else{//接続できた title "Server"+adr+"、ポート"+(port+int_data)+"に接続完了" state=2//次のステップへ } } if stat :pos 0,0: mes "sockget_error"+stat } ;======================================================== if state=2{//割り当てられたソケットでサーバーとデータの送受信 ;サーバーから受信 sockcheck int_data if stat=0{ sockget data,64,int_data pos 0,30 color 0,0,0 mes "受信:"+data } ;サーバーへ送信 sockput ""+int_data+"番Clientから受信:"+timer,int_data timer++ } ;======================================================== ;ここにゲーム等の処理を記述 pos 0,50 color 0,0,0 mes "ClientのIPアドレス"+ipaddress redraw 1 await 1000/60 goto *main ;===================== ;エラー等終了処理 *bye sockclose ;ソケットを閉じる redraw 1 await 1000/60 stop



この記事に返信する


buhio

リンク

2023/12/28(Thu) 08:35:31|NO.100933

自己レス
pcbnetなるものがあるようなので、ちょっと研究してみます。



buhio

リンク

2023/12/28(Thu) 20:00:56|NO.100942

追伸

pcbnet2というプラグインにより、ネット通信に成功しました。
一人なので中々検証できないですが、インターネット経由で接続し、
簡単な2Dキャラ表示のゲーム(というレベルではないが)の同期、同時複数人ログイン、、チャットもどきに成功です。
すごいねぇコレ作った人とか

物理的なサーバーとの距離が1km未満くらいなので、北海道の人と通信したらわかりませんが。

以上、ちょっとしたご報告



ABATBeliever

リンク

2023/12/28(Thu) 22:30:23|NO.100946

失礼します
四国の何処かに住んでいるのですが、検証一緒にやってみたいです()



buhio

リンク

2023/12/29(Fri) 15:01:15|NO.100949

>>ABATBelieverさん

こんにちわ!ほんとですか!それはありがたいです。

よろしければ、buhiochaa@gmail.com までメールを頂ければ、
スクリプトをお渡しします。

 今のところ大阪の田舎と、大阪市内でテストして、まぁ一応動いてるかな~って感じ
他にもご協力いただける方がいらっしゃったら是非お願いします



buhio

リンク

2023/12/29(Fri) 15:06:59|NO.100950

こんな感じ、、ゲームにはなってないですよ

https://youtu.be/bAgaiG4qMQg



buhio

リンク

2023/12/30(Sat) 15:13:51|NO.100954

 みんな年末で忙しそうなので、

https://sites.google.com/view/buhio/%E3%83%9B%E3%83%BC%E3%83%A0/hgimg4#h.2q45g3ob86h1

 zip形式でアップしてます。ぼっちな正月の方々は、起動して「JOIN」してください。
発言するには文字を入力して「Ctrl+Enter」です。

 ふらっと立ち寄ってくださいまし。



buhio

リンク

2024/1/1(Mon) 14:17:16|NO.100963

あけましておめでとうございます。
正月からやってます、、

ほんのりとアップデートしました。(Ver0.2)
だれかMAPを広げてほしい。。。
どうかな、遅延の具合はまだなんとも言えないですね。
もうちょっとゲームにしないとダメだな。
とりあえずまだまだテスト版です。

https://sites.google.com/view/buhio/%E3%83%9B%E3%83%BC%E3%83%A0/hgimg4#h.2q45g3ob86h1



buhio

リンク

2024/1/22(Mon) 12:29:49|NO.101124

皆さん、こんにちわ

すこしづつ、ネット対戦進んでいるのですが、さくらレンタルサーバーを借りてテストしています。

Windows Server 2022 Datacenterなのですが、HGIMG4が起動しません。


 #include "hgimg4.as"  mes "test"

という、シンプルなコードで、起動しかけて落ちます。

通常のHSPサンプルは動きます。
HGIMG3のサンプルは動きました。
HSP3DISHをインクルードしても、落ちない。
HGIMG4をインクルードすると落ちます。
pcbnet2は、2Dのテスト作成時に動作確認できています。

openglが入ってないとか、関係あるんですかね?
情報を頂けるとありがたいです。なにかヒントを頂ければ幸いです。
よろしくお願いいたします。



buhio

リンク

2024/1/22(Mon) 14:42:44|NO.101128

DirectXモードならと


#include "hgimg4dx.as"

にすると、

エラーメッセージ
「OpenGL initalize failed.」
が表示されます。
DirectXモードなのに?わからぬ。。。

windows/system32/opengl.dll→存在する。

・hgimg4.as→落ちる
・hgimg4dx→上記エラーメッセージ
・webgl→ブラウザ上で珠音が動いている(拙作サイト)

リモートデスクトップなので、ディスプレイドライバが入っていない?
dxdiagでdirectXバージョンは12を確認

DirectX9が必要かも、インストール→やっぱりだめ。。


hsp3demo.exeを実行してみる→3Dがないからか、普通に実行できた。
gpbコンバータは、プレビューでやっぱり落ちる。



ABATBeliever

リンク

2024/1/22(Mon) 17:05:36|NO.101129

すいません!
色々あって遅れました!
いま連絡送りますね



zakki

リンク

2024/1/22(Mon) 18:10:11|NO.101130

sockwaitの第二引数を使えば陽にポート番号管理しなくてもOKです。
pcbnet2のほうが自由度は高いかもしれません。

http://hsp.tv/play/pforum.php?mode=pastwch&num=85706



buhio

リンク

2024/1/22(Mon) 18:12:09|NO.101131

>>ABATBelieverさん

 どうもこんにちわ。ありがとうございます。
 ところが、現在上記の件でハマっています。しばしお待ちください。

>>WinServer2022その他状況報告

 openGLのバージョンが1.1となっています。
グラフィックドライバがインストールされていないようです。
OPENGLだけ3.1ぐらいにバージョンアップしたいのですが、できない?

Microsoft Remote Desktop Adapterというのが、デバイスマネージャで確認できますが、オンボードでもグラフィックカードが載っていないってことなんでしょうか。。
くぅぅぅ難しい。。。



usagi

リンク

2024/1/22(Mon) 18:17:07|NO.101132

こんにちわ

>"OpenGL initalize failed."
おそらくですが、Angleの方でエラーが出て、
その流れでその様なメッセージが出たのではないでしょうか?
※AngleがOpenGL ESをラップしていてhgimg4がDirectX用に書き換わっている訳ではないので

ですから、「DirectXのはずなのに何故OpenGl?」という所は問題ではなく(表示だけの問題)、
「ハードウェアアクセラレーションが使えない」という状況かと思いました。


webglなどはクライアント側で実行しているので動いているのではと思われますが、
サーバー側で実行して、それをRDPで操作したいイメージですか?
もしそうであれば、私はサーバー側で実行する経験が無いのでお役に立てないかもしれませんが、、
試しに下記を実行すると、OpenGLのバージョンやハードウェア名が表示されますでしょうか。

直接HSPからOpenGLを呼び出しておりまして、もし表示に問題があれば
お使いのサーバーでは動作しない状態なのかと思いました。
(Window serverってデフォでGPU使えるんでしたっけ。。。?)
(VENDORに会社名が出ればそこからグラフィックカードのドライバインストールする)


; user32 ;---------------------------------------------------------- #uselib "user32.dll" #cfunc global GetDC "GetDC" int #func global ReleaseDC "ReleaseDC" int,int ; gdi32 (wingdi.h) ;---------------------------------------------------------- #uselib "gdi32.dll" #func global SetPixelFormat "SetPixelFormat" int,int,int #cfunc global ChoosePixelFormat"ChoosePixelFormat" int,int #define global PFD_TYPE_RGBA 0 #define global PFD_MAIN_PLANE 0 #define global PFD_DOUBLEBUFFER 1 #define global PFD_DRAW_TO_WINDOW 4 #define global PFD_SUPPORT_OPENGL 32 ; OpneGL ;---------------------------------------------------------- #uselib "opengl32.dll" ; 初期化 #cfunc global wglCreateContext "wglCreateContext" int #func global wglDeleteContext "wglDeleteContext" int #func global wglMakeCurrent "wglMakeCurrent" int,int ; 情報 #cfunc global glGetString "glGetString" int #define global GL_VENDOR 0x1F00 #define global GL_RENDERER 0x1F01 #define global GL_VERSION 0x1F02 #define global GL_EXTENSIONS 0x1F03 #define global GL_SHADING_LANGUAGE_VERSION 0x8B8C ;ここから -------------------------------------------------- WinDC = GetDC(hwnd) ; PIXELFORMATDESCRIPTOR alloc pfd ,40 wpoke pfd, 0, varsize(pfd) ; size wpoke pfd, 2, 1 ; version lpoke pfd, 4, PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER ; flags poke pfd, 8, PFD_TYPE_RGBA ; pixel tyep poke pfd, 9, 24 ; color bits poke pfd, 23, 32 ; depth bits poke pfd, 24, 8 ; stencil bits poke pfd, 26, PFD_MAIN_PLANE ; layer tyep pixelFormat = ChoosePixelFormat(WinDC, varptr(pfd)) if pixelFormat = 0 : dialog "Not supported" : end SetPixelFormat WinDC, pixelFormat, varptr(pfd) ; OpneGL のレンダリングコンテキストのハンドルを取得 hRC = wglCreateContext( WinDC ) wglMakeCurrent WinDC, hRC ; 情報取得 dupptr vendor, glGetString(GL_VERSION), 64, 2 dupptr render, glGetString(GL_RENDERER), 64, 2 dupptr version, glGetString(GL_VERSION), 64, 2 dupptr glslversion, glGetString(GL_SHADING_LANGUAGE_VERSION), 64, 2 dupptr extensions, glGetString(GL_EXTENSIONS), 65535, 2 mes strf("VENDOR:\t%s\nGPU:\t%s\nOpenGL:\t%s\nGLSL:\t%s", vendor, render, version, glslversion) mes "---------" i=0 repeat getstr ext,extensions,i,' ',64 if strsize=0 { break } : i+=strsize mes ext loop onexit *exit stop ; 解放 *exit wglMakeCurrent WinDC,0 wglDeleteContext hRC ReleaseDC hwnd,WinDC end



buhio

リンク

2024/1/22(Mon) 18:17:10|NO.101133

>>zakkiさん

 ありがとうございます。やはり先人がいらしたんですね。
 リンク先を改めてじっくり読ませていただきます。
 (またHELPを出すやもしれません)

>>sockwaitの第二引数を使えば陽にポート番号管理しなくてもOKです。
>>pcbnet2のほうが自由度は高いかもしれません。

なるほど、やはりそういう風にできるんですね。
pcbnet2で、現在挑戦していますが、そちらも参考にいたします。



buhio

リンク

2024/1/22(Mon) 18:57:25|NO.101134

>>usagi師匠

 いつもながらありがとうございます。
 残念ながら、上記のスクリプトは実行できず落ちてしまいます。

 当然ながら、当方の自宅PCでは実行できるのですが、レンタルサーバー側のWindowsでスクリプトを実行しても、
 落ちてしまいました。

 OpenGL Extentions ViewerというソフトでOpenGLのバージョンを確認すると1.1となっています。
 https://drive.google.com/file/d/1J-7fz5z6KXkPsBta6WZ5KgFSBIo8YgYN/view?usp=drive_link
 (参考状況)
 そもそもGPUが使えないのかな。該当するnVidiaとかIntelというのが一切見当たらないのです。

>>やりたかったこと

 Client/Serverは難しいのは承知の上ですが、リアルタイムゲームでネット通信をやってみたく、
 HTTPでは難しそうなので、Tcpipかなと思っております(又はUdp)

 サーバー上でHSPのHGIMG4のサーバープログラムに当たり判定等をさせて、クライアントは受け取ったデータで
 描画、、ということを想定していました。

 サーバー上でメインシステムが動いていて、ユーザーがログインすると場面に参加、、というイメージです。
 開発環境のローカルではなんとなく動いているのですが、サーバーで動かないのは想定外でした。
 サーバー側では、必要以外はredrawせずにと思っていたのですが、そもそもHGIMG4が動かないので、もう少し調べて、
 最悪は方針変更かもしれません


 皆さんに頼るばかりでは申し訳ない限りですが、引き続きよろしくお願いいたします。



buhio

リンク

2024/1/22(Mon) 19:29:28|NO.101135

追記
>>webglなどはクライアント側で実行しているので動いているのではと思われますが、

 実は、webglは、Winサーバーのchromeブラウザできちんと表示されるのです。
 私が作ったサンプルを自分のHPで見ているので、HGIMG4製なのは間違いないです。
 https://sites.google.com/view/buhio/%E3%83%9B%E3%83%BC%E3%83%A0/webgl%E7%A0%94%E7%A9%B6%E6%89%80
 (↑これ)
 
 わからんっ!!🐽



usagi

リンク

2024/1/22(Mon) 20:46:53|NO.101137

なるほど。。。なんとなく状況理解できました。

>webglは、Winサーバーのchromeブラウザできちんと表示されるのです。
hgimg4ですが、jsに変換されていて、javaScriptのAPIなので、exe実行とは状況が違うかもですね。
(Chorme自体もANGLEで動いているので)

ちゃんと調べないと分からないですが
WGLで標準サポートされているのはGL 1.1ですし、
リンクのログを見ると1.1動いているように見えました。
それで、hgimg4が動作するのは、シェーダーが使えるGL 3.1以降だったかと記憶してますので、
レンタルサーバーに問い合わせるのがよろしいかと思いました。

ただ、おそらくレンタルサーバーでは難しいのではと考えてまして
設計を見直す必要があるかもしれません。


HGIMG4の当たり判定に依存していて、サーバー側で動かす必要があったのかと考えてますが、
"HSPCL"の様なコンソールアプリケーションとしてサーバーサイドのプログラムを用意し、
当たり判定などは自前で用意する必要があると思いました。

以下のようにネットワークプログラムを組むと良いかもしれません。

・クライアントは問い合わせをする。 (ログインしたい、移動したい、攻撃したい、HPはどれくらい)
 結果を描画する。
 
・サーバーは返答をする。 (ログイン出来るよ、みんなの位置はここだよ、HPはこれだよ)
 データの管理や計算する。

以上になります。
長文失礼いたしました。



buhio

リンク

2024/1/22(Mon) 21:21:39|NO.101139

>>師匠

とんでもございません。
おかげでよく理解できました。筋が通ってスッキリ。ありがとうございます。

さてさて、また違う方法を考えないといけません~



buhio

リンク

2024/1/26(Fri) 11:49:16|NO.101148




buhio

リンク

2024/1/31(Wed) 09:33:25|NO.101156

本日レンタルサーバーの機器不良による、強制再起動あり。

 そういうこともあるという記録。



buhio

リンク

2024/1/31(Wed) 13:51:38|NO.101157

追記 

 HGOMG4に関しては、やはりサーバーでの運用が難しかったのですが、
 アドバイスいただいた通り、
 サーバー側ではHGIMG4を使用せず、位置・姿勢、HPなどの状態管理と当たり判定、
 クライアント側では、操作キーのみを送信し、計算結果を受信して3D描画を行う形で
 なんとか進めそうです。

 ただし、遅延によりクライアントの描画がカクつくので、位置姿勢情報を補完するなど、受信情報を
 ダイレクトに使わない処理が必要なのが見えてきました。

 以上、ご報告兼進捗の記録。。



記事削除

記事NO.パスワード
(質問が解決したスレッドは他の利用者に活用してもらうため、削除しないようお願いします)

NO.100925への返信

マスコット

好きなマスコットを選んでください。

名前

e-mail
HOME
  1. 初めて利用する方は、HSP3掲示板の使い方をお読みください。
  2. 不要部分の多い長いスクリプトの投稿は ご遠慮ください。
  3. 書き込みは自動改行されません。適度に改行を入れてください。
  4. スクリプトは小文字の<pre>~</pre>で囲むと見やすく表示できます。

削除用パスワード

解決したら質問者本人がここをチェックしてください。

エラー発生時、再送信すると二重送信になることがあります。
回答が得られたら、お礼書き込み時に[解決]チェックしてください。
SPAM防止のためURLから始まる文章は投稿できません。
SPAM防止のため英文字のみの本文を投稿することはできません。

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