1

大家晚上好。

我在为使用 #include 的 C++ 分配创建 TFTP 客户端时遇到问题

我正在发送 char 缓冲区:

缓冲区={'0','2','f','i','l','e','n','a','m','e','0','o' ,'c','t','e','t','0'};

使用代码:

sendto(sock,buffer,strlen(buffer), 0, (sockaddr *) &serverAddr, sizeof(sockaddr));

但是当我在 WireShark 中查看此传输时,当我查看数据包的操作码部分时,它会显示“操作码:未知 (12338)”。即使它已经从字符串中选择了操作码

在此处输入图像描述

我完全被困住了,任何帮助将不胜感激。我很确定如果我可以发送和接收消息,我可以很容易地处理其余的。

只是在这里丢下我所做的,但标记的答案基本上是它 使用了来自 winsock2 的 BYTE(不知道我是否需要,但安全总比抱歉好)

缓冲区={(BYTE)0,(BYTE)2,'f','i','l','e','n','a','m','e',(BYTE)0, 'o','c','t','e','t',(BYTE)0};

sendto(sock,buffer,sizeof(buffer), 0, (sockaddr *) &serverAddr, sizeof(sockaddr));

4

2 回答 2

2

不是strlen(buffer)sizeof(buffer)...

strlen 在第一次出现'\0'- 时停止计算字符,因此它为缓冲区数组返回未指定的值,因为缓冲区'\0'中不存在。

如果您想使用操作码启动缓冲区,02则将其作为整数而不是其数字表示形式传递:

buffer={0,2,'f','i','l','e','n','a','m','e','0','o','c','t','e','t','0'};
//      ^ ^  simple numbers - not characters - not sure about rest of your buffer
于 2012-10-21T18:15:34.810 回答
1

十进制的 12338 是 0x30,十六进制的 0x32 对应于缓冲区中的“0”和“2”。

您使用 ascii 字符,但您需要使用十进制/整数,方法是将它们设置为(char) 0x00缓冲区(char) 0x02

于 2012-10-21T18:16:08.423 回答