質問編集履歴

1 文法修正した

Asahi_1115

Asahi_1115 score 11

2017/08/02 22:43  投稿

int型をchar型に変換するには
一対一通信で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;
}
```
理想の実行結果
[サーバ側実行]
クライアントからの接続待ち
数字を選んでください
1
相手が選んでいます
相手の選んだ数字
2
爆発しました
[クライアント側実行]
相手が選んでいます
相手の選んだ数字
1
数字を選んでください
2
爆発しました
  • C++

    5235 questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る