我正在做一个TFTP的简单客户端实现.在这里,我需要以下列格式发送读取请求
/* send request
2 bytes string 1 byte string 1 byte
------------------------------------------------------
RRQ/ | 01/02 | Filename | 0 | Mode | 0 |
WRQ -------------------------------------------------
*/
Run Code Online (Sandbox Code Playgroud)
在我之间我必须插入1个字节的零位值.但我无法增加这个价值.此外,如果我添加1个零位字节..这实际上意味着字符串终止字符比如何获得正确的strlen值.
如果有人可以帮我这个...
enter code here
const char opcode_read[2] ={'0','1'};
const char opcode_write[2] ={'0','2'};
const char opcode_data[2] ={'0','3'};
const char opcode_acknowledge[2] ={'0','4'};
const char opcode_error[2] ={'0','5'};
const char mode_netascii[] = "netascii\0";
char blk_read_request[100];
char file_name[] = "rfc0791.txt\0";
memcpy(blk_read_request, opcode_read, 2);
memcpy(&blk_read_request[2], file_name, strlen(file_name) + 1);
memcpy(&blk_read_request[2 + strlen(file_name)], mode_netascii, strlen(mode_netascii) + 1);
for (int i = 0; i < strlen(blk_read_request); i++) {
cout << i << " : " << blk_read_request[i] << " " << std::bitset<CHAR_BIT > (blk_read_request[i]) << "\n";
}
Run Code Online (Sandbox Code Playgroud)
如果要传输空值,不仅必须使用"strlen(filename)+ 1"进行memcpy,而且还需要相应地更新后续memcpys的目标指针.
memcpy(&blk_read_request[2 + strlen(file_name) + 1], mode_netascii, strlen(mode_netascii) + 1);
Run Code Online (Sandbox Code Playgroud)
请注意那里的额外+1.
对于记录,作为C++,您可能希望考虑使用比"char*"更高级别的类,它可以处理嵌入的空字符.
例如,以下打印"8",并打开std :: stringstream作为形成数据包的更好方法:
#include <string>
#include <iostream>
int main()
{
std::string x = "foo";
x += '\0';
x += "bar";
x += '\0';
std::cout << x.length() << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8133 次 |
| 最近记录: |