Một khi người dùng quyết định tải về một file, peer hoạt động như client bắt đầu một vòng của OVERNET_SEARCH kiểu 2 cho hàm băm của nội dung file; bản thân các peer trả về trong danh sách các peer nằm trong OVERNET_SEARCH_NEXT gửi các gói tim OVERNET_SEARCH_INFO (kiểu 0: không có cây tìm kiếm) cho cùng hàm băm, và luc đó các trả lời OVERNET_SEARCH_RESULT sẽ trả về k-object với một danh sách thẻ được tạo ra từ mọt thẻ meta của kiểu 02 (EDONKEY_MTAG_STRING), tên “loc”, và giá trị “http://ip_addr:port” hoặc “http://filehash:ip_addr:port” tùy thuộc vào có hay không có firewall.
Vì vậy, nếu client tìm kiếm “hoang tuan anh”: Node tìm kiếm Node nhận yêu cầu OVERNET_SEARCH(MD4(hoang)) OVERNET_SEARCH_NEXT(danh sách các peer) có Kểm tra xem node nhận có trong danh sách trả về không?
OVERNET_SEARCH_RESULT(MD4(hoang), MD4(filei), MetaTagList(attr(filei))) OVERNET_SEA RCH_INFO(MD 4(hoang), srchfilter( 'tuan',’anh ’), 0, 100) OVERNET_SEARCH_END(MD4(paolo), nsent, navailable)
Hình 3.2.4.2.1: Một phiên tìm kiếm dữ liệu
Một khi người quyết định tải một file (ví dụ file j), để lấy thông tin:
Hình 3.2.4.2.1: Một phiên tìm kiếm file
Và danh sách MetaTag trong trường hợp này được tạo ra bởi một thẻ đơn kiểu “string”, tên “loc” và giá trị “http://...”.
01 00 00 00: danh sách có một thẻ
02: kiểu thẻ 2, EDONKEY_MTAG_STRING (một cặp <string name, string value>) 03 00: chuỗi theo sau có 3 ký tự:
6c 6f 63: 'loc'
39 00: một chuỗi 0x39 (57) ký tự tiếp theo
...: "http://24352535278...:210.216.190.41.198:7527"
Các ví dụ về tìm kiếm được đặc tả trong gói tin OVERNET_SEARCH_INFO sau khi thiết lập byte tham số :
/* OP AND(OP AND(OP AND ("file", Type="audio"), Size>=1234), Size<=5678) */ unsigned char sf1[] = {
EDONKEY_SEARCH_BOOL, EDONKEY_SEARCH_AND,
EDONKEY_SEARCH_BOOL, EDONKEY_SEARCH_AND,
EDONKEY_SEARCH_BOOL, EDONKEY_SEARCH_AND, EDONKEY_SEARCH_NAME, /* = 01 */
4, 0, /* độ dài chuỗi 4 byte*/ 'f', 'i', 'l', 'e', /* từ khóa "file" */ EDONKEY_SEARCH_META, /* = 02 */
05, 00, /* độ dài chuỗi 5 byte */ 'a', 'u', 'd', 'i', 'o', /* giá trị là "audio" */ 1, 0, /* tên thẻ chiếm 1 byte*/ EDONKEY_STAG_TYPE, /* = 03 */
EDONKEY_SEARCH_LIMIT, /* = 03, thẻ giới hạn */ 0xd2, 0x04, 0x00, 0x00, /* giới hạn: 0x4d2 = 1234 */ EDONKEY_SEARCH_MIN, /* = 01, thẻ nhỏ nhất */ 1, 0, /* tên thẻ chiếm 1 byte*/ EDONKEY_STAG_SIZE, /* = 02 */
EDONKEY_SEARCH_LIMIT, /* = 03, thẻ giới hạn*/ 0x2e, 0x16, 0x00, 0x00, /* giới hạn 0x162e = 5678 */
Node tìm
kiếm OVERNET_SEARCH(MD4(filej)) Node nhận yêu cầu
OVERNET_SEARCH_NEXT(danh sách các peer)
có Kểm tra xem node nhận có trong danh sách trả về không?
OVERNET_SEARCH_RESULT(MD4(filej), RelHASH, MetaTagList(attr(fileN))) OVERNET_SEA RCH_INFO(MD 4(filej)) OVERNET_SEARCH_END(MD4(filej), nsent, navailable)
EDONKEY_SEARCH_MAX, /* = 01, thẻ lớn nhất */ 1, 0, /* tên thẻ chiếm 1 byte*/ EDONKEY_STAG_SIZE /* = 02 */
};
/* OP AND(OP AND(OP AND ("filename", Format="txt"), Size>=1), Size<=5678) */ unsigned char sf2[] = { EDONKEY_SEARCH_BOOL, EDONKEY_SEARCH_AND, EDONKEY_SEARCH_BOOL, EDONKEY_SEARCH_AND, EDONKEY_SEARCH_BOOL, EDONKEY_SEARCH_AND, EDONKEY_SEARCH_NAME, 8, 0,
'f', 'i', 'l', 'e', 'n', 'a', 'm', 'e', EDONKEY_SEARCH_META, 3, 0, 't', 'x', 't', 1, 0, EDONKEY_STAG_FORMAT, EDONKEY_SEARCH_LIMIT, 0x01, 0x00, 0x00, 0x00, EDONKEY_SEARCH_MIN, 1, 0, EDONKEY_STAG_SIZE, EDONKEY_SEARCH_LIMIT, 0x2e, 0x16, 0x00, 0x00, EDONKEY_SEARCH_MAX, 1, 0, EDONKEY_STAG_SIZE };