1

私はとても迷っています。サーバーからの読み取りを停止する方法がわかりません。基本的に、ディレクトリ内のすべてのファイルのリストをサーバーからクライアントに送信しています。これが私がしていることです。

サーバ側:

 struct dirent *ep = readdir(dp);      
    while( ep ){  
        sprintf(buf, "%s", (ep->d_name));
        n = write(newsock, buf, MAX );           
        ep = readdir(dp);  
    }

クライアント側:

while( n = read(sock, buf, MAX)){
    printf("buf: %s\n" , buf);       
}   

したがって、サーバー側のものは正常に機能します。すべてのファイル名を正しく送信していることがわかりますが、クライアント側ではすべての名前を読み取りますが、さらに読み取るのを待っているだけです。

4

2 に答える 2

3

クライアントがループを中断することを認識できるように、サーバーから「EOF」インジケーターを送信するか、サーバーにソケットを閉じさせる必要があります(クライアントがすべてのデータを読み取るために「しばらく」待った後)。これにより、読み取りがエラー状態で終了します。

2つ目は、表面的には簡単です。1つ目は、より信頼性が高く効率的である可能性があります。おめでとうございます。これで、最初の通信プロトコルが構築されました。

于 2013-02-27T17:47:36.327 に答える
1

プロトコルを定義します。

非常に単純な方法は、サーバーに空の(長さ0の)ファイル名をクライアントに送信させて、送信が完了したことをクライアントに通知することです。これを正常に行うには、たとえば追加の\r\nシーケンスなどで各ファイル名を区切ることができます。

于 2013-02-27T17:47:43.567 に答える