- Đầu tiên ta cộng các từ 16 bit trong header: Code:
Đúng là tôi quên mất define thông số này, các bạn thêm vào, tốc độ tùy mọi người thôị Ví dụ: Code:
while ((len = (unsigned int) (sum >> 16)) != 0) sum = (unsigned int) sum + len;
Ở đây ta gán len=(unsigned int) (sum >> 16) chính là 2 byte cao của biến 4 byte sum, lúc này biến len được tận dụng như là 1 biến tạm thôi, không có ý nghĩa là chiều dài nữạ biến len được tận dụng như là 1 biến tạm thôi, không có ý nghĩa là chiều dài nữạ
Ta đem phần dư (2 byte cao, được chứa trong biến len) cộng với 2 byte thấp: (unsigned int) sum (phải ép kiểu sum từ long sang int nếu không nó sẽ cộng cả 4 byte của sum). (phải ép kiểu sum từ long sang int nếu không nó sẽ cộng cả 4 byte của sum).
Vòng lặp này cho đến khi nào 2 byte cao của sum=0x0000 (hết phần dư).
Vậy kết quả ta thu được bây giờ là :"tổng bù-1 của tất của các từ 16 bit trong header IP".Cuối cùng ta cần lấy bù-1 của kết quả này, đó là checksum IP. Cuối cùng ta cần lấy bù-1 của kết quả này, đó là checksum IP.
Code:
return (unsigned int) sum ^ 0xFFFF;
Phức tạp chưạ Đã nói là khi viết phần này tôi mất 4h chỉ để sửa hàm checksum và debug các gói IP để xem mình sai chỗ nàọ Em thắc mắc cũng không có gì lạ. IP để xem mình sai chỗ nàọ Em thắc mắc cũng không có gì lạ.
Lúc trước tôi không mô phỏng, mà nói chung trước giờ hiếm khi nào mô phỏng trước khi làm mạch, vì mạch phức tạp thì việc mô phỏng không có nhiều ý nghĩa, mà mạch đơn giản thì cần gì mạch, vì mạch phức tạp thì việc mô phỏng không có nhiều ý nghĩa, mà mạch đơn giản thì cần gì phải mô phỏng, chỉ mô phỏng mạch analog thôị
Đúng là tôi quên mất define thông số này, các bạn thêm vào, tốc độ tùy mọi người thôị Ví dụ:Code: Code:
#define UART_BAURATE 9600l
#define UART_BAURATE 9600l #ifndef ARP_H #define ARP_H và cuối file: Code: #endif //ARP_H
Các dòng này nhằm mục đích nếu file được include nhiều hơn 1 lần, thì các lần sau nó sẽ được bỏ qua (vì điều kiện #ifndef ARP_H sẽ false, do ARP_H đã được định nghĩa trước đó. bỏ qua (vì điều kiện #ifndef ARP_H sẽ false, do ARP_H đã được định nghĩa trước đó.
Còn 1 lý do có thể dẫn đến lỗi này là do khai báo trùng APentry ở đâu đó (ít có khả năng xảy ra).Nếu tìm không ra lỗi, em có thể gửi toàn bộ code lên DĐ hay qua mail, tôi sẽ check chọ Nếu tìm không ra lỗi, em có thể gửi toàn bộ code lên DĐ hay qua mail, tôi sẽ check chọ