0

私はソケットペアに不慣れで、構造から親に情報を渡すためにそれぞれの子供が必要です。これはSOCK_DGRAMを使用して実行できると言われましたが、その方法がわかりません。インターネットを調べましたが、できませんでした。具体的な例が見つかりません。たとえば、2つのintと文字列で構成された構造を親に渡すことができるかどうかを示してください。この種のソケットペアを作成する方法を理解できるように、例が必要です。それを通して情報を送ってください。ありがとう

4

2 に答える 2

1

次はどうですか:

int sockets[2];
if (socketpair(AF_INET, SOCK_DGRAM, 0, sockets) != -1)
{
    int res = fork();

    if (res == 0)
    {
        /* In child process */

        /* We only need one socket, so close the other */
        close(sockets[0]);

        struct some_structure my_struct;

        write(sockets[1], &my_struct, sizeof(my_struct));

        /* All done */
        exit(0);
    }
    else if (res > 0)
    {
        /* In parent process */

        /* We only need one socket, so close the other */
        close(sockets[1]);

        struct some_structure my_struct;

        read(sockets[0], &my_struct, sizeof(my_struct));
    }
}

上記のコードは、エラーをチェックまたは処理しません。ポインタを含む構造体を処理することはできませんが、配列を使用する構造体は問題ありません。

于 2013-01-08T10:07:06.887 に答える
0

char*文字列が次のように表されていると仮定します

struct data {
    int i, j;
    char *s;
};

ポインターの送信が機能しないため、シリアライゼーション形式を工夫する必要があります。pointee は渡されないため、レシーバー (親) で有用なものを指し示すことはありません。簡単な形式は、整数を端から端まで配置し、NUL ターミネータを含む文字列を直接追加することです。

int senddata(int fd, struct data const *d)
{
    size_t msglen = 2 * sizeof(int) + strlen(d->s) + 1;
    char *msg = malloc(msglen);

    if (msg == NULL)
        return -1;

    ((int *)msg)[0] = d->i;
    ((int *)msg)[1] = d->j;
    strcpy(msg + 2 * sizeof(int), d->s);

    ssize_t r = send(fd, msg, msglen, 0);

    free(msg);
    return r;
}

親の対応する受信機能を使用します。親は事前にメッセージのサイズを知る必要があるため、文字列に最大長を設定したい場合があります。

于 2013-01-08T10:10:26.880 に答える