1

私は単純なサーバークライアントモデルを持っています。どのサーバーが暗号化されたメッセージをクライアントに送信するか。次に、クライアントはメッセージの最初の数文字を使用して処理を決定します。問題は、これらのメッセージが次々にバッファリングされるため、最初のメッセージの後にバッファリングされたすべてのメッセージが失われることです。バッファリングを防ぐ、または送信関数にフラッシュするように指示する簡単な方法はありますか?

4

1 に答える 1

0

クライアントは、処理するために読み取る必要のあるバイト数を決定する必要があります。サーバーは次々にメッセージを送信しますが、ストリーミングソケットにより、バイトは1つの長いメッセージであるかのように流れることができます。メッセージには、メッセージがいつ終了し、次のメッセージが開始するかをクライアントが認識できるようにするための何らかの方法が必要です。

ストリーミングソケットでこれを行う最も簡単な方法は、メッセージの前にメッセージの長さを追加することです。したがって、クライアントは最初に長さを読み取り、次にクライアントはその数のバイトを読み取ります。

int send_message (int sock, const void *message, uint32_t len) {
    int r;
    uint32_t mlen = htonl(len);
    r = send(sock, &mlen, 4, 0);
    /* ...error checking... */
    r = send(sock, message, len, 0);
    /* ...error checking... */
    return ok ? len : error;
}

int recv_message (int sock, void *buf, uint32_t size) {
    int r;
    uint32_t mlen;
    r = recv(sock, &mlen, 4, 0);
    /* ...error checking... */
    mlen = ntohl(len);
    /* ...check buf is large enough... */
    r = recv(sock, buf, mlen, 0);
    /* ...error checking... */
    return ok ? mlen : error;
}
于 2012-08-19T15:57:49.573 に答える