2013-06-11 5 views
1

UDP를 통해 두 개의 int64_t을 보내고 싶습니다. 이를 위해 I는 4 소자 어레이에 저장 여기서int64_t를 두 개의 int32_t로 나누고 네트워크를 통해 보내는 방법은 무엇입니까?

  • [0] - (32 개)는 하부 제 int64_t
  • [1] - 제 int64_t
  • 높은 32 비트 [ 2 - 낮은 32 비트 번째 int64_t
  • [3] - 상위 32 개 비트를 보내는 경우 제 int64_t

내 코드 :

,536 UDP를 통해 data을받은 후 int64_t 다시 int32_t을 결합하기위한 91,363,210
int64_t from, to; 

/* some logic here */ 

data[0] = htonl((int32_t) from); 
data[1] = htonl((int32_t) (from >> 32)); 
data[2] = htonl((int32_t) to); 
data[3] = htonl((int32_t) (to >> 32)); 

/* sending via UDP here */ 

내 코드 :

int64_t from, to; 
from = (int64_t) ntohl(data[1]); 
from = (from << 32); 
from = from | (int64_t) ntohl(data[0]); 
to = (int64_t) ntohl(data[3]); 
to = (to << 32); 
to = from | (int64_t) ntohl(data[2]); 

printf("received from = %" PRId64 "\n", from); 
printf("received to = %" PRId64 "\n", to); 

첫 번째 숫자 (from)이 항상 정확합니다. 그러나 두 번째에서 얻은 내용은 printf입니다. 더 중요한 것은 첫 번째 숫자에 의존하는 것 같습니다. 예 :

가 전송, 수신

  • from = 125
  • to = 20

:

  • from = 125
  • to = 125

송신 :

= 1,252
  • from,
  • to = 20

받은 :

= 1,252
  • from,
  • to = 1268.

내가 뭘 잘못하고 있니? 전환 또는 네트워크를 통한 전송의 문제입니까?

+0

잘 모르겠지만 서명 된 숫자가 아닌 서명 된 숫자로 이런 종류의 작업을 수행 할 수 있습니까? 예 : '(int32_t) from'은 서명 된 오버 플로우입니다. 맞습니까? 그 특이한 행동이나 그렇지 않은가요? http://en.wikipedia.org/wiki/Integer_overflow "C 프로그래밍 언어에서 부호있는 정수 오버플로로 인해 정의되지 않은 동작이 발생 함" – thejh

답변

6

수신기 코드에 오타가있다 :

to = from | (int64_t) ntohl(data[2]); 

당신이 뒤로 64 비트 값을 보내는

to = to | (int64_t) ntohl(data[2]); 
+4

+1. 이것이 반복 코드 (또는 복사 붙여 넣기)가 나쁜 이유이며, 그런 종류의 물건을 메서드/매크로에 넣어야합니다. 두뇌가 꺼지 자마자 손가락이 쓰레기를 입력하기 시작합니다. – thejh

2

주의해야한다.htonl()는 int32s가 올바른 순서로 송신됩니다 확인합니다,하지만 RFC 1700 필드의 가장 중요한 옥텟이 먼저 전송 될 것을 정의 : 다중 옥텟 양이 가장 중요한 옥텟을 전송

이 전송 먼저.