【发布时间】:2013-01-08 09:59:07
【问题描述】:
我是 socketpairs 的新手,我需要每个孩子将信息从结构传递给父级。有人告诉我这可以使用 SOCK_DGRAM 完成,但我不知道该怎么做。我查看了互联网但我找不到具体的例子。你能举个例子吗,你能把一个由 2 个整数和一个字符串组成的结构传递给父级吗?我只想要一个例子,这样我就可以理解如何构建这种类型socketpair 并通过它发送信息。谢谢
【问题讨论】:
我是 socketpairs 的新手,我需要每个孩子将信息从结构传递给父级。有人告诉我这可以使用 SOCK_DGRAM 完成,但我不知道该怎么做。我查看了互联网但我找不到具体的例子。你能举个例子吗,你能把一个由 2 个整数和一个字符串组成的结构传递给父级吗?我只想要一个例子,这样我就可以理解如何构建这种类型socketpair 并通过它发送信息。谢谢
【问题讨论】:
以下内容如何:
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*,这将发送一个没有内容的指针。
假设您的字符串表示为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;
}
为父母提供相应的接收功能。您可能希望在字符串上设置一些最大长度,因为父级需要提前知道消息的大小。
【讨论】: