Tôi đang thực hiện một chương trình giao tiếp với một số bệnh nhân theo dõi bằng cách sử dụng ổ cắm C. Tôi đang sử dụng ổ cắm ít kết nối (UDP) để giao tiếp với thiết bị. Nhưng có endianness mis-match giữa máy tính và điện thoại của tôi và cho đến nay tôi đã làm điều này để có được câu trả lời phân tích cú pháp từ theo dõi bệnh nhân:Endianness and Socket Programming in C
recvfrom(int socket, char *buffer, size_t length, int flags,
struct sockaddr *address, socklen_t *address_len);
Sau đó, tôi đã đúc bộ đệm trực tiếp đến cấu trúc và sử dụng ntohs và ntohl để thay đổi thứ tự byte, ví dụ:
struct A * a = (struct A *)buffer;
Struct A b;
b.v1 = ntohs(a->v1);
b.v2 = ntohl(a->v2);
Sau khi đọc một vài ví dụ qua internet, tôi đã tìm ra cách tiếp cận này sai do đệm phụ thuộc vào trình biên dịch. Nhưng tôi không chắc lắm. Tôi cần cách đơn giản để un-marshall một bộ đệm cho một cấu trúc C với endiannes chính xác. Cấu trúc mà tôi nhận được có thể có chiều dài không thể đoán trước và ít phức tạp. Tôi cần cách tiếp cận nhanh chóng và dễ dàng để thực hiện việc không sửa đổi.
Tôi không kiểm soát người gửi. Người gửi nằm trong thứ tự byte mạng. Câu hỏi của tôi chỉ là: - Có an toàn khi bỏ một bộ đệm vào một cấu trúc và sau đó sử dụng ntohs và ntohl trên cấu trúc đúc này để tạo bản sao thứ tự byte lưu trữ của cấu trúc này? Đó có phải là cách tiếp cận nhanh nhất không? Nếu không, thì điều gì có thể là cách tiếp cận nhanh nhất?
làm bạn kiểm soát người gửi là tốt? Họ có gửi gói tin theo thứ tự byte mạng không? – hroptatyr
Tôi nghĩ rằng giải pháp của bạn đã đúng, bạn có thể sử dụng '__attribute __ ((đóng gói))' hoặc 'aligned (x)' để đảm bảo trình biên dịch không làm hỏng cấu trúc của bạn. – hroptatyr
chuyển đổi sang thứ tự byte mạng khi đặt dữ liệu trên dây và chuyển đổi sang thứ tự máy chủ khi tháo dây. –