2013-01-31 20 views
6

(Xin lỗi nếu tôi không thể đặt câu hỏi một cách chính xác. Tiếng Anh tại không ngôn ngữ chính của tôi.)cách chính xác để phân tích gói dữ liệu mạng trong C

Tôi cố gắng để phân tích gói SyncE ESMC. Đó là gói giao thức Ethernet chậm.

Cách tiếp cận 1: Để phân tích cú pháp gói này, tôi đã sử dụng phương pháp byte byte tương tự như những gì đã được thực hiện here.

Cách tiếp cận 2: Cách khác để phân tích cú pháp gói là xác định 'cấu trúc' để biểu diễn toàn bộ gói và truy nhập các trường riêng lẻ để lấy giá trị tại độ lệch cụ thể. Tuy nhiên trong cách bố trí cấu trúc và cách sắp xếp này có thể đi vào hình ảnh (mà tôi không chắc chắn) nhưng trên các tiêu đề gói khác nhau của Linux được định nghĩa dưới dạng cấu trúc, ví dụ: iphdr trong ip.h. Các gói IP (bộ đệm) có thể được nhập thành 'iphdr' để lấy các trường tiêu đề ip, vì vậy nó phải hoạt động.

Cách tiếp cận nào tốt hơn để phân tích cú pháp gói mạng trong C?

Cấu trúc padding và aligment có tạo sự khác biệt nào trong khi phân tích cú pháp gói thông qua phương pháp 2 không? Nếu có, các tiêu đề Linux đã khắc phục vấn đề này như thế nào?

+0

Tất cả trình biên dịch có chức năng không cấu trúc pad hoặc căn chỉnh các trường thành viên và bạn cũng có thể sử dụng bitfields cho các trường ngắn hơn một byte. –

+0

@JoachimPileborg - cách tiếp cận nào sẽ tốt hơn, hiệu quả hơn và hiệu quả? – Abhirav

+0

Di động giữa các trình biên dịch, hệ điều hành, phần cứng hoặc kết hợp chúng? Hiệu quả hơn khi sử dụng nhanh, sử dụng ít bộ nhớ hơn hoặc một số tiêu chí khác? Cả hai cách tiếp cận đều có giá trị, và cách nào là "tốt nhất" phụ thuộc phụ thuộc rất nhiều vào mục tiêu của bạn. –

Trả lời

1

Phương pháp tiếp cận 1 là tốt nhất cho tính di động. Nó cho phép bạn một cách an toàn tránh truy cập không được thiết kế, ví dụ. Đặc biệt, nếu máy của bạn là một người rất nhỏ, cách tiếp cận này cho phép bạn quản lý việc trao đổi byte rất dễ dàng.

Phương pháp tiếp cận 2 đôi khi thuận tiện và thường là mã nhanh hơn để viết. Nếu cấu trúc đệm được theo cách của bạn, trình biên dịch của bạn có thể cung cấp một cờ hoặc thuộc tính (như __attribute__((__packed__)) hoặc #pragma pack) để làm việc xung quanh nó. Tuy nhiên, nếu bạn có một máy tính nhỏ gọn, bạn vẫn phải có các trường bytewap trên toàn bộ địa điểm.

+0

cảm ơn vì sự an ủi và câu trả lời chính xác! – Abhirav

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