2011-06-24 33 views
6

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; 
} 
+2

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? –

+1

"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). –

+1

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. –

Trả lời

2

Bạn dường như không có nhiều kinh nghiệm viết giao thức mạng. Tuyên bố một cấu trúc và viết nó ra không phải là con đường để đi. Tôi cũng chỉ cho bạn http://fixunix.com/ntp/257876-any-samples-ntp-sntp-client-code.html và đặc biệt gọi ra những điểm sau đây:

  • Tại sao bạn muốn cuộn của riêng bạn so với chạy một trong các gói hiện hành?

  • Một vấn đề khi viết ứng dụng khách NTP là nhận được thời gian phù hợp.

  • Cách khác không làm hỏng phần còn lại của mạng hoặc đặt tải không hợp lý trên máy chủ.

Trong mọi trường hợp, như đã thảo luận trong chủ đề Tôi chỉ bạn, bạn muốn sử dụng SNTP và nên hãy nhìn vào việc thực hiện tham khảo SNTP trong tarball NTP để vạch ra con đường và giúp bạn tìm ra những gì bạn nên làm.

+0

Cảm ơn bạn đã trả lời; mục tiêu của tôi là hiểu rõ hơn cách các gói được gửi, đọc và được trả lời bởi các hệ thống qua mạng (ở mức cơ bản nhất). Tôi không cố gắng tạo một ứng dụng khách có thể sử dụng công khai - tôi chỉ muốn gửi thành công gói tin tuân thủ giao thức. Trong trường hợp này là NTP; Tôi đã chọn nó bởi vì tôi nghĩ [có lẽ sai lầm] rằng nó sẽ là một mục tiêu thực tế hơn. Tôi cho rằng câu hỏi của mình không quảng cáo chính xác mục tiêu của mình và tôi xin lỗi vì bất kỳ sự nhầm lẫn nào; cảm ơn vì phản hồi mang tính xây dựng của bạn - tôi sẽ chỉnh sửa câu hỏi của mình cho phù hợp. – shelladept

Các vấn đề liên quan