2

C でクライアント サーバー プログラムを作成しています。ディレクトリ名を送信し、応答としてファイルのリストを受信します。私が抱えている問題は、無限ループに陥ることです。

ディレクトリ名を 1 つだけ送信すると機能しますが、ディレクトリのリストを送信すると終了せず、何も出力されません。

サーバ

while(recv(sock, name, BUFSIZE, 0) > 0){
    if ((fddir=opendir(name)) == NULL){
        send(sock, strerror(errno), strlen(strerror(errno)), 0);
        close(sock);
        return 1;
    }
    send(sock, name, strlen(name), 0);
    send(sock, ":", strlen(":"), 0);
    send(sock, "\n", strlen("\n"), 0);
    while ((dirbuf = readdir(fddir)) != NULL){
        buf[0] = '\0';
        strcat(buf, dirbuf->d_name);
        strcat(buf, "\t");
        send(sock, buf, BUFSIZE, 0);
    }
}

クライアント

for (int i=1;i<3;i++){
    send(sock, argv[i], strlen(path), 0);
    while(recv(sock, buf, BUFSIZE, 0) > 0)
        printf("%s", buf);
}

サーバーはすべてのディレクトリ名が受信されるまで待機し、クライアントはサーバーがその中のすべてのファイルを送信するまで待機します。プログラムが動かなくなった場所を追跡するにはどうすればよいですか?

4

2 に答える 2

3

send()TCP はメッセージ ベースではないため、サーバーで呼び出しを行うときに、2 つのクライアント呼び出しの境界がどこにあるかを知る方法はありませんrecv()。したがって、複数の名前を続けて送信すると、サーバーはそれらすべてを 1 回recv()(または に割り当てたバイト数BUFSIZE) で受信することができます。これはおそらくディレクトリ名をマングリングしておりopendir、失敗の原因となっています。sendからのエラーをチェックしていてrecv、キャプテンオブブリアスが別の回答で説明している場合、これはより明白になります。

于 2013-04-27T21:09:56.943 に答える