linux fork socketpair sock_dgram

时间:2013-01-08 09:59:07

标签: c linux sockets unix fork

我是socketpairs的新手,我需要每个孩子都将信息从一个结构传递给父母。我被告知这可以使用SOCK_DGRAM完成,但我不知道该怎么做。我看着互联网但我找不到一个具体的例子。你可以举例说明锄头你可以传递给父母一个由2个整数和一个字符串组成的结构吗?我只是想要一个例子所以我能理解我是如何构建这种类型的socketpair并通过它发送信息。谢谢你

2 个答案:

答案 0 :(得分: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));
    }
}

上述代码不会检查或处理错误。它不能处理包含指针的结构,但使用数组的结构是可以的。

答案 1 :(得分:0)

假设您的字符串表示为

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

你需要设计一些序列化格式,因为发送指针不起作用;指针对象未被传递,因此它不会指向接收器(父节点)中的任何有用的东西。一个简单的格式是将整数置于端对端,然后直接追加包含其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;
}

具有父对应的接收函数。您可能希望在字符串上放置一些最大长度,因为父级需要事先知道消息的大小。