ネットワークゲームへのアプローチ 3  ソケット(クライアント)


次はクライアントですが、やっていることはほとんどサーバと変わりありません。

スレッドが無いのでいっきに行きましょうか。
 

 // client1127.cpp : コンソール アプリケーション用のエントリ ポイントの定義
 //
 
 #include "stdafx.h"
 #include "winsock.h"
 #include "iostream.h"
 
 int main(int argc, char* argv[])
 {
 
 WSADATA Data;
 //----- クライアント DLLをロードする
 int result = WSAStartup (MAKEWORD(1,1),&Data);
 
 if(WSAStartup (MAKEWORD(1,1), &Data) !=0)
 {
  cout << "Client : Winsock DLL load error!" << endl;
  exit(-1);
 }
 //----- DLLのロードに成功した
 
 //----- ソケットを制作する  
 SOCKADDR_IN svAddress;
 SOCKET svSocket;
 
 svAddress.sin_family = AF_INET; // 定型いつも同じ
 svAddress.sin_port = htons(1225); // ポートをセットする
 u_long svaddr = inet_addr("127.0.0.1"); // アドレスをセットする
 memcpy(&svAddress.sin_addr, &svaddr, sizeof(u_long));
 svSocket = socket(AF_INET, SOCK_STREAM, 0);
 if (svSocket == INVALID_SOCKET)
 {
  cout << "Client Socket error!!" << endl;
  WSACleanup();
  exit(-1);
 }
 //----- ソケットの制作に成功した
 
 //----- 接続する
 result = connect(svSocket,
 (const struct sockaddr *) & svAddress,
 sizeof(svAddress));
 if(result == SOCKET_ERROR)
 {
  cout << "Client connect error" << endl;
  closesocket(svSocket);
  result = WSACleanup();
 
  exit(-1);
 }
 //----- 接続できた
 
 int x=0, y;
 
 while(1)
 {
  cout << " ? " << endl;
  cin >> x;
 
 if (x==123) break;
  result = send(svSocket,
  (char*)&x, sizeof(int),0);
 if (result != sizeof(int))
 {
  cout << "Client Send error" << endl;
  break;
 
 } else {
  result = recv(svSocket, (char*)&y,
  sizeof(int),0);
 if (result ==0)
 {
  cout << "Client clsock recv ;" << endl;
  break;
 } else {
  cout << "Client Send" << x <<" : recv " << y << endl;
 }
 }
 }
 
  return 0;
 }
 

実行してみます。すると、ConnectErrorですぐに終わります。

サーバが動いていないと接続できないので終了してしまいます。サーバを動かしてから起動すると入力待ちになるので数値を入れるとサーバがその数値に1を足した数を送り返してきます。単純なクライアントサーバですが、ゲームに使えそうな感じですね。