通过套接字传递字符串数组

时间:2012-08-05 00:46:07

标签: c sockets tcp segmentation-fault

我与服务器和客户端程序有简单的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 *尝试了这个,但我无法将字符串发送到其中。

我做错了什么?

2 个答案:

答案 0 :(得分:4)

sendto()函数根本不跟随指针。所以你要发送你的消息,它包含一个整数和一个指针到另一边。接收器获取一个指针值,指向内存中的某个随机位置并不意味着什么。

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

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

答案 1 :(得分:2)

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