0

我有一些将 UDP 套接字发送到服务器的代码。目前我有一个单独的服务器代码,我在本地运行它读取发送给它的任何内容并准确写回它接收到的内容。

我需要做的下一步是发送和接收结构。我可以很好地发送结构,但是当我从服务器收到它时,它就被混搭了。这是我的代码:

typedef struct {
 char first_part[4];
 char second_part;
 char third_part[2];
} Cloud;

然后在main

char reply[BUFLEN], message[BUFLEN];
Cloud data;

strcpy(data.first_part, "test");
data.second_part = 'a';
strcpy(data.third_part, "hi");

printf("Size:%d\n", sizeof(data));

//This part seems to work---
char* package;
package = (unsigned char*)malloc(sizeof(data));
memcpy(package, &data, sizeof(data));
printf("Size:%d\n", strlen(package));
strcpy(message, package);

udp_send_receive(message,reply);
//---So the message is sent, and the string received by the server is correct.

memcpy(package, message, strlen(message));
printf("Package: %s\n",package); //-This is also correct

memcpy(&data, package, sizeof(data));

printf(data.first_part); //--This is incorrect

如果有人能解释这里出了什么问题,我将不胜感激。我对这类事情有点缺乏经验,我的任务是构建一个与另一台服务器通信的 UDP 服务器,其中数据以特定结构传输。

4

3 回答 3

1

在 C 中,字符串需要一个\0结尾。

因此,如果要存储“测试”,则需要一个char first_part[5]变量。对于 third_part 也是如此,它需要 3 个字节长来存储“hi”+“\0”。

于 2013-09-16T14:50:23.647 回答
1

对于您识别为不正确的特定行,您不能printf继续,data.first_part因为它不是以空值结尾的。您需要将这四个字节(使用 eg memcpy)复制到另一个长度为五个字节的缓冲区中,并确保它以空值结尾。

但是,这同样适用于您之前对 的每个调用strXXX(),例如strcpy(data.first_part, "test")strlen(package)strcpy(message, package)strlen(message)- 这些函数只能用于以空字符结尾的字符串,而不是任意内存缓冲区,例如:

Cloud data, reply;

memcpy(data.first_part, "test", 4);  // not strcpy, it might overwrite .second_part
memcpy.second_part = 'a';
memcpy(data.third_part, "hi", 2); // not strcpy, it will overwrite the next value on the stack!

// no need to copy for transmission and receipt, BTW!
udp_send_receive(&data, &reply);

// copy reply data into a null-terminated string buffer
char tmp[5];
memcpy(tmp, reply.first_part, 4);
tmp[4] = '\0';

printf("%s\n", tmp); // should be fine!
于 2013-09-16T14:41:33.790 回答
1

关于您的代码的几点:

  1. This:strcpy(data.first_part, "test");是缓冲区溢出,因为first_part只有 4 个字符长。strcpy()将写入一个额外的终止字符,因为它正在复制整个字符串。memcpy()如果您不想使用以 0 结尾的字符串,请使用。
  2. 这:package = (unsigned char*)malloc(sizeof(data));应该放弃演员表
  3. 另外,sizeof(data)写成sizeof data.
于 2013-09-16T14:57:00.050 回答