接收字符串消息时出现分段错误

时间:2013-03-11 21:47:25

标签: c string sockets

我正在从C实现的服务器向客户端发送一个字符串消息。为了做到这一点,我先发送消息的长度,然后发送实际的消息。以下是我服务器的代码片段。

int length = strlen(message);
send(serversock, &length, sizeof (int), 0);
send(serversock, message, sizeof (char) * length, 0);

以下是我客户的代码:

int length;
recv(clientsock, &length, sizeof (int), 0);

printf("size: %d\n", length);

char* message;
recv(clientsock, message, sizeof (char) * length, 0);
printf("Got Message %s\n", message); // I get Segmentation Fault here

当我收到消息时,我会尝试将其打印出来。但是,我遇到了分段错误。有人可以帮帮我吗?

PS:我确实设法得到长度值

3 个答案:

答案 0 :(得分:2)

char* message;
recv(clientsock, message, sizeof (char) * length, 0);

您需要为message分配内存以指向。在这里,您传递未初始化的message指针值。使用malloc分配数组。假设message是一个字符串:

char *message = malloc(length + 1);

答案 1 :(得分:1)

recv不分配内存,您需要明确地这样做:

int length;
recv(clientsock, &length, sizeof (int), 0);

printf("size: %d\n", length);

char* message = malloc(length+1); /* read into here */
recv(clientsock, message, sizeof (char) * length, 0);
message[length] = '\0'; /* nul terminated for printing */
printf("Got Message %s\n", message);
free(message); /* and remember you own this buffer */

当你读取长度时,你正在读入已经存在的变量:int length;为整数保留空间。

当您阅读该消息时,您使用了未初始化的指针,因此它尝试将消息写入某个随机位置(因此崩溃):char *message;仅为指针保留空间

请注意,使用最新的C编译器,您可以使用

char message[length+1];

代替。这样您就不需要显式free数组,但如果length太大,您就没有机会正常处理失败。

答案 2 :(得分:0)

嗯,怎么做

send(serversock, &size, sizeof (int), 0);

表示发送邮件的大小?

在客户端代码中,永远不会初始化长度,并且您没有为" message"分配任何内存。您是否显示了所有已调用的代码。如果是这样,那么在调用recv之后,你的未分配的char *消息肯定会覆盖一些随机内存位置。