大家晚上好。
我在使用#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中查看此转移时,当我查看数据包的Opcode部分时,它会显示“Opcode:Unknown(12338)”。 即使它已从字符串中选择了操作码
我绝对卡住了,任何帮助都会受到赞赏。我很确定我是否可以发送和接收消息,我可以很容易地处理其余的事情。
在这里扔掉我所做的但是标记的答案基本上是 使用来自winsock2的BYTE(不知道我是否需要但是比安慰更安全)
缓冲液= {(BYTE)0,(BYTE)2, 'F', 'I', 'L', 'E', 'N', 'A', 'M', 'E',(BYTE )0, '0', 'C', 'T', 'E', 'T',(BYTE)0};
和
sendto(sock,buffer,sizeof(buffer),0,(sockaddr *)& serverAddr,sizeof(sockaddr));
答案 0 :(得分:2)
不是strlen(buffer)
而是sizeof(buffer)
...
strlen在第一次出现'\0'
时停止couting字符 - 因此它返回缓冲区数组的未指定值,因为缓冲区中不存在'\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
答案 1 :(得分:1)
12338(十进制)为0x30,0x32(十六进制),对应缓冲区中的“0”和“2”。
您使用ascii字符,但需要使用十进制/整数,方法是将它们设置为缓冲区中的(char) 0x00
和(char) 0x02
。