はじめまして、専門学校のゲーム制作科の学生、スモモと申します。
プログラムも掲示板の扱いもコミュニケーションも未熟です。
これから、なんにどうぞ、よろしくお願いいたします。
[1] 質問文
[1.1] 自分が今オンラインゲームのサーバー作りたいです。
[1.2] 取り組んだプログラムコードがまだありません。
[1.3]
[1.4] どうすれば複数クライアントが扱えるサーバーがどのように作ればいいでしょうか?
[2] 環境
[2.1] OS : Windows
[2.2] コンパイラ名 : VC++ 2008
[3] その他
・C言語を一年半ぐらい勉強しました。初級か中級ぐらいです。
・ライブラリを使っていません。
以上、よろしくの願いたします。
オンラインゲームのサーバー作り
Re:オンラインゲームのサーバー作り
オンラインゲームのサーバーということは
例えばじゃんけんで、クライアント1とクライアント2の間にサーバがいて
1と2の間の通信をやりとりしてあげるような感じでしょうか?
それなら、
サーバーは
0.クライアントが2人くるまで待つ
2.2人接続してきたら、サーバからクライアントに手を送るように指示する
4.選んだ手(グーチョキぱー)を受信、選んだ手を調べて、クライアントへ勝敗を送る
6.終了
クライアント1と2は
1.サーバーへ接続
3.サーバへ手をおくる
5.サーバからの勝敗をユーザーに伝える
6.終了
分かりにくですが・・・・こんな感じなのでしょうか?
どんなゲームのサーバなのかわからないので適当に考えてみました。
お考えの内容と全然違ってたらすみません。
どんな感じのゲームなのでしょう?
例えばじゃんけんで、クライアント1とクライアント2の間にサーバがいて
1と2の間の通信をやりとりしてあげるような感じでしょうか?
それなら、
サーバーは
0.クライアントが2人くるまで待つ
2.2人接続してきたら、サーバからクライアントに手を送るように指示する
4.選んだ手(グーチョキぱー)を受信、選んだ手を調べて、クライアントへ勝敗を送る
6.終了
クライアント1と2は
1.サーバーへ接続
3.サーバへ手をおくる
5.サーバからの勝敗をユーザーに伝える
6.終了
分かりにくですが・・・・こんな感じなのでしょうか?
どんなゲームのサーバなのかわからないので適当に考えてみました。
お考えの内容と全然違ってたらすみません。
どんな感じのゲームなのでしょう?
Re:オンラインゲームのサーバー作り
はじめまして、arrayと申します。
MMORPGゲームサーバープログラミング:
http://www.amazon.co.jp/MMORPG%E3%82%B2 ... 4797328460
評判を見るとゲームサーバを作る事は出来ないと書いてありますが、このような本もあるみたいなので紹介してきます。
個人的にはサーバを作るには、当たり前ですがネットワークの知識が重要だと思います。
ネットワークの知識をおさえたうえで、ソケットなどのプログラミングを行い
サーバとゲームで通信を行えるようにすれば良いと思います。
なので、ネットワークプログラミングの勉強も始めてはどうでしょうか
http://www.google.co.jp/search?q=%E3%83 ... =firefox-a
----------------------------------------------------------------------------------------
ただ単にサーバを作りたいのであれば勉強程度のものに費用をかけたくないと思うので
古くなって使わなくなったPCなどにLinuxのOSをインストールしてサーバとして色々やってみるのも
良いと思います。
Ubuntuはserver版があるのでお勧めしておきます。
とりあえずWebサーバとして動作を確認できる程度の知識があればいいと思います。
複数人の通信を処理するので、データベースを使うのもお勧めします。
ユーザーのキャラ情報などはクライアント(ユーザ)から送られてくる情報で
サーバーのデータベースを更新する事で管理します。
データベースも無料で使えるのがあるので好みで探して下さい。
個人的にはMySQLが好きです。
まとめになりますが、とりあえず下記のものを勉強してみると良いかと思います。
・Webサーバの作成
・データベースプログラミング
・ネットワークプログラミング
MMORPGゲームサーバープログラミング:
http://www.amazon.co.jp/MMORPG%E3%82%B2 ... 4797328460
評判を見るとゲームサーバを作る事は出来ないと書いてありますが、このような本もあるみたいなので紹介してきます。
個人的にはサーバを作るには、当たり前ですがネットワークの知識が重要だと思います。
ネットワークの知識をおさえたうえで、ソケットなどのプログラミングを行い
サーバとゲームで通信を行えるようにすれば良いと思います。
なので、ネットワークプログラミングの勉強も始めてはどうでしょうか
http://www.google.co.jp/search?q=%E3%83 ... =firefox-a
----------------------------------------------------------------------------------------
ただ単にサーバを作りたいのであれば勉強程度のものに費用をかけたくないと思うので
古くなって使わなくなったPCなどにLinuxのOSをインストールしてサーバとして色々やってみるのも
良いと思います。
Ubuntuはserver版があるのでお勧めしておきます。
とりあえずWebサーバとして動作を確認できる程度の知識があればいいと思います。
複数人の通信を処理するので、データベースを使うのもお勧めします。
ユーザーのキャラ情報などはクライアント(ユーザ)から送られてくる情報で
サーバーのデータベースを更新する事で管理します。
データベースも無料で使えるのがあるので好みで探して下さい。
個人的にはMySQLが好きです。
まとめになりますが、とりあえず下記のものを勉強してみると良いかと思います。
・Webサーバの作成
・データベースプログラミング
・ネットワークプログラミング
Re:オンラインゲームのサーバー作り
shiro4aoさん
arrayさん
ご回答ありがとうございます。
shiro4aoさんのじゃんけんサーバーは面白いですが私はこのくらいしかわからないです。
//クライアント
int main() {
// IP アドレス,ポート番号,ソケット,sockaddr_in 構造体
char destination[32];
int dstSocket;
struct sockaddr_in dstAddr;
// 各種パラメータ
char buffer[1024];
// Windows の場合
WSADATA data;
WSAStartup(MAKEWORD(2,0), &data);
// 相手先アドレスの入力と送る文字の入力
printf("サーバーマシンのIPは?:");
scanf("%s", destination);
// sockaddr_in 構造体のセット
memset(&dstAddr, 0, sizeof(dstAddr));
dstAddr.sin_port = htons(PORT);
dstAddr.sin_family = AF_INET;
dstAddr.sin_addr.s_addr = inet_addr(destination);
// ソケットの生成
dstSocket = socket(AF_INET, SOCK_STREAM, 0);
//接続
if(connect(dstSocket, (struct sockaddr *) &dstAddr, sizeof(dstAddr))){
printf("%s に接続できませんでした\n",destination);
return(-1);
}
printf("%s に接続しました\n", destination);
printf("適当なアルファベットを入力してください\n");
while (1){
scanf("%s",buffer);
//パケットの送信
send(dstSocket, buffer, 1024, 0);
//パケットの受信
recv(dstSocket, buffer, 1024, 0);
printf("→ %s\n\n",buffer);
}
// Windows でのソケットの終了
closesocket(dstSocket);
WSACleanup();
return(0);
}
//サーバー
int main() {
int i;
// ポート番号,ソケット
int srcSocket; // 自分
int dstSocket; // 相手
// sockaddr_in 構造体
struct sockaddr_in srcAddr;
struct sockaddr_in dstAddr;
int dstAddrSize = sizeof(dstAddr);
int status;
// 各種パラメータ
int numrcv;
char buffer[1024];
// Windows の場合
WSADATA data;
WSAStartup(MAKEWORD(2,0), &data);
// sockaddr_in 構造体のセット
memset(&srcAddr, 0, sizeof(srcAddr));
srcAddr.sin_port = htons(PORT);
srcAddr.sin_family = AF_INET;
srcAddr.sin_addr.s_addr = htonl(INADDR_ANY);
// ソケットの生成(ストリーム型)
srcSocket = socket(AF_INET, SOCK_STREAM, 0);
// ソケットのバインド
bind(srcSocket, (struct sockaddr *) &srcAddr, sizeof(srcAddr));
// 接続の許可
listen(srcSocket, 1);
while(1){ //ループで回すことによって何度でもクライアントからつなぐことができる
// 接続の受付け
printf("接続を待っています\nクライアントプログラムを動かしてください\n");
dstSocket = accept(srcSocket, (struct sockaddr *) &dstAddr, &dstAddrSize);
printf("%s から接続を受けました\n", inet_ntoa(dstAddr.sin_addr));
while(1){
//パケットの受信
numrcv = recv(dstSocket, buffer, sizeof(char)*1024, 0);
if(numrcv ==0 || numrcv ==-1 ){
status = closesocket(dstSocket); break;
}
printf("変換前 %s",buffer);
for (i=0; i< numrcv; i++){ // bufの中の小文字を大文字に変換
//if(isalpha(buffer))
buffer = toupper(buffer);
}
// パケットの送信
send(dstSocket, buffer, sizeof(char)*1024, 0);
printf("→ 変換後 %s \n",buffer);
}
}
// Windows での終了設定
WSACleanup();
return(0);
}
どうすればshiro4aoさんのじゃんけんサーバーに変身できるでしょうか?
ご教授の程、よろしくお願いします。
arrayさん何にから何にまで教えていただきありがとうございます。
今は就職向けの作品作っています。
時間的に無理かもしれませんので、いちから勉強するのはやめどきます。
作品は後通信部分だけできれば、遊べると思います。
それで、50人が遊べんる程度のサーバーが作りたいです。
LinuxのOSをインストールしてサーバとして色々やってみるのがいずれやります。
ご教授の程、よろしくお願いします。
arrayさん
ご回答ありがとうございます。
shiro4aoさんのじゃんけんサーバーは面白いですが私はこのくらいしかわからないです。
//クライアント
int main() {
// IP アドレス,ポート番号,ソケット,sockaddr_in 構造体
char destination[32];
int dstSocket;
struct sockaddr_in dstAddr;
// 各種パラメータ
char buffer[1024];
// Windows の場合
WSADATA data;
WSAStartup(MAKEWORD(2,0), &data);
// 相手先アドレスの入力と送る文字の入力
printf("サーバーマシンのIPは?:");
scanf("%s", destination);
// sockaddr_in 構造体のセット
memset(&dstAddr, 0, sizeof(dstAddr));
dstAddr.sin_port = htons(PORT);
dstAddr.sin_family = AF_INET;
dstAddr.sin_addr.s_addr = inet_addr(destination);
// ソケットの生成
dstSocket = socket(AF_INET, SOCK_STREAM, 0);
//接続
if(connect(dstSocket, (struct sockaddr *) &dstAddr, sizeof(dstAddr))){
printf("%s に接続できませんでした\n",destination);
return(-1);
}
printf("%s に接続しました\n", destination);
printf("適当なアルファベットを入力してください\n");
while (1){
scanf("%s",buffer);
//パケットの送信
send(dstSocket, buffer, 1024, 0);
//パケットの受信
recv(dstSocket, buffer, 1024, 0);
printf("→ %s\n\n",buffer);
}
// Windows でのソケットの終了
closesocket(dstSocket);
WSACleanup();
return(0);
}
//サーバー
int main() {
int i;
// ポート番号,ソケット
int srcSocket; // 自分
int dstSocket; // 相手
// sockaddr_in 構造体
struct sockaddr_in srcAddr;
struct sockaddr_in dstAddr;
int dstAddrSize = sizeof(dstAddr);
int status;
// 各種パラメータ
int numrcv;
char buffer[1024];
// Windows の場合
WSADATA data;
WSAStartup(MAKEWORD(2,0), &data);
// sockaddr_in 構造体のセット
memset(&srcAddr, 0, sizeof(srcAddr));
srcAddr.sin_port = htons(PORT);
srcAddr.sin_family = AF_INET;
srcAddr.sin_addr.s_addr = htonl(INADDR_ANY);
// ソケットの生成(ストリーム型)
srcSocket = socket(AF_INET, SOCK_STREAM, 0);
// ソケットのバインド
bind(srcSocket, (struct sockaddr *) &srcAddr, sizeof(srcAddr));
// 接続の許可
listen(srcSocket, 1);
while(1){ //ループで回すことによって何度でもクライアントからつなぐことができる
// 接続の受付け
printf("接続を待っています\nクライアントプログラムを動かしてください\n");
dstSocket = accept(srcSocket, (struct sockaddr *) &dstAddr, &dstAddrSize);
printf("%s から接続を受けました\n", inet_ntoa(dstAddr.sin_addr));
while(1){
//パケットの受信
numrcv = recv(dstSocket, buffer, sizeof(char)*1024, 0);
if(numrcv ==0 || numrcv ==-1 ){
status = closesocket(dstSocket); break;
}
printf("変換前 %s",buffer);
for (i=0; i< numrcv; i++){ // bufの中の小文字を大文字に変換
//if(isalpha(buffer))
buffer = toupper(buffer);
}
// パケットの送信
send(dstSocket, buffer, sizeof(char)*1024, 0);
printf("→ 変換後 %s \n",buffer);
}
}
// Windows での終了設定
WSACleanup();
return(0);
}
どうすればshiro4aoさんのじゃんけんサーバーに変身できるでしょうか?
ご教授の程、よろしくお願いします。
arrayさん何にから何にまで教えていただきありがとうございます。
今は就職向けの作品作っています。
時間的に無理かもしれませんので、いちから勉強するのはやめどきます。
作品は後通信部分だけできれば、遊べると思います。
それで、50人が遊べんる程度のサーバーが作りたいです。
LinuxのOSをインストールしてサーバとして色々やってみるのがいずれやります。
ご教授の程、よろしくお願いします。