【问题标题】:linux fork socketpair sock_dgramlinux fork socketpair sock_dgram
【发布时间】:2013-01-08 09:59:07
【问题描述】:

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

【问题讨论】:

    标签: c linux sockets unix fork


    【解决方案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));
        }
    }
    

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

    【讨论】:

    • struct 包含一个字符串。如果那是char*,这将发送一个没有内容的指针。
    • @Joachim Pileborg 非常感谢我会尝试
    • @EmilGrigore 在 Linux 等 POSIX 系统中,一旦创建并连接了套接字,它就与任何其他文件描述符没有太大区别。您可以像任何其他文件一样读取和写入它们。
    【解决方案2】:

    假设您的字符串表示为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;
    }
    

    为父母提供相应的接收功能。您可能希望在字符串上设置一些最大长度,因为父级需要提前知道消息的大小。

    【讨论】:

      猜你喜欢
      • 2017-11-03
      • 2014-08-22
      • 2014-04-21
      • 1970-01-01
      • 1970-01-01
      • 2017-06-21
      • 2012-08-29
      • 2016-01-12
      • 1970-01-01
      相关资源
      最近更新 更多