

ソケット通信を用いて複数プレイヤーのシンプルなゲームを作っています。  
クライアントから送られてきた文字列をstrncmpで判別してそれぞれに適した処理が行われるようにしたいです。

例えば、”ADD 5"とクライアントから送られてきた場合に最初のADDを `strncmp` で判別して合計の数に５を足すようにしたいです。

しかし、どうしても `if` 文の処理が飛ばされてしまいます。色々と試した上でクライアントからサーバーへの文字列の送信は問題なく行われているので、`if`
文の部分に問題があるのは確かです。

クライアントからの処理が追いつかなくて `if`
文の処理が飛ばされしまうことなどはあるのでしょうか？何か解決策があれば教えていただけるとありがたいです。拙い文章で申し訳ありません。

サーバーサイド

[code]

      int sum = 0;
      int tmp;
      while (1)
      {
        for (int i = 0; i < num_player; i++)
        {
          memset(client_buf, '\0', BUF_SIZE);
          
          if (recv(clientsock[i], client_buf, BUF_SIZE, 0) == -1)
            {
                perror("ERROR");
                exit(1);
            }  
    
          if(strncmp(client_buf, "ADD", 3) == 0)
          {
            strcpy(str, client_buf + 4);
            
            sum += temp;
          }
          // この後も他のelse if文が続く
    　}
    
[/code]

クライアントサイド

[code]

      while(1){
            memset(client_buf, '\0', sizeof(client_buf));
            if (recv(clientsock, server_reply, BUF_SIZE, 0) == -1)
            {
                perror("ERROR");
                exit(1);
            }  
            char str[BUF_SIZE]
            printf("Enter a number:");
            fgets(str, BUF_SIZE, stdin);
            sprintf(client_buf, "ADD %s", str);
            if (send(clientsock, client_buf, BUF_SIZE, 0) < 0){
                 perror("Send failed");
            }
      }
    
[/code]


CC BY-SA 4.0
2022-09-10T14:24:41.350
91030
2022-09-13T07:55:49.253
2022-09-10T16:24:52.490
3060
54027
question
c socket
ソケット通信でif文が無視（スキップ）されてしまう


質問文には論理の飛躍が多々見られます。以下で説明しますが、具体的な事実に基づいて調査することをお勧めします。

* * *

> 色々と試した上でクライアントからサーバーへの文字列の送信は問題なく行われている

違います。クライアントが送信したこととサーバーが受信することは別問題です。あまり知られていないことですが、クライアントが送信した場合はクライアントが送信したことになるので、サーバーが受信したかどうかはサーバーが受信したかどうかで判断してください。（小泉構文）  
例えば

>
[code]

>     if (recv(clientsock[i], client_buf, BUF_SIZE, 0) == -1)
>  
[/code]

`recv()`は`-1`を返さなかったので受信エラーではないようですが、それではいったい何バイトのデータを受信したのでしょうか？
受信エラーが発生していないことと期待するバイト数だけ受信が行われることは別問題です。このコードでは情報が読み捨てられていて判断できないです。

同様に

>
[code]

>     if (send(clientsock, client_buf, BUF_SIZE, 0) < 0){
>  
[/code]

クライアントは送信に成功しているようですが、いったい何バイトのデータを送信したのでしょうか？
「クライアントからサーバーへの文字列の送信は問題なく行われている」とありましたが、 **送信できたバイト数を確認せずに**
送信できたと判断するのは早計です。

> クライアントからの処理が追いつかなくて `if` 文の処理が飛ばされしまうことなどはあるのでしょうか？

そもそもサーバープログラムはどの行を実行しているのでしょうか？ 質問文にはそれがありません。 `if` 文の処理が実行されないことと `if`
文の処理が飛ばされることは別問題です。「飛ばされた」と判断するには「`if` 文の先にある処理が実行された」という情報が必要です。


CC BY-SA 4.0
2022-09-10T21:16:33.447
91033
2022-09-10T21:16:33.447
4236
91030
answer


> int sum = 0;  
>  int tmp;  
>  と変数定義がされていますが

>
[code]

>        sum += temp;
>  
[/code]

スペルミスという線は？


CC BY-SA 4.0
2022-09-13T07:55:49.253
91080
2022-09-13T07:55:49.253
54378
91030
answer