소켓프로그램에서 구조체 수신방법
글쓴이: Clientserver / 작성시간: 일, 2016/10/30 - 8:05오후
struct DATA* message; recv(ClntSock, message, sizeof(message)-1, 0); printf("%s", message.account);
설명 : 일단 이렇게 코딩을 했는데요 printf부분에서 에러가 납니다.
recv()함수안에 파라미터로 뭘 넣어야하는지 받아온 구조체를 출력은 어떻게 하는지 모르겠습니다.
Forums:
구조체 데이터를 그대로 네트웍으로 쏘면 변수 순서나
printf()의 인수값은 구조체의 멤버변수를 가져오는 것인데 message 변수는 구조체가 아니라 구조체에 대한 포인터 입니다. message->account 로 써야 에러 안날겁니다.
send(), recv()의 송수신 버퍼는 void * 형 입니다. 변수 하나든 구조체든 앞에 '&'를 붙여서 그 주소 넣어야 합니다.
그리고 구조체 데이터를 그대로 네트웍으로 쏘면 변수 순서나 padding 문제때문에 안될 수 있고요.
구조체 데이터를 일정한 형식의 연속된 byte stream으로 만들어서 쏴야 합니다.
만드는데는 아래 2가지 방법이 있습니다.
1) 구조체 각 멤버를 위치하고 싶은 순서에 따라 memcpy()로 연속된 unsigned char 배열에 복사한 뒤 네트웍으로 쏜다. memcpy()에는 void *로 강제 형변환.
=> 어느 컴파일러건 다 통용 가능한 대신 상당히 짜증나는 코드가 나옴.
2) 비표준 packed 구조체(멤버변수 사이 padding이 없는 구조체)로 선언하기
=> 표준문법에 없는 비표준 컴파일러 확장이라 컴파일러 뭐쓰는지 보고 골라써야 함.
입니다.
웬간한 고급언어들은 serialization 관련 함수들이 있어서 이걸로 하지만 C는 이걸 알아서 만들어야.
Written By the Black Knight of Destruction
serialization 개념부터 있어야 합니다.
serialization 개념부터 있어야 합니다. 직렬화라고 하기도 하지요.
구조체에 동적할당이 들어가는 순간... 저렇게 구현할 경우 절대로 동작하지 않습니다.
그리고 network byte order도 같이 보셔야 할 것 같네요.
struct DATA message;
물론 기타 예외 상황 같은것은 고려하지 않았습니다.
댓글 달기