net.resolve: Phân giải địa chỉ

Mô tả việc cắt bớt địa chỉ số, danh sách tên do người gọi sở hữu và kết quả.

Wave Foundation

Chọn phương pháp tra cứu

Giá trị mặc định cho Linux, resolver, lấy địa chỉ số IPv4/IPv6 và một cổng số. Tên máy chủ hoặc tên dịch vụ không được truyền ngầm tới hệ thống DNS. Ví dụ: 127.0.0.1 và 8080 là đầu vào số và example.com và http là tên.

Để sử dụng danh sách tên được cung cấp rõ ràng, hãy sử dụng std::net::resolve_table. Bạn có thể kết nối trực tiếp tới địa chỉ số hoặc tìm kiếm bằng cách đăng ký địa chỉ vào danh sách tên.

Tra cứu cơ bản

std::net::resolve
net_resolve_tcp(host: str, service: str, output: ptr<SocketAddr>, capacity: i64) -> NetResolveResult
net_resolve_udp(host: str, service: str, output: ptr<SocketAddr>, capacity: i64) -> NetResolveResult
net_resolve_host(host: str, service: str, output: ptr<SocketAddr>, capacity: i64) -> NetResolveResult

Mảng đầu ra được cung cấp bởi người gọi. Đơn vị của capacity không phải là byte mà là SocketAddr số phần tử. Bạn chỉ có thể tìm kiếm số đếm với capacity=0 và null output. Cửa hàng tra cứu nội bộ được dọn sạch trước khi trả về và không sở hữu mảng đầu ra.

trường kết quả ý nghĩa
ok Truy vấn có thành công hay không
count Tổng số kết quả địa chỉ được hỗ trợ
written Số phần tử thực sự được ghi vào mảng đầu ra
truncated Công suất đầu ra có nhỏ hơn tổng kết quả không?
error.kind Các phân loại được chuẩn hóa như INVALID, NOT_FOUND, UNSUPPORTED
error.native_code Mã gốc để xác định nguyên nhân

Ngay cả khi thành công, written có thể bằng 0. Hãy kiểm tra ok && written > 0 trước khi sử dụng output[0].

Danh sách tên bạn tự cung cấp

net_resolve_from_table(host: str, service: str, protocol: i32,
    entries: ptr<NetResolveEntry>, entry_count: i64,
    output: ptr<SocketAddr>, capacity: i64) -> NetResolveResult

NetResolveEntry trong std::net::resolve_table có host, service, protocol, address. Tên máy chủ ASCII không phân biệt chữ hoa chữ thường và tên dịch vụ được so sánh chính xác. TCP/UDP/Đối với tất cả các truy vấn giao thức, các hằng số của mô-đun được sử dụng. Các mục và chuỗi thuộc sở hữu của người gọi và không được giữ lại sau cuộc gọi.

Các kết quả trùng khớp được sao chép theo thứ tự đầu vào và các bản sao được duy trì. Không gian đầu ra và không gian lưu trữ đầu vào không được chồng chéo. Nếu tên không có trong danh sách thì đó là NOT_FOUND và sẽ không thử lại với tên DNS bên ngoài.

TCP Cách sử dụng · TCP Thực hành khách hàng

Tra cứu địa chỉ dạng số

Chuẩn bị một mảng để lưu kết quả truy vấn và kiểm tra xem địa chỉ có được ghi lại hay không. Ví dụ bên dưới không yêu cầu máy chủ vì việc tra cứu địa chỉ không tự tạo ra kết nối.

import("std::net::address")::{
    SocketAddr
};
import("std::net::resolve")::{
    NetResolveResult,
    net_resolve_tcp
};

fun main() -> i32 {
    var addresses: array<SocketAddr, 4>;
    var result: NetResolveResult = net_resolve_tcp(
        "127.0.0.1",
        "8080",
        &addresses[0],
        4
    );

    if (!result.ok || result.written == 0) {
        println("address unavailable");
        return 1;
    }

    println("address ready");
    return 0;
}

Kết quả thực hiện:

address ready

Để thực sự kết nối, hãy chuyển addresses[0] cho chuỗi hàm tcp_connect_addr. Ngay cả khi bạn nhận được địa chỉ, ở giai đoạn kết nối, bạn có thể biết liệu máy chủ có đang chạy trên cổng đó hay không.

Tìm kiếm theo danh sách tên

Danh sách địa chỉ tùy chỉnh rất hữu ích cho việc liên kết tên dựa trên tệp cấu hình hoặc danh sách dịch vụ của chương trình. Ví dụ sau ánh xạ tên api tới cổng 8080 cục bộ.

import("std::net::address")::{
    SocketAddr,
    socket_addr_from_v4,
    socket_addr_v4_loopback
};
import("std::net::resolve")::{
    NetResolveResult
};
import("std::net::resolve_table")::{
    NetResolveEntry,
    RESOLVE_TCP,
    net_resolve_from_table
};

fun main() -> i32 {
    var entries: array<NetResolveEntry, 1>;
    entries[0] = NetResolveEntry {
        host: "api",
        service: "http",
        protocol: RESOLVE_TCP,
        address: socket_addr_from_v4(socket_addr_v4_loopback(8080))
    };

    var addresses: array<SocketAddr, 2>;
    var result: NetResolveResult = net_resolve_from_table(
        "API",
        "http",
        RESOLVE_TCP,
        &entries[0],
        1,
        &addresses[0],
        2
    );

    if (!result.ok || result.written != 1) {
        return 1;
    }

    println("matched={}", result.written);
    return 0;
}

Kết quả thực hiện:

matched=1

API và api khớp với nhau khi so sánh tên máy chủ. http và HTTP không khớp nhau trong ví dụ này vì chúng khác nhau khi so sánh tên dịch vụ. Nếu bạn đăng ký nhiều địa chỉ có cùng tên thì kết quả sẽ xuất hiện theo thứ tự đã nhập. Nếu bạn chỉ nhận được một phần của mảng nhỏ, chỉ đọc tối đa written và nếu bạn cần toàn bộ danh sách, hãy chuẩn bị khoảng trống cho count và tìm kiếm lại.