ゲームの通信プログラムについてなんですが
ボードゲームで対戦用にとTCP通信プログラムを導入したいのですがどうにもうまくいきません。
ゲームのところでつながっているにはつながっているんですが無限ループのように通信しているようなんです。
VisualStudio2010とwinsocketを使っております。
サーバーのプログラムはこうです。
void COMMU::SERWSA()
{
port = 6543;
//WinSock初期化
rtn = WSAStartup(
MAKEWORD(2,2),
&wsaData);
}
void COMMU::SERSOCK()
{
listen_s = socket(
AF_INET,
SOCK_STREAM,
0);
if(listen_s < 0)
{
WSACleanup();
return;
}
//0で初期化
memset(&saddr, 0, sizeof(SOCKADDR_IN));
saddr.sin_family = AF_INET;
saddr.sin_port = htons(port);
saddr.sin_addr.s_addr = INADDR_ANY;
if(bind(listen_s,
(struct sockaddr *)&saddr,
sizeof(saddr)) == SOCKET_ERROR)
{
closesocket(listen_s);
WSACleanup();
return;
}
}
void COMMU::SERLIS()
{
//クライアントからの接続待ち状態にする
if(listen(listen_s, 0) == SOCKET_ERROR)
{
closesocket(listen_s);
WSACleanup();
return;
}
fromlen = (int)sizeof(from);
s = accept(listen_s, (SOCKADDR *)&from, &fromlen);
if(s == INVALID_SOCKET)
{
closesocket(listen_s);
WSACleanup();
return;
}else{
inet_ntoa(from.sin_addr);
}
//リスンソケットはもう不要
closesocket(listen_s);
MessageBox(NULL,"繋がった","読み込みエラー", MB_OK |MB_ICONERROR);
}
COMMU::~COMMU()
{
if(shutdown(s, SD_BOTH) != 0){
perror("シャットダウンに失敗しました\n");
}
//ソケットのクローズ
closesocket(s);
//ソケットのリソース解放
rtn = WSACleanup();
if(rtn == SOCKET_ERROR){
fprintf(stderr, "WSACleanup失敗\n");
return;
}
printf("WSACleanup成功\n");
printf("サーバ終了\n");
}
続いてクライアントです。
void Client::CLWSA()
{
//ポート番号の入力
port = 6543; //数値に変換
//WinSock初期化
rtn = WSAStartup(
MAKEWORD(2,2),//上位と下位を指定してWORDデータを返すマクロ
&wsaData);
}
void Client::CLSOCK()
{
//ソケットを開く
s = socket(
AF_INET, //アドレスファミリ
SOCK_STREAM, //TCP(接続型通信)で通信
0); //プロトコル(0:WinSockが自動的に判断)
if(s < 0){
//perror("ソケットをオープンできません\n");
WSACleanup();
return;
}
//ホスト名からホスト情報を取得
lpHost = gethostbyname("PC○○");
if(lpHost == NULL)
{
addr = inet_addr(szServer);
//ネットワークアドレスからホスト情報を取得
lpHost = gethostbyaddr((char*)&addr,4,AF_INET);
}
if(lpHost == NULL)
{
printf("ホスト情報取得エラー\n");
closesocket(s);
WSACleanup();
getchar();
return;
}
}
void Client::CLCONNE()
{
//0で初期化
memset(&saddr, 0, sizeof(SOCKADDR_IN));
saddr.sin_family = lpHost->h_addrtype; //ホストのアドレスファミリ
saddr.sin_port = htons(port);
saddr.sin_addr.s_addr = *((u_long *)lpHost->h_addr);
//接続要求する
if(connect(s, (SOCKADDR *)&saddr,
sizeof(saddr)) == SOCKET_ERROR){
printf("connectエラー\n");
closesocket(s);
WSACleanup();
getchar();
return;
}else{
MessageBox(NULL,"つながりました","読み込みエラー", MB_OK |MB_ICONERROR);
}
}
Client::~Client()
{
if(shutdown(s, SD_BOTH) != 0){
perror("シャットダウンに失敗しました\n");
}
//ソケットのクローズ
closesocket(s);
//ソケットのリソース解放
rtn = WSACleanup();
if(rtn == SOCKET_ERROR){
fprintf(stderr, "WSACleanup失敗\n");
return;
}
printf("WSACleanup成功\n");
printf("クライアント終了\n");
}
です。
わかりにくいかと思いますがかなり困ってます・・・
回答よろしくお願いします。