2

我有一个与服务器和客户端程序的简单 TCP 连接。我在服务器和客户端都做了一个简单的结构作为消息传递:

struct {int c; char** v;} msg;

我只是想从客户端发送 argc 和 argv(来自终端的输入):

int main(int argc, char **argv){
...
msg.c = argc;
msg.v = argv;
sendto(Socket, &msg, sizeof(msg), 0, (struct sockaddr *)&input, sizeof(input));

但是当发送到服务器时,我可以调用 msg.c 来获取号码,我可以使用它,但是如果我尝试使用字符串数组,我会遇到 seg 错误:

recvfrom(Socket, &msg, sizeof(msg), 0, (struct sockaddr *)&input, &sizep);
printf("%d\n", msg.c);
printf("%s\n", msg.v[2]);

我只用一个试过这个,char *我也无法发送字符串。

我究竟做错了什么?

4

2 回答 2

4

sendto()函数根本不遵循指针。因此,您将包含一个整数和一个指针的消息发送到另一侧。接收者得到一个指针值,它指向内存中没有任何意义的随机位置。

您需要做的是将您的数据序列化为可以通过套接字发送的内容。这意味着,没有指针。例如,对于单个字符串,您可以发送长度,后跟字符串的实际字节。对于多个字符串,您可以发送一个计数,后跟多个与单个字符串格式相同的字符串。

收到数据后,您需要将数据反序列化为char *字符串数组,如果这是您在接收器中需要的。

于 2012-08-05T00:50:55.313 回答
2

您不能发送数组。你似乎做的是发送一个指向数组的指针。指针是一个指向发送方 RAM 中数组开头的值。但是,此地址对于一个客户来说是本地的。如果您需要发送复杂数据,例如数组或类/结构,通常需要对它们进行序列化。周围有图书馆可以为您提供支持。我使用了 Google 的Protocol Buffers并喜欢它;你可能想看看它。

于 2012-08-05T00:52:04.767 回答