1

Mac と Windows で動作するはずの C 言語でポータブル アプリケーションを作成しています。私が作成しているソケット コードは POSIX ソケットを使用しています。Windows の Winsock API には同様の機能があります。

サーバーはJavaで書かれており、これはサーバーに接続して通信するクライアントアプリケーションです。

改行文字で終了する行を読み取る C# や Java と同じように、readline 関数を作成する必要があります。

現在、次の関数を使用していますが、文字ごとに読んでいるため、非常に効率的な方法ではないと思います

    //return number of bytes read or -1 on error
int readline(SOCKET s, char* pResponse)
{
    char c = '0';
    int status = 0;
    int i = 0;

    while(true)
    {
        status = recv(s,&c, 1,0);

        if(status == SOCKET_ERROR)
        {
            //socket error
            return -1;
        }
        else if(status == 0)
        {
            //closed ?
            return -1;
        }
        else if(status > 0)
        {
            pResponse[i] = c;

            i++;

            if(c == '\n' || c == '\r\n')
            {
                break;
            }
        }
    }
    return i;
}

送信者/サーバーはこの行のみを送信し、クライアントからの応答を待つため、ソケット データ全体を読み取っても問題ないと想定できます。

では、これをこれよりもうまく書くことができますか? 文字ごとの読み取りはパフォーマンスの問題ですか? 任意の助けをいただければ幸いです。

4

2 に答える 2

3

はい、もっとうまくできます。readline はソケットから大量のデータを読み取る必要があり、最初の '\n' の後にデータがある場合は、後で使用できるようにそのデータをバッファに残しておく必要があります。これは「バッファリング」と呼ばれ、ポインタと配列に関する確かな知識が必要です。

ソケット ライブラリが既にバッファリングしている可能性があります。その場合、これを行う必要はありませんが、おそらく必要ありません。

于 2013-01-05T17:34:22.720 に答える
0

バッファの最後の文字が '\r' で、その前の文字が '\n' の場合は、中断する必要があります。

バッファの内容を ac 文字列として扱う場合は、戻る前に「\r」を「\0」に置き換えます。

読み込んでいるファイルが DOS テキスト ファイルであり、\r\n がそのことを示唆している場合、場合によっては、ファイルの最終行に \r\n がある場合とない場合があります。遭遇する可能性が高いケースです。

于 2013-01-05T17:48:00.800 に答える