-4

我正在从用 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:我确实设法获得了长度值

4

3 回答 3

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

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

char *message = malloc(length + 1);
于 2013-03-11T21:49:56.300 回答
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太大,您就没有机会优雅地处理故障。

于 2013-03-11T21:50:58.080 回答
0

嗯,怎么样

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

代表发送消息的大小?

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

于 2013-03-11T21:52:29.570 回答