我正在从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:我确实设法得到长度值
答案 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 *消息肯定会覆盖一些随机内存位置。