2

C で定義された次の構造があり、Linux のクライアントとサーバー間のTCP 接続を介して Berkeley Socket を使用して送信したいと考えています。

struct Argument{
int pid;
int length;
chat op;
char *data;
};

ローカル送信マシンで可変サイズのデータ​​を割り当てるために使用できるポインターである「char *data」があるため、この構造体を2回に分けて受信側に送信する必要があります。初めて、固定変数、つまり最初の 3 つの変数のみを送信します。そして、受信時に、長さのサイズのバッファーを割り当てて、2 回目のデータ部分を受信します。

だから私の質問はとにかく、この構造を可変データフィールドサイズで反対側に1回だけ送信することです.2回ではありませんか?

if (write(peer_fd, (struct Argument*) arg, sizeof (struct Argument)) < 0)
{
    close(peer_fd);
    return -1;
}

どうもありがとう。

4

1 に答える 1

1

スキャッター ギャザー読み取り/書き込み手法の使用を検討してください。

readv writev

wtitev を使用すると、1 回の呼び出しで複数のバッファー (固定サイズのヘッダーと char 配列) から書き込むことができます。1 回のシステム コールのコストが発生し、カーネル内のソケット コードがデータを 1 つのバッファにアセンブルし (可能であれば)、1 回のネットワーク コールを行います。

于 2014-03-25T00:22:34.737 に答える