一対一通信で1~10の乱数の中から一つのはずれを引くと通信を終了する爆弾ゲームのようなものを作ってるのですが、
実行結果でクライアントから受信した数字が正しく表示されません。1~10の数字を選んでも爆発が起こりません。
char型とint型の比較をするためにwhile ((int)buf != s);という形にしたのですがここに問題があると思われます。
int s;
char c = s + '0';
でint型の数値をchar型の数字に変換する方法があったのですが、この方法は0~9までしか変換できないようです。
どのように書き直せば完成に近づけるでしょうか
教えてもらえるとありがたいです。
[サーバ]
クライアントからの接続待ち
数字を選んでください...1
相手が選んでいます...。
相手の選んだ数字→3733856
数字を選んでください...3
相手が選んでいます...。
相手の選んだ数字→3733856
数字を選んでください...
[クライアント]
相手が選んでいます...。
相手の選んだ数字→ 1
数字を選んでください...2
相手が選んでいます...。
相手の選んだ数字→ 3
数字を選んでください...4
相手が選んでいます...。
サーバ側
#include <stdio.h> #include <io.h>//基本入出力関数 #include <winsock2.h> #include<stdlib.h>//乱数 #include<time.h>//乱数 #define BUF_LEN 100//入出力バッファサイズ int main() { WSADATA wsaData; SOCKET sock0; struct sockaddr_in addr; struct sockaddr_in client; int len; SOCKET sock; char buf[BUF_LEN];//入出力バッファ // winsock2の初期化 WSAStartup(MAKEWORD(2, 0), &wsaData); // ソケットの作成 sock0 = socket(AF_INET, SOCK_STREAM, 0); // ソケットの設定(アドレス構造体の設定) addr.sin_family = AF_INET;//インターネットを使用する addr.sin_port = htons(12345);//サーバ(自分自身)のポート番号 addr.sin_addr.S_un.S_addr = INADDR_ANY;//IPアドレスすべての値指定 //ソケットのディスクリプタとアドエス構造体を結びつける bind(sock0, (struct sockaddr *)&addr, sizeof(addr)); // TCPクライアントからの接続要求を待てる状態にする(待ちクライアント数指定) listen(sock0, 5); // TCPクライアントからの接続要求を受け付ける printf("クライアントからの接続待ち\n"); len = sizeof(client); sock = accept(sock0, (struct sockaddr *)&client, &len); int s; srand(time(NULL)); //1~10のランダムな数 s = rand()%10+1; //1~10のランダムな数 //送受信処理 do{ printf("数字を選んでください..."); memset(buf, 0, sizeof(buf));//送受信バッファ0クリア _read(0, buf, sizeof(buf));//キーボードから入力 send(sock, buf, sizeof(buf), 0);//送信 printf("相手が選んでいます...。"); memset(buf, 0, sizeof(buf)); recv(sock, buf, sizeof(buf), 0);//受信 printf("相手の選んだ数字→%s",buf); } while ((int)buf != s); printf("爆発しました\n"); // TCPセッションの終了 closesocket(sock); // winsock2の終了処理 WSACleanup(); return 0; }
クライアント側
#define _WINSOCK_DEPRECATED_NO_WARNINGS #include <stdio.h> #include <io.h>//基本入出力関数 #include <winsock2.h> #define BUF_LEN 100//入出力バッファサイズ int main() { WSADATA wsaData; struct sockaddr_in server; SOCKET sock; char buf[BUF_LEN];//入出力バッファ // winsock2の初期化 WSAStartup(MAKEWORD(2, 0), &wsaData); // ソケットの作成 sock = socket(AF_INET, SOCK_STREAM, 0); // 接続先指定用アドレス構造体の準備 server.sin_family = AF_INET;//インターネット使用 server.sin_port = htons(12345);//接続先ポート番号 server.sin_addr.S_un.S_addr = inet_addr("*.*.*.*");//接続先IPアドレス // サーバに接続 connect(sock, (struct sockaddr *)&server, sizeof(server)); //受信送信処理 int n = 1; do { memset(buf, 0, sizeof(buf));//送受信バッファ0クリア printf("相手が選んでいます...。"); recv(sock, buf, sizeof(buf), 0);//受信 printf("相手の選んだ数字→ %s\n",buf); printf("数字を選んでください..."); memset(buf, 0, sizeof(buf));//送受信バッファ0クリア _read(0, buf, sizeof(buf));//キーボードから入力 send(sock, buf, sizeof(buf), 0);//送信 } while (n = 1); printf("爆発しました\n"); // TCPセッションの終了 closesocket(sock); // winsock2の終了処理 WSACleanup(); return 0; }
回答2件