2014-09-04 2 views
-6

이더넷 패킷과 TCP/IP 페이로드를 만들려고하는데 다음과 같이 세 가지 구조체를 만들었습니다 : 이더넷 구조체, TCP 구조체 및 IP 구조체이 모든 구조체는 유효한 정보로 채워지지만 잘 모릅니다. 내가 지금해야 할 일은, 구조화 된 패킷을 삽입하고 모든 비트를 연속으로해야하기 때문에 예비 구조체 (예 : 배열)에 예비 구조체를 조인해야합니다.C++에서 struct를 조인합니까?

+3

나는 실제로 당신이 무엇을 요구하고 있는지 전혀 모른다. 정교하게 당신의 질문에 당신이 실제로 시도하고있는 것을위한 최소한의 코드 예제를 제공해주십시오! –

답변

2

새 클래스를 정의하고이 세 구조체를 클래스의 인스턴스 변수, 코드 설정자 및 getter로 만듭니다. getter를 작성할 때 const 정확성에주의를 기울일 수 있습니다. getter에 const 키워드를 표시하십시오.

struct EthStruct1 
{ 
    // ... 
}; 
struct EthStruct2 
{ 
    // ... 
}; 
struct EthStruct3 
{ 
    // ... 
} 

class newClass 
{ 
public : 
    newClass(){} 
    ~newClass(){} 

    // Add functions to get and set values in A. Mark getters with const for immutability of receiver 
    // Add functions to get and set values in B. Mark getters with const for immutability of receiver 
    // Add functions to get and set values in C. Mark getters with const for immutability of receiver 
private: 
    EthStruct1 A; 
    EthStruct2 B; 
    EthStruct3 C; 
}; 
+0

어떤 종류의 대답입니까? 너의 지나치게 폭 넓은 포인트 이외에 포인트 (작업 코드 샘플)에 올 수 있습니까? 불분명 한 질문에 답하는 것이 SO에 대한 더 명확하지 않은 대답으로 이어지지 않아야합니다! –

+1

이것은 C++을 아는 분이라면 누구에게나 분명한 답변입니다. – Gutblender

0

크기가 세 구조체의 크기 합계 인 바이트 배열을 선언하십시오. 그런 다음 필요한 경우 각 구조체의 원시 바이트를 배열에 복사합니다. 그런 다음 필요에 따라 배열을 사용하십시오. 또한

struct ethernet 
{ 
    ... 
}; 

struct tcp 
{ 
    ... 
}; 

struct ip 
{ 
    ... 
}; 

ethernet e; 
tcp t; 
ip i; 

unsigned char arr[sizeof(e)+sizeof(t)+sizeof(i)]; 
memcpy(&arr[0], &e, sizeof(e)]; 
memcpy(&arr[sizeof(e)], &t, sizeof(t)]; 
memcpy(&arr[sizeof(e)+sizeof(t)], &i, sizeof(i)]; 

는 :

struct ethernet 
{ 
    ... 
}; 

struct tcp 
{ 
    ... 
}; 

struct ip 
{ 
    ... 
}; 

struct pkt 
{ 
    ethernet e; 
    tcp t; 
    ip i; 
}; 

ethernet e; 
tcp t; 
ip i; 

unsigned char arr[sizeof(pkt)]; 
pkt *p = (pkt) &arr[0]; 
p->e = e; 
p->t = t; 
p->i = i; 
0

나는 바이트 배열하는 구조를 변환 할 때 union를 사용하려면. 컴파일러가 1 바이트 구조체 정렬을 사용하고 있는지 확인하십시오 ... Windows 컴파일러에서 #pragma pack(push,1)을 사용하여 시작하고 #pragma pack(pop)을 종료 할 수 있음을 알고 있습니다. 나는이 예를 통해이 방법을 사용할 것이다.

#pragma pack(push,1) // start single-byte struct alignment 
struct EthernetInfo 
{ 
    // data here 
}; 
struct TCPInfo 
{ 
    // data here 
}; 
struct IPInfo 
{ 
    // data here 
}; 

union Packet 
{ 
    struct { 
     struct EthernetInfo ethernetInfo; 
     struct TCPInfo  tcpInfo; 
     struct IPInfo  ipInfo; 
    } AsPacket; 
    unsigned char AsBytes[sizeof(EthernetInfo) + sizeof(TCPInfo) + sizeof(IPInfo)]; 
}; 
#pragma pack(pop) // revert to whatever struct alignment was in use before 
관련 문제