2014-07-14 2 views
1

에서 오는 구조체에 문자 버퍼를 타입 캐스팅 : 소켓에서 오는 구조의 흐름이 있습니다내가 소켓에서 데이터를 읽을 다음 코드를 사용하고 소켓

while (true) 
{ 

     int len = 0; 
     ioctl(sd, FIONREAD, &len); 
     if (len > 0) 
     { 
       len = read(sd, databuf, len);     
     } 

     else 
       std::cout << "error" << std::endl; 
} 

. 구조체의 크기가 정의되어 있습니다.

그래서 어떻게 같은 구조체 읽을 수 있습니다 : 나는 그것을 타입 캐스팅 생각

typedef struct 
{ 
     short msglen; 
     short id; 
     int seqno; 
}HEADER; 

을,하지만 난 그것을 수행하는 방법을 알아낼 수 없습니다. 문자 버퍼에는 구조체가 차례대로 포함됩니다. 첫 번째 바이트를 얻으려면 처음 8 바이트 만 읽어야합니다.

또한 네트워크에서 멀티 캐스트 메시지의 연속 스트림을 수신 중이므로 while 루프가 있습니다.

+2

'std :: memcpy (& header, buffer, sizeof (header)); ' –

+0

@Jayesh 나는 수신 측에있다. 또한, 나는 서버와 연락이 없다. 그들은 ip와 port를 주었다. 그리고 구조체 정의와 크기. 그게 다야. – Chani

+2

실제로 데이터를 유선으로 전송하는 경우 엔디안, 기본 제공 데이터 크기 및 패딩을 생각해야합니다. 단순히 데이터를 복사하는 것은 매우 안전하지 않은 것처럼 보입니다. 객체 직렬화를 살펴보십시오. – juanchopanza

답변

2

표준을 준수하고 안전한 방법은 memcpy을 사용하는 것입니다

HEADER header; 
char buffer[/*size*/]; 

/* read data into buffer */ 

std::memcpy(&header, buffer, sizeof(header)); 

현대 컴파일러는 함수 호출을 멀리 최적화 완벽하게 할 수있다.

reinterpret_cast과 같은 문자로 buffer을 전송하지 마십시오. 그것은 엄격한 앨리어싱 규칙을 위반하기 때문에 정의되지 않은 동작입니다 (글자 값 char 또는 unsigned char 유형을 통해 모든 유형의 객체에 저장된 값에 액세스 할 수 있지만 그 반대는 유효하지 않습니다).

보조 노트로 typedef struct { /* ... */ } HEADER;은 C- 이즘입니다. 그냥 struct HEADER { /* ... */ };하십시오.

2
std::memcpy(&header, buffer, sizeof(header)); 
관련 문제