对于一个学校项目,我必须在C中开发一个TFTP服务器,我必须在这样的字符数组中构建一个数据包:
2 bytes 2 bytes n bytes
+--------+-----------+--------+
| CODE | Block # | Data |
+--------+-----------+--------+下面是我如何构建这个包:
int tftp_make_data(char *buffer, size_t *length, uint16_t block, const char *data, size_t n) {
memset(buffer, 0, *length);
*length = 0;
*(buffer) = DATA;
*length += sizeof(uint16_t);
*(buffer + *length) = block;
*length += sizeof(uint16_t);
memcpy(buffer + *length, data, n);
*length += n;
return 0;
}此函数使用数据包内容填充buffer,并用数据包大小填充length。如果block低于128,则工作正常。如果它比128还要高,它就变成-128。
你能帮帮我吗?
发布于 2016-04-09 09:49:00
除非某物只有一个字节大小,否则不能将其分配给*buffer。这两项作业都是不正确的:
*(buffer) = DATA;
*(buffer + *length) = block;编写uint16_t时,请使用memcpy
uint16_t dataToWrite = ...;
memcpy(buffer + *length, &dataToWrite, sizeof(uint16_t));您还没有完成,因为您需要决定如何分配dataToWrite。如果你这么做
uint16_t dataToWrite = block;通过线路发送的数据将按硬件特定的顺序发送,这是不应该发生的。相反,您需要使用-family functions之一将您的号码转换为网络格式:
uint16_t dataToWrite = htons(block);我在同一台机器上检查 printf(“块:%d\n",包大小(Uint_16));
这是不正确的,原因与赋值相同:packet[sizeof(uint_16)]从存储在位置sizeof(uint_16)的char/uint8_t值生成一个int或unsigned int,并且它也忽略了另一个字节。
要解决这个问题,您需要再次使用memcpy。当然,如果在编写方面使用htons,则需要在打印之前使用ntohs:
uint16_t dataToPrint;
memcpy(dataToPrint, &packet[sizeof(uint16_t)], sizeof(uint16_t));
dataToPrint = ntohs(dataToPrint);
printf("block : %u\n", dataToPrint);https://stackoverflow.com/questions/36515085
复制相似问题