I’m stuck on Stage #QV6.
It seems that the data request message is not receiving any response.
The code is waiting on read for a long time until it fails.
Here are my logs:
$ ./your_bittorrent.sh magnet_download_piece -o /tmp/test-piece-0 "magnet:?xt=urn:btih:c5fb9894bdaba464811b088d806bdd611ba490af&dn=magnet3.gif&tr=http%3A%2F%2Fbittorrent-test-tracker.codecrafters.io%2Fannounce" 0
-- Running vcpkg install
All requested packages are currently installed.
Total install time: 991 ns
-- Running vcpkg install - done
-- Configuring done (1.3s)
-- Generating done (0.4s)
-- Build files have been written to: /mnt/d/CodeCrafters/codecrafters-bittorrent-cpp/build
[ 14%] Building CXX object CMakeFiles/bittorrent.dir/src/Commands.cc.o
[ 28%] Linking CXX executable bittorrent
[100%] Built target bittorrent
Sending data (68 bytes):
00000000: 13 42 69 74 54 6f 72 72 65 6e 74 20 70 72 6f 74 .BitTorrent prot
00000010: 6f 63 6f 6c 00 00 00 00 00 10 00 00 c5 fb 98 94 ocol............
00000020: bd ab a4 64 81 1b 08 8d 80 6b dd 61 1b a4 90 af ...d.....k.a....
00000030: 2d 54 52 32 39 34 30 2d 30 62 30 62 30 62 30 62 -TR2940-0b0b0b0b
00000040: 30 62 30 62 0b0b
Handshake read (68 bytes):
00000000: 13 42 69 74 54 6f 72 72 65 6e 74 20 70 72 6f 74 .BitTorrent prot
00000010: 6f 63 6f 6c 00 00 00 00 00 10 00 04 c5 fb 98 94 ocol............
00000020: bd ab a4 64 81 1b 08 8d 80 6b dd 61 1b a4 90 af ...d.....k.a....
00000030: 2d 52 4e 30 2e 30 2e 30 2d e3 3d b7 66 6c 49 ec -RN0.0.0-.=.flI.
00000040: 50 4f fd cb PO..
Message read (6 bytes):
00000000: 00 00 00 02 05 e0 ......
Message read (103 bytes):
00000000: 00 00 00 63 14 00 64 31 3a 6d 64 31 31 3a 75 74 ...c..d1:md11:ut
00000010: 5f 6d 65 74 61 64 61 74 61 69 31 65 36 3a 75 74 _metadatai1e6:ut
00000020: 5f 70 65 78 69 32 65 65 31 33 3a 6d 65 74 61 64 _pexi2ee13:metad
00000030: 61 74 61 5f 73 69 7a 65 69 31 33 32 65 34 3a 72 ata_sizei132e4:r
00000040: 65 71 71 69 32 35 30 65 31 3a 76 31 30 3a 52 61 eqqi250e1:v10:Ra
00000050: 69 6e 20 30 2e 30 2e 30 36 3a 79 6f 75 72 69 70 in 0.0.06:yourip
00000060: 34 3a a2 c8 6c b3 65 4:..l.e
Sending data (30 bytes):
00000000: 00 00 00 1a 14 00 64 31 3a 6d 64 31 31 3a 75 74 ......d1:md11:ut
00000010: 5f 6d 65 74 61 64 61 74 61 69 31 65 65 65 _metadatai1eee
Sending data (31 bytes):
00000000: 00 00 00 1b 14 01 64 38 3a 6d 73 67 5f 74 79 70 ......d8:msg_typ
00000010: 65 69 30 65 35 3a 70 69 65 63 65 69 30 65 65 ei0e5:piecei0ee
Message read (181 bytes):
00000000: 00 00 00 b1 14 01 64 38 3a 6d 73 67 5f 74 79 70 ......d8:msg_typ
00000010: 65 69 31 65 35 3a 70 69 65 63 65 69 30 65 31 30 ei1e5:piecei0e10
00000020: 3a 74 6f 74 61 6c 5f 73 69 7a 65 69 31 33 32 65 :total_sizei132e
00000030: 65 64 36 3a 6c 65 6e 67 74 68 69 36 32 39 39 34 ed6:lengthi62994
00000040: 34 65 34 3a 6e 61 6d 65 31 31 3a 6d 61 67 6e 65 4e4:name11:magne
00000050: 74 33 2e 67 69 66 31 32 3a 70 69 65 63 65 20 6c t3.gif12:piece l
00000060: 65 6e 67 74 68 69 32 36 32 31 34 34 65 36 3a 70 engthi262144e6:p
00000070: 69 65 63 65 73 36 30 3a ca 80 fd 83 ff b3 4d 6e ieces60:......Mn
00000080: 1b bd 26 a8 ef 6d 30 58 27 f1 cd 0a 70 7f d7 c6 ..&..m0X'...p...
00000090: 57 f6 d6 36 f0 58 34 66 c3 cf e1 34 dd b2 c0 8a W..6.X4f...4....
000000a0: 47 07 6d 10 4d 21 4c 00 52 96 0e f7 67 26 26 49 G.m.M!L.R...g&&I
000000b0: a8 af 0e a8 65 ....e
Sending data (17 bytes):
00000000: 0d 00 00 00 06 00 00 00 00 00 00 00 00 00 00 40 ...............@
00000010: 00
....
bittorrent: /mnt/d/CodeCrafters/codecrafters-bittorrent-cpp/src/TCPHandler.cc:80: std::string TCPHandler::readMessage() const: Assertion `("Invalid message length", message_length > 0 && message_length <= (1 << 14) + 10)' failed.
Aborted (core dumped)
And here’s a snippet of my code:
void Commands::downloadMagentPiece(const std::string &magnet_link,
const std::string &output_file_path,
const uint32_t piece_index) {
// std::cerr << __PRETTY_FUNCTION__ << std::endl;
auto [peers, info_hash] = getTCPHandlerAndInfoHash(magnet_link);
auto tcp_handler = std::make_unique<TCPHandler>(peers[1]);
json info = getMagnentLinkInfo(*tcp_handler, info_hash);
PieceDownloader piece_downloader(info, std::move(tcp_handler));
std::string piece_data = piece_downloader.downloadPiece(piece_index);
std::ofstream output_file(output_file_path, std::ios::binary);
output_file.write(piece_data.data(), piece_data.size());
std::string pieces_val = info["pieces"].get<std::string>();
assert(("Invalid pieces value size", pieces_val.size() % 20 == 0));
std::string piece_hash = pieces_val.substr(piece_index * 20, 20);
assert(("Piece verification failed", verifyPeice(piece_data, piece_hash)));
std::cerr << "Piece downloaded successfully" << std::endl;
}
// Detailed code: https://github.com/silversword05/codecrafters-bittorrent-cpp