2014-10-19 5 views
1

그래서 sendto() 함수를 사용하여 클라이언트에 메시지를 보내려고합니다.sendto() 함수에서 구조체 보내기 - C 언어

ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, 
       const struct sockaddr *dest_addr, socklen_t addrlen); 

하지만 두 번째 인수로 구조를 보내고 싶습니다 :

sendto를() 함수의 프로토 타입이있다. 내가 그 일을 할 수 있니? 아니면 buf가 문자열이어야합니까?

편집 : 당신이보고, 나는이를 보낼 수 있어야합니다 :

PAYLOAD ""다음에 "HEADER"메시지가 구성 "

귀하의 메시지 헤더는 다음과 같이 구성해야합니다.

uint8_t version; /* must be 1. If you receive anything else, discard*/ 
uint8_t ttl; /* must be 1. If you receive anything else, discard*/ 
uint16_t payload_length; /* bytes following the header */ 
uint32_t account_identifier; /* digits of your account name */ 
uint32_t source_address; /* unused for now, set to 0 and ignore. */ 
uint32_t destination_address; /* unused for now, set to 0 and ignore. */ 
uint16_t checksum; /* unused for now, set to 0 and ignore. */ 
uint16_t protocol; /* must be 1. If you receive anything else, discard*/" 

그리고 페이로드 텍스트 "안녕하세요"와 같은 문자열이나 뭔가를합니다. 나는 모든의 구조체를 보낼 날이 될 것 헤더를 보낼 수있는 유일한 방법 같은 느낌

그 정보. 권리?

답변

2

sendto과 함께 인접한 메모리 블록을 보낼 수 있으므로 포인터가없는 struct은 문제가되지 않습니다. 그러나 클라이언트는 적절한 레이아웃을 사용하여 해당 프로세스를 처리 할 수 ​​있어야합니다. 이는 매우 제한적입니다.

이 같은 간단한 struct을 고려 : 그것은 클라이언트와 서버 코드가 동일한 설정을 사용하여, 같은 컴파일러로 컴파일 된 동일한 하드웨어에 잘 작동

struct One { 
    int a; 
    float b; 
    char c[20]; 
}; 

. 약간 다른 하드웨어로도이 문제는 단순한 struct 일지라도 엔디안, 패딩, 다양한 표현의 크기 등이 모두 동일하게 적용됩니다.

다른 하드웨어 또는 다른 프로그래밍 언어와의 상호 운용성이 필요한 경우 양측에서 처리 할 수있는 특정 구조, 바이너리 또는 텍스트를 생성해야합니다.

당신의 struct 포인터가있는 경우, 당신은 어떤 특별한 처리없이 전송하고 수신 할 수 없을 것입니다 : 당신이 그와 같은 구조를 전송해야하는 경우

struct Two { 
    int a; 
    float b; 
    char* c; // <<<=== Not going to work 
}; 

, 당신이 보낸 사람에 그들을 "직렬화" 수신 측에서 "직렬화 해제"할 수있는 바이트 배열에 넣고 대신 해당 버퍼를 보냅니다. 이 버퍼를받는 코드는 데이터를`struct '에 "압축 해제"하고, 필요에 따라 메모리를 할당하고, 수신기 버퍼의 데이터를이 새로 할당 된 메모리에 복사합니다.

struct 다음 상기 직렬화 될 수있다 : 블록의 len 포인터가 가리키는 길이를 나타내는 float

  • 4 바이트 int
  • 4 바이트

    • 4 바이트 c
    • len 내용을 나타내는 바이트 c
  • +0

    예, 상호 운용성은 문제가되지 않습니다. 서버의 하드웨어는 동일합니다. – umdcoder

    +0

    보낼 수 있도록 포인터가있는 구조체가 있습니까? – umdcoder

    +1

    @umdcoder 아니야. 일반적으로 구조체를 보내는 것은 좋지 않습니다. 구조체를 네트워크 프로토콜로 사용하지 마십시오. 네트워크 프로토콜을 네트워크 프로토콜로 사용하십시오. – EJP