저는 C 프로그래밍에 비교적 익숙하지 않고 아직 답변을 찾지 못했습니다. 정수, 문자 및 longs를 TCP 연결을 통해 바이트로 올바르게 보내고 받으려고합니다. 저는 이것을 만들었지 만 아직 작동하지 않습니다.C에서 TCP/IP를 통한 바이트 배열 송수신
보낸 사람 :
int a = 12345;
char b = -1;
unsigned long c = 12174723939;
unsigned char array[256];
array[0] = (a >> 0) & 0xFF;
array[1] = (a >> 8) & 0xFF;
array[2] = (b >> 16) & 0xFF; //Is this correct for -1?
array[3] = (c >> 24) & 0xFF;
array[4] = (c >> 32) & 0xFF;
array[5] = (c >> 40) & 0xFF;
array[6] = (c >> 48) & 0xFF;
send(socket, array, sizeof(array),0); //or is &array better?
수신기 :
int a;
char b;
unsigned long c;
unsigned char array[256];
recv(socket, array, sizeof(array),0);
a |= (array[0] << 0) & 0xFF;
a |= (array[1] << 8) & 0xFF;
b |= (array[2] << 16) & 0xFF;
c |= (array[3] << 24) & 0xFF;
c |= (array[4] << 32) & 0xFF;
c |= (array[5] << 40) & 0xFF;
c |= (array[6] << 48) & 0xFF;
이 맞습니까? 없어진 물건 있어요? 다른 해결책이 있습니까?
수신 부분은 어떻게 처리됩니까? 나는 크고 작은 엔디안에 대해 읽었습니다 (htonl/htons 및 ntohl/ntosl). 예를 들어이 코드에서 구현하는 방법에 대한 예가 있습니까? 당신이 역순으로
a += array[1];
a<<=8;
a += (array[0]);
생각하지만 왼쪽 Shift 서명 값을 기준으로 UB 떨어져 있다는 사실을 숙지 수신 측에
동일한 상자에서 서버와 클라이언트를 실행할 때 엔디안 효과는 정의가 아닙니다. – alk
@alk 그러나 미래의 사용을 위해 소프트웨어를 설계하는 것은 항상 좋은 시간을 투자합니다. "동일한 박스"에서 "분산 버전"사이의 단계는 매우 짧습니다. – LPs
@LP : 나는 완전히 동의합니다. 나는 단지 "* 작동하지 않습니다. *"는 endianess와 관련이 없을 수도 있음을 알고 싶었습니다. – alk