2

以下は、ソケット サーバーのコードの一部です。いくつかの手順について明確ではないので、いくつか質問があります。私の質問は以下のとおりです。

  1. while (1) を使用する必要があるのはなぜですか?
  2. exit (-1) の目的は何ですか? ソケットを閉じますか?
  3. data_len が 1 として初期化されるのはなぜですか?
  4. サーバーが稼働していて、クライアント側からのデータがない場合、サーバーはどうなりますか? 閉まりますか?

実際には、コードの以下の部分について詳細な説明が必要です。

while(1) {
    if ((new = accept(sock, (struct sockaddr*)&client, &sockaddr_len)) == ERROR) {
        perror ("accept");
    exit (-1);

    }

    printf("New client connected from port no %d and IP %s\n",ntohs(client.sin_port), inet_ntoa(client.sin_addr));
data_len = 1;
while (data_len) {
    data_len = recv (new, data, MAX_DATA, 0);
    if (data_len) {
        send (new, data, data_len, 0);
    data [data_len]='\0';
    printf("Sent mesg: %s", data);
    }
}
printf("Client Disconnected\n");
close(new);
}
close (sock);
4

4 に答える 4

3

最初の接続が完了した後で新しい接続を受け入れたい場合は、同じコードをもう一度実行して、新しい接続を受け入れて処理する必要があります。最も簡単な方法は、ある種のループを使用することです。

exit関数は単にプロセスを終了します。通常、これにより、開いているすべてのソケットが閉じられ、他のすべての開いている/割り当てられたリソースが解放されます。関数は戻りません。

変数を初期化しない場合data_len、その値は不定になり、使用すると未定義の動作が発生します。少なくとも、変数がローカルの非静的変数である場合。

クライアントからのデータがない場合、recv呼び出しは無期限にブロックされます。

于 2014-06-24T16:08:31.047 に答える
2
while(1)

と同じです

while(true)

これは、ブレークが発生するまで永遠にループすることを意味しますが、この場合は while(1) ではなく、 while(data_len > 0)

exit(-1)

終了コード -1 でプログラムを終了します。一般的に、エラーがあったことを意味します

コードが while ループに入るように、data_len は 1 に初期化されます。とにかく、この値はループの最初の行で上書きされるため、値 1 は実際には問題になりません。

于 2014-06-24T16:09:54.873 に答える
1

while (1)永久にループするか、プログラムが終了するまでループします。

exit(-1)プログラムはゼロ以外の値で終了します (エラーが発生したことを意味します)。プログラムが使用するリソースは、プログラムが存在するときに割り当てが解除されるため、そうです、ソケットは閉じられます。

datalenwhile ループ本体が実行されるように 1 に初期化されます。

着信データがない場合、ノンブロッキング ソケットが作成されていないと仮定して、プログラムは辛抱強くデータを待ちます。

于 2014-06-24T16:12:36.927 に答える
1

1 Cにはネイティブのブール型がないため、永久にループするためのもので、整数を使用しており、1はtrueです

2アプリケーションを閉じるためのものです。ソケットを初期化するときにifステートメントの下にあるため、ソケットはまだ作成されていません

3 while文を真にするのは#1と同じ

4 クライアントが接続されていない場合、サーバーは稼働し続けます

于 2014-06-24T16:11:52.627 に答える