0

こんにちは、ソケットプログラミングCは初めてです。現在、チャットプログラムに取り組んでおり、メッセージの送受信に成功していますが、問題は、クライアントがそのクライアントのユーザーのリストをオンラインで送信するように要求し、サーバーがメッセージをクライアントに送り返すと、メッセージが正常に印刷されることです現在接続されているクライアントのリストですが、一度表示されるとループから外れません。以下は、コードの 1 つのセクションのみです。

サーバー側 (server.c)

pthread_mutex_lock(&list_mutex);
   for(i =0; i < NotEndOfList; i++)
   {

    sprintf(message_replay, "Server: %s \n", usersList[i].name); 
    write(sock , message_replay , strlen(message_replay));  

  }
  pthread_mutex_unlock(&list_mutex);

クライアント側 (Client.c)

int i =0;
          while(i < NotEndOfList)
         {
            if( recv(sock , server_reply , 2000 , 0) < 0)
            {
              puts("recv failed");
              break;
            }
         i++;

        puts(server_reply);
      }

サンプル出力

    User A -->:
    //List 
    User A
    User B
    User C
    // Loop

正しいサンプル出力

User A -->:
//List
User A
User B
User C
User A -->:

どうもありがとうございました

4

1 に答える 1

0

このソリューションは、すべてのメッセージが同じサイズである場合に使用できます。あなたの のサイズはわかりません。message_replayタイプの とだけ言っておきましょうchar[256]

サーバーで

を使用する代わりに、strlen()いつでも 256 バイトを送信できます。クライアントは、ヌル ターミネータの後の末尾の文字をすべて無視します。

write(sock , message_replay, 256); // or sizeof(message_replay) if it's static

クライアントで

クライアントは、すべてのメッセージの長さが 256 バイトであることを期待する必要があります。256 文字すべてが受信されるまでループが実行され、receive_buffer[]すべてのループに追加されます。カウンターは、受信したバイト数と不足しているバイト数を追跡​​します。

for (int i = 0; i < NotEndOFList; i++) {
    char receive_buffer[256];
    int received_bytes = 0;
    int remaining_bytes = sizeof(receive_buffer);

    while (remaining_bytes > 0) {
        int res = recv(sock , &receive_buffer[received_bytes] , remaining_bytes, 0);
        if (res < 0) {
            puts("recv failed");
            break;
        }
        received_bytes += res;
        remaining_bytes -= res;
    }

    puts(receive_buffer);
}

PS!私はテストしていません。使用する場合は、どのように動作するか教えてください。

于 2013-10-17T16:15:13.797 に答える