2009-11-21 5 views
1

내 프로그램에서 UDP를 통해 단일 엔터티로 보내려는 구조체와 문자 배열이 몇 개 있습니다.sendto를 사용하여 여러 데이터 형식을 보내는 C

나는 이것을하기에 좋은 방법을 생각하고있다.

내 첫번째 생각은 내가 보내고 싶은 모든 것을 포함하는 구조를 만드는 것이었다 그러나 그것은 내가 다른 배열에 두 구조체 및 char 배열을 저장하는 것이 어떻게 sendto를()

사용에 대한 잘못된 유형의 것 내가 의도 한대로 받아 들일 수 있을까요?

감사

답변

5

C가 당신의 마음의 콘텐츠를 캐스팅 할 수 있기 때문에이 sendto()에 대한 잘못된 형식 같은 것은 없다. 구조체의 주소를 void *으로 캐스팅하고이를 인수로 sendto()에 전달합니다. 연결의 양쪽에있는 프로그램이 다른에 의해 컴파일하는 경우

  • :

    그러나, 많은 사람들은 처음에 구조체 이런 식으로 보낼 것을 권장하지 않는다 있음에 감동 컴파일러 또는 다른 환경에서 귀하의 struct은 동일한 포장을하지 않을 가능성이 있습니다.

  • 전송에 관련된 두 호스트의 endinanness가 같지 않으면 데이터의 일부가 거꾸로됩니다.

  • 호스트 아키텍처가 다른 경우 (예 : 32 비트 대 64 비트) 구조체의 크기가 다를 수 있습니다. 물론 기본 데이터 유형 (int, char, long, double 등)의 크기가 다른 경우에는 크기 불일치가 발생합니다.

그래서 두 개의 호스트가 일란성 쌍둥이이거나 충분히 가깝다고 확신하는 경우에만 첫 번째 단락의 조언을 따르십시오.

다른 경우에는 데이터를 XML과 같은 중립 텍스트 표현으로 변환하는 것을 고려해보십시오.하지만 복잡 할 필요는 없습니다. 문자열은 일련의 바이트로 보내지 만 오류가 발생할 수있는 문자열은 훨씬 적습니다. 형식을 제어하기 때문에 수신 측에서는 거의 문제없이 해당 내용을 구문 분석 할 수 있어야합니다.

업데이트

당신은 대부분의 비트 필드를 전송하고 있다는 언급. 즉, 데이터는 근본적으로 정수 묶음으로 구성되며, 모두 32 비트 미만이라고 가정합니다.

"깨끗한"솔루션에 대한 제안은 모든 비트 필드의 압축을 풀고 전체 작품을 (아마도 서명되지 않은) 정수로 배열하는 기능을 작성하는 것입니다. 기계간에 sizeof(int)이 같다고 가정하면 htons()은 해당 배열의 요소 (각각 개별적으로!)에서 정상적으로 작동하므로 다른 측면의 구조로 다시 감쌀 수 있습니다.

+0

조언을 주셔서 고맙습니다. 구조체에 이미 비트 필드가 포함되어 있으며, htons()를 사용하고 있습니다. 필드에 1 비트 이상있을 때가 있습니다. 이것은 다른 패킹이있는 구조체를 무효화합니까, 아니면 여전히 이것에 대해 걱정해야합니까? 감사합니다 – Darrel

+0

아니요,'htons()'는 관련된 문제를 해결하지만 패킹 등으로는 당신을 도울 수 없습니다. 그러나 : 업데이트 된 제안 내 대답, 잠깐오고있다 ... –

+0

그래서 만약 내가 함수를 작성했다면 구조의 비트 순서를 보존 할 것인가? 아니면 배열의 요소 사이에 여분의 비트가 내가 int에 대한 32 비트를 채울 수있을 것입니다. 16 비트 필드를 짧은 부호없는 int로 패킹하면 비트 구조를 유지하는 좋은 방법이 될까요? 나는 왼쪽으로 이동하는 것이 이것에 관해가는 길일 것인가? – Darrel

0

writev으로 여러 데이터를 하나씩 보낼 수 있습니다. 보내려는 각 데이터 구조에 대해 하나의 요소로 필요한 배열 struct iovec을 만드십시오.

관련 문제