[질문] 소켓을 사용해서 구조체를 전달하는 방법에 대해...
글쓴이: runkid / 작성시간: 수, 2004/10/20 - 1:45오후
리눅스에서 C언어로 소켓을 사용한 간단한 서버 클라이언트 코드를 작성중입니다..
간단한 문자열은 서버측에서 받아서 printf()로 화면에 출력하면 제대로 전달된다는 것을 알 수있는데 클라이언트에서 구조체를 전달 할 경우 그것을 서버에서 받아보는게 잘 안되고 있습니다..
제가 작성한 코드를 대강 보자면.. 우선 클라이언트측 구조체는 이렇습니다..
struct data { int length; char *device; } struct data info;이녀석의 멤버에 값을 주고 send()로 서버에 보냅니다..
if(send(sock, (struct data *)&info, sizeof(info)) < 0) ...
그리고 이녀석을 서버측에서 recv()로 받습니다..
서버측도 클라이언트측과 동일한 구조체를 만들어 사용했습니다..
if((rsize = recv(clientSock,(struct data *)&ni, sizeof(ni),0))<0) ....
이런식입니다..
서버측에서 받아서 printf()문으로 받은 메시지를 확인해보면
구조체data의 멤버중 int형 멤버인 length는
정확한 값이 출력되는 반면
char *형 멤버인 device는 엉뚱한 글자들이 출력되더군요..
제가 구조체를 전달 하는 방법이 틀렸다면..
혹은 받은 구조체의 멤버들을 다시 가공을 해야하는건지..
올바른 방법을 알고싶습니다...
Forums:
char *device는 포인터입니다.device라는 포인터에 담긴
char *device는 포인터입니다.
device라는 포인터에 담긴 주소의 값까지 전달되지는 않습니다. 4바이트(일반적으로..)의 주소값을 전달해줘 봤자 전달받은 쪽의 같은 메모리 주소에 값이 있을리 만무하구요.
char device[200] 이런식으로 고정시켜주면 전달이 잘 될겁니다.
[code:1]struct data{ int leng
위처럼 바꾸시던가..
아니면 send에서 따로따로 보내셔야 합니다.
엄연히 말해
char * device; 는 포인터이고 이는결국 4바이트짜리 메모리 공간입니다..
char * device = malloc(10); 과 같이 했으면
device 에는 malloc가 할당한 메모리 주소를 가지고 있을 뿐입니다.
위 struct를 send를 하면 길이하고 메모리 주소가 보내지겠죠..
PS) 윽.. 빠르닷. 벌써 답글이.
고작 블로킹 하나, 고작 25점 중에 1점, 고작 부활동
"만약 그 순간이 온다면 그때가 네가 배구에 빠지는 순간이야"
자세한 설명 감사드립니다...
자세한 설명 감사드립니다...
구조체 내의 int length;에 대해서는 htonl(), nt
구조체 내의
int length;
에 대해서는 htonl(), ntohl()등을 사용해서
바이트 순서를 맞춰줘야 합니다.
"big endian 대 little endian"을 기억하세요.
댓글 달기