1

TFTP の単純なクライアント実装を行っています。ここでは、次の形式で読み取り要求を送信する必要があります

/* send request 

      2 bytes    string     1 byte     string   1 byte
------------------------------------------------------
RRQ/  | 01/02 |  Filename  |   0  |    Mode    |   0  |
WRQ  -------------------------------------------------

*/

間に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";
}
4

4 に答える 4

6

null を転送したい場合は、「strlen(filename) + 1」で memcpy する必要があるだけでなく、それに応じて後続の memcpys の宛先ポインターを更新する必要もあります。

memcpy(&blk_read_request[2 + strlen(file_name) + 1], mode_netascii, strlen(mode_netascii) + 1);

そこに余分な +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;
}
于 2009-09-30T02:29:57.153 に答える
3

null バイトを含む (または含む可能性がある) データを処理する必要がある場合は、通常、C スタイルの文字列とそれらを処理する関数の使用を避けたいと思うでしょう。文字/バイト配列を使用し、バッファ内のデータの長さに関連付けられた長さを保持します。

C++ では、バイト (または char) のベクトルがこれに最適です。

また、C++ では、std::string型に null 文字を含めることができます。ただし、 null で終了する文字列を予期するものにstd::vector<char>の結果を渡すというバグ トラップに陥りやすいため、それらの使用を避けてそのまま使用することをお勧めします。string::c_str()

于 2009-09-30T04:10:40.197 に答える
2

これは、C++ 文字列では自動的に行われます。

これ:

const char mode_netascii[] = "netascii";

これと同等です:

const char mode_netascii[] = { 'n', 'e', 't', 'a', 's', 'c', 'i', 'i', '\0' };
于 2009-09-30T02:17:52.973 に答える
-1
char *total_send_string = malloc(2+strlen(file_name)+sizeof(Mode)+3);
memset(total_send_string, 0, strlen(total_send_string);
//Then copy each member of the total send packet into the correct offset
//Now you have the correct result
于 2009-09-30T02:20:45.293 に答える