이더넷 패킷과 TCP/IP 페이로드를 만들려고하는데 다음과 같이 세 가지 구조체를 만들었습니다 : 이더넷 구조체, TCP 구조체 및 IP 구조체이 모든 구조체는 유효한 정보로 채워지지만 잘 모릅니다. 내가 지금해야 할 일은, 구조화 된 패킷을 삽입하고 모든 비트를 연속으로해야하기 때문에 예비 구조체 (예 : 배열)에 예비 구조체를 조인해야합니다.C++에서 struct를 조인합니까?
답변
새 클래스를 정의하고이 세 구조체를 클래스의 인스턴스 변수, 코드 설정자 및 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;
};
어떤 종류의 대답입니까? 너의 지나치게 폭 넓은 포인트 이외에 포인트 (작업 코드 샘플)에 올 수 있습니까? 불분명 한 질문에 답하는 것이 SO에 대한 더 명확하지 않은 대답으로 이어지지 않아야합니다! –
이것은 C++을 아는 분이라면 누구에게나 분명한 답변입니다. – Gutblender
크기가 세 구조체의 크기 합계 인 바이트 배열을 선언하십시오. 그런 다음 필요한 경우 각 구조체의 원시 바이트를 배열에 복사합니다. 그런 다음 필요에 따라 배열을 사용하십시오. 또한
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;
나는 바이트 배열하는 구조를 변환 할 때 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
- 1. C에서 소켓을 통해 struct를 전송하십시오.
- 2. C에서 struct를 생성하는 중 오류가 발생했습니다
- 3. C에서 유닉스 소켓을 통해 struct를 전송
- 4. 왜 c에서 undefined struct를 사용할 수 있습니까?
- 5. C에서 불변의 struct를 작성하는 가장 짧은 방법 #
- 6. C에서 extern struct를 함수로 전달하는 이유는 무엇입니까?
- 7. 매개 변수로 struct를 전달하고 C에서 memcpy를 전달하는 방법은 무엇입니까?
- 8. 목록과 테이블을 어떻게 조인합니까?
- 9. MySQL 업데이트가 조인합니까?
- 10. Tableau 효과 성능에 조인합니까?
- 11. struct를 int 형으로 캐스팅하십시오.
- 12. 참조로 struct를 전달 하시겠습니까?
- 13. 추상 C++ struct를 C#
- 14. extern struct를 어떻게 선언합니까?
- 15. NSArray에서 struct를 초기화 하시겠습니까?
- 16. struct와 struct를 typedef해야하는시기는 언제입니까?
- 17. Swift에서 NSData의 struct를 추출하십시오.
- 18. struct를 pthread에 인수로 전달합니다.
- 19. 4 개의 mysql 테이블이 조인합니까?
- 20. 어떻게 하위 쿼리 두 조인합니까?
- 21. Natural 관계형 대수에서 쿼리를 조인합니까?
- 22. Laravel Eloquent는 관련없는 테이블을 조인합니까?
- 23. 두 델타 테이블을 어떻게 조인합니까?
- 24. pcap_stat struct를 ctypes로 파이썬의 pcap_stats에 전달하십시오.
- 25. struct를 사용할 때 컴파일러 오류
- 26. struct를 만들기 위해 new를 사용해야합니까?
- 27. struct를 별도로 선언하고 초기화 하시겠습니까?
- 28. NSData에서 struct를 패킹하는 방법은 무엇입니까?
- 29. linq을 사용하여 동일한 필드가없는 두리스트를 어떻게 조인합니까?
- 30. 동일한 쿼리에서 테이블을 두 번 이상 조인합니까?
나는 실제로 당신이 무엇을 요구하고 있는지 전혀 모른다. 정교하게 당신의 질문에 당신이 실제로 시도하고있는 것을위한 최소한의 코드 예제를 제공해주십시오! –