Tôi muốn tạo gói mạng để gửi qua (ví dụ) cổng 123 đến máy chủ NTP để tôi có thể nhận và phân tích cú pháp gói trả về. Mục đích là để hiểu rõ hơn cách các gói được tạo ra, đọc và được trả lời bởi các hệ thống nối mạng.Cách tạo gói mạng với C/C++
(1) Cấu trúc có nên được sử dụng để tạo gói không?
(2) Tôi không chắc chắn cách điền đúng các trường khác nhau trong cấu trúc; ví dụ: các địa chỉ IP nguồn và đích có được đặt bằng giá trị hex không? Hay có cách nào thân thiện hơn với con người?
(3) Sau đó, khi các trường đã được điền, cấu trúc có thể được gửi qua send()/write() qua kết nối UDP tới máy chủ NTP không? (hoặc TCP, nếu giao thức yêu cầu nó)
Cách tiếp cận của tôi có hợp lý không? Tôi đã đọc NTP RFC, nhưng vẫn không chắc chắn những gì khách hàng của tôi nên được gửi đến máy chủ (chẳng hạn như địa chỉ IP; không nên được chăm sóc bởi tiêu đề Lớp mạng?) Tôi đã mô hình hóa NTP này struct sau ví dụ "truyền tải" trong Phụ lục A của RFC 5905. Tôi xin lỗi nếu câu hỏi của tôi kém hoặc quá dài. Cảm ơn bạn trước vì đã giúp đỡ. Ví dụ mã bên dưới mượn từ mã ví dụ trong RFC 5905.
typedef unsigned long ipaddr; //32 bits (4 bytes)
typedef signed char s_char; //character type as number, -128..127
typedef unsigned int tdist; //character type as number, 0..255
typedef unsigned long long tstamp; //64 bits (8 bytes)
typedef unsigned long digest; //32 bits (4 bytes)
struct Ntp {
ipaddr dstaddr;
ipaddr srcaddr;
char version;
char leap;
char mode;
char stratum;
char poll;
s_char precision;
tdist rootdelay;
tdist rootdisp;
char refid;
tstamp reftime;
tstamp org;
tstamp rec;
tstamp xmt;
int keyid;
digest dgst;
} Ntp;
int main()
{
struct Ntp packet;
//packet.dstaddr=WHAT_GOES_HERE;
//...
//...
//packet.dgst=WHAT_GOES_HERE;
return 0;
}
Bạn có chắc cấu trúc 'Ntp' của bạn không được đệm theo những cách không thể đoán trước? –
"nên địa chỉ IP nguồn và đích được đặt bằng giá trị hex" - chắc chắn không, mặc dù chúng sẽ được ưu tiên hơn khi sử dụng IPv6. C có các chữ số thập phân, số thập phân phân tích chức năng và chức năng phân tích cú pháp IP (phụ thuộc vào nền tảng, kiểm tra hướng dẫn sử dụng hệ điều hành). –
Bạn có thể cần điều chỉnh giá trị cuối của bất kỳ số lượng nhiều byte nào mà bạn gửi qua dây, đó là một lý do khác để tránh gửi toàn bộ cấu trúc trong một lần viết. –