【问题标题】:Passing an array of strings through a socket通过套接字传递字符串数组
【发布时间】:2012-08-05 00:46:07
【问题描述】:

我有一个与服务器和客户端程序的简单 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 来获取号码,我可以使用它 但如果我尝试使用字符串数组,则会出现段错误:

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

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

我做错了什么?

【问题讨论】:

    标签: c sockets tcp segmentation-fault


    【解决方案1】:

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

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

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

    【讨论】:

    • 客户端正在接受服务器将执行的命令,所以我应该能够让客户端中的字符串传递它,而不必再次弄乱它我试试看,谢谢快速回复!
    【解决方案2】:

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

    【讨论】:

    • 澄清一下:在某些情况下,您可以发送数组。如果您知道元素的大小,例如 byte[] 应该可以工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-07
    • 1970-01-01
    • 2021-11-10
    • 1970-01-01
    • 2023-03-11
    • 2018-09-01
    • 2011-03-30
    相关资源
    最近更新 更多