1

これはオペレーティング システム クラスの宿題であり、私はプログラマーではなく、特に C ではありません。この作業を始めて 1 週間が経ちましたが、行き詰まっており、助けが必要です。Linuxコマンドがクライアントに入力され、サーバーで実行され、出力がクライアントにリダイレクトされるTCPクライアントおよびサーバーアプリケーションを作成する必要があります。私はその概念を理解しており、90% 以上は機能しています。「ls」、「ls -lpq」、「cat somefile」、「man somecommand」などのコマンドはすべて正常に機能します。問題が発生するのは、「mkdir newdir」などの情報を返さないコマンドです (ディレクトリが既に存在する場合は、応答が返されるため正常に動作します)。これは私にはまったく新しいことですが、受信する情報がないため、サーバーの recv コマンドがブロックされていることが問題のようです。これを乗り越える方法がわかりません。この 1 つの問題に 1 週​​間取り組んできました。私は時間がなくなっており、ファイルのアップロードとダウンロードも実装する必要があります。どこから始めればよいかわかりませんが、この問題を解決するまで作業を開始することさえできません。

ありがとう

    // this is where I think the problem is
    while ((rcvd_bytes = recv(sock_fd, recv_str, sizeof(recv_str), 0)) > 0 ) {
        // Zero out the inputCopy buffer
        memset(&inputCopy, 0, sizeof(inputCopy)+1);

        // Copy the recv_str into a new string so that
        // we can work with it.
        strcpy(inputCopy, recv_str);

        argcount = parsecommand(inputCopy, args);

        //Send the message back to client
        dup2(sock_fd, 1);

        if((status = forkAndExecute(args)) != 0) {
            //printf("Command %s returned %d.\n", args[0], status);
        }

            // as a test is I uncomment the following line mkdir newdir
            // returns but the following commands are messed up - as I expect.
        //printf("\n");

        memset(&recv_str, 0, sizeof(recv_str)+1);
        fflush(stdout);
    }  

    if(rcvd_bytes == 0) {
    puts("Client disconnected");
    fflush(stdout);
    }
    else if(rcvd_bytes == -1) {
    perror("recv failed");
    exit(0);
    }
4

2 に答える 2

3

selectを使用する必要があるようです。

if(select(fdmax+1, &my_fdset, 0, 0, NULL) > 0) // there is data available to be read
    recv(...)

ここfdmaxで、は最大のファイル記述子(selectは+1が必要)でmy_fdsetあり、を使用してファイル記述子を追加するファイル記述子セットですFD_SET(sockfd, &my_fdset);

これは、利用可能なデータがある場合にのみ受信します。お役に立てば幸いです。

編集 :

TCPソケットを介して文字列を送信/受信する単純なクライアント/サーバープログラムを作成しているときに、同様の質問をしました。そのスレッドで使用することになったコードをここに投稿しまし。私の場合は、1つのプログラムで送信と受信を行いたいという点で異なりますが、送信者または受信者の機能を見ると、プログラムが希望どおりに動作するように何かを適応させることができる場合があります。

于 2013-03-22T03:32:45.163 に答える
1

あなたの問題の説明を考えると、私の疑いは、サーバー コードではなくクライアント コードです。実際には、2 つの間に暗黙的に作成したプロトコルです。

dup2ソケットで標準出力を指すために使用して、コマンドの出力をクライアントに直接送信しているようです。おそらく、クライアントはソケットから読み取り、コマンドからの出力を取得しますか? サーバーにコマンドを送信して応答がない場合、クライアントは何をしますか? のようなコマンドmkdirは何も送り返しません。サーバーがコマンド出力を送信するのを永遠に待っていますか?

一般に、同期クライアント/サーバー プロトコル (クライアントがコマンドを送信し、クライアントが別のコマンドを送信する前にサーバーが応答を送信するプロトコル) の場合、クライアントとサーバーの間のプロトコルに同意して、サーバーはデータの返送を完了し、クライアントは次のコマンドを送信する必要があります。コマンドが完了したが出力を送信しなかったことをサーバーがクライアントに伝えるために、何らかの方法を追加する必要がある場合があります。

于 2013-03-22T03:38:43.593 に答える