리눅스 커널에 맞춤 프로토콜을 작성하고 있습니다. 내가 HDR-의 주소로 syn
및 ack
(다른 패킷) 구조를 매핑, 다음과 같은 구조 받은 네트워크 패킷의 메모리 정렬 문제
struct syn {
__be32 id;
__be64 cookie;
};
struct ack {
__be32 id; // Right now, setting it to 14 (Just a random choice)
__be32 sequence;
};
struct hdr {
............
__be32 type; //last element
};
내가 보내고 패킷을 수신
을 사용하고 있습니다> 입력합니다.이
이상적 (SYN과 ACK 구조에서) ID가hdr->type
에 매핑되어야하고, 무엇이든
struct hdr
다음에 내가
hdr->type
에 매핑있어하는 구조체에 따라
syn->cookie
또는
ack->sequence
중 하나에 매핑되어야한다는 것을 의미한다 .
그러나 이러한 변수의 메모리 주소를 인쇄에
, 나는//For struct syn
hdr->type at ffff880059f55444
syn->id at ffff880059f55444
syn->cookie at ffff880059f5544c //See the last two bits
//For struct ack_frame
hdr->type at ffff880059f55044
ack->id at ffff880059f55044
ack->sequence at ffff880059f55048 //See the last two bits
다음 얻을 왜
ack->id
및
syn->id
는 같은 크기있을 때
syn->cookie
을하고
hdr->type
을 기준으로 서로 다른 오프셋에서
ack->sequence
시작?
편집 1 : 64 비트 컴파일러가 채워 일부터 나는
char *ptr = (char *)&hdr->type;
//For syn
struct syn *syn1 = (struct syn *)ptr
//For ack
struct ack *ack1 = (struct ack *)ptr
핵심 단어는 * 성향 * ... – Nim
당신은 "나는 HDR-의 주소> 입력에 (다른 패킷) 구조가 SYN과 ACK지도."무슨 뜻입니까? 나는 타입의 lvalue가 객체의 유효한 타입이 아니거나 경계를 벗어나는 것을 접근하는 객체에 접근하기 위해 정의되지 않은 동작을 냄새 맡는다. – EOF
예, 이해합니다. 그러나 다른 구조를 사용하여 패킷을 채웠더라도 매번 같은 방식으로 패킷에 액세스 할 수있는 방법이 필요합니다. –