sendto, recvfrom으로 어찌 구조체를 보내고 받을 수 있는지.... 그리고 보낼 구조체에는 구조체 배열이 하나 들어 있으면 어찌 되는지? 답변 부탁드립니다... 감사합니다...^^
소켓 입장에서는 구조체이던지 아닌지 상관없습니다.
그냥 (char *)로 케스트 하신다음에 sizeof(struct 구조체이름) 요렇게 사이즈 구해서 write, read 하시면 됩니다.
그런데 보낼 구조체 안에 다른 구조체 배열이 있습니다... 그것이 잘 안되네여...^^ 쩝... 어찌 해야 되는지... 그냥 구조체에 자료형들만 있으면 되는데.... 그 구조체에 포인터(배열)같은 것은 잘 인식 못하네여...^^
보낼 구조체는 다음과 같습니다...
struct riprt { short rr_family; short rr_mbz; unsigned long rr_ipa; char rr_pad[8]; int rr_metric; char rr_name[10]; };
struct rip { char rip_cmd; char rip_vers; short rip_mbz; struct riprt rip_rts[MAXRIPROUTES]; };
보낼 구조체는 rip입니다... 그런데 배열 rip_rts의 값을 받는 쪽에서 못 보내여...^^
이럴땐 어찌해야 되는지???
/* 구조체 선언 */ typedef struct _riprt { short rr_family; short rr_mbz; unsigned long rr_ipa; char rr_pad[8]; int rr_metric; char rr_name[10]; } riprt ;
typedef struct _rip { char rip_cmd; char rip_vers; short rip_mbz; riprt rip_rts[MAXRIPROUTES]; } rip;
/* 보내는쪽 */ rip send_rip; memset((char *)send_rip, 'A', sizeof(rip)); /* 껍데기 데이터 채움 */ sendto(sockfd, (char *)&send_rip, sizeof(rip), .....)
/* 받는쪽.. */ rip recv_rip; memset((char *)recv_rip, 0x00, sizeof(rip)); /* 버퍼 클리어 */ recvfrom(sockfd, (char *)&recv_rip, sizeof(rip), .....)
for(i=0;i printf("recv_rip.rip_rts[%d].rr_name[%10.10s]\n",i,recv_rip.rip_rts[i].rr_name) ;
이렇게 하면 될것 같은데,,,
혹 보내는 구조체가 너무 큰것은 아닌지 점검해 보세요 upd 최대 전송 사이즈가.. 65535 - 20(ip header) - 8(udp header) 이거든요..
감사합니다....^^
간단한 udp server 소스입니다...참고하시길...
#include <stdio.h> #include <errno.h> #include <string.h> #include <sys/types.h> #include <netinet/in.h> #include <sys/socket.h> #define MYPORT 50009 #define MAXBUFLEN 100 main() { int sockfd; struct sockaddr_in my_addr; struct sockaddr_in their_addr; int addr_len, numbytes; char buf[MAXBUFLEN]; if((sockfd=socket(AF_INET, SOCK_DGRAM,0)) == -1){ perror("socket"); exit(1); } my_addr.sin_family = AF_INET; my_addr.sin_port = htons(MYPORT); my_addr.sin_addr.s_addr = INADDR_ANY; bzero(&(my_addr.sin_zero),8); if(bind(sockfd,(struct sockaddr*)&my_addr, sizeof(struct sockaddr))==-1){ perror("bind"); exit(1); } while(1){ if((numbytes = recvfrom(sockfd, buf, MAXBUFLEN,0, (struct sockaddr *)&their_addr, &addr_len)) == -1){ perror("recvfrom"); exit(1); } buf[numbytes]='\0'; printf("get packet form %s\n", inet_ntoa(their_addr.sin_addr)); printf("packet is %d bytes long\n", numbytes); printf("packet contains :%s\n", buf); if(strcmp(buf,"exit\n")==0) break; memset(buf,'\0', MAXBUFLEN); printf("Input Message: "); fflush(stdin); fgets(buf, MAXBUFLEN,stdin); if((numbytes=sendto(sockfd, buf, strlen(buf),0, (struct sockaddr*)&their_addr, sizeof(struct sockaddr)))==-1){ perror("sendto"); exit(1); } if(strcmp(buf,"exit\n")==0) break; printf("send %d bytes to %s\n", numbytes, inet_ntoa(their_addr.sin_addr)); } close(sockfd); }
이소스를 보면 sockaddr이라는 구조체를 통해 상대방의 ip를 알수가 있죠.. 그리고 buf를 잡아서 받고,보내는거구요....
텍스트 포맷에 대한 자세한 정보
<code>
<blockcode>
<apache>
<applescript>
<autoconf>
<awk>
<bash>
<c>
<cpp>
<css>
<diff>
<drupal5>
<drupal6>
<gdb>
<html>
<html5>
<java>
<javascript>
<ldif>
<lua>
<make>
<mysql>
<perl>
<perl6>
<php>
<pgsql>
<proftpd>
<python>
<reg>
<spec>
<ruby>
<foo>
[foo]
Re: UDP 소켓에소 구조체 보내기....
소켓 입장에서는 구조체이던지 아닌지 상관없습니다.
그냥 (char *)로 케스트 하신다음에
sizeof(struct 구조체이름) 요렇게 사이즈 구해서
write, read 하시면 됩니다.
Re^2: UDP 소켓에소 구조체 보내기....
그런데 보낼 구조체 안에 다른 구조체 배열이 있습니다...
그것이 잘 안되네여...^^
쩝...
어찌 해야 되는지...
그냥 구조체에 자료형들만 있으면 되는데....
그 구조체에 포인터(배열)같은 것은 잘 인식 못하네여...^^
보낼 구조체는 다음과 같습니다...
struct riprt {
short rr_family;
short rr_mbz;
unsigned long rr_ipa;
char rr_pad[8];
int rr_metric;
char rr_name[10];
};
struct rip {
char rip_cmd;
char rip_vers;
short rip_mbz;
struct riprt rip_rts[MAXRIPROUTES];
};
보낼 구조체는 rip입니다...
그런데 배열 rip_rts의 값을 받는 쪽에서 못 보내여...^^
이럴땐 어찌해야 되는지???
Re^3: UDP 소켓에소 구조체 보내기....
/* 구조체 선언 */
typedef struct _riprt {
short rr_family;
short rr_mbz;
unsigned long rr_ipa;
char rr_pad[8];
int rr_metric;
char rr_name[10];
} riprt ;
typedef struct _rip {
char rip_cmd;
char rip_vers;
short rip_mbz;
riprt rip_rts[MAXRIPROUTES];
} rip;
/* 보내는쪽 */
rip send_rip;
memset((char *)send_rip, 'A', sizeof(rip)); /* 껍데기 데이터 채움 */
sendto(sockfd, (char *)&send_rip, sizeof(rip), .....)
/* 받는쪽.. */
rip recv_rip;
memset((char *)recv_rip, 0x00, sizeof(rip)); /* 버퍼 클리어 */
recvfrom(sockfd, (char *)&recv_rip, sizeof(rip), .....)
for(i=0;i printf("recv_rip.rip_rts[%d].rr_name[%10.10s]\n",i,recv_rip.rip_rts[i].rr_name) ;
이렇게 하면 될것 같은데,,,
혹 보내는 구조체가 너무 큰것은 아닌지 점검해 보세요
upd 최대 전송 사이즈가..
65535 - 20(ip header) - 8(udp header) 이거든요..
Re^4: UDP 소켓에소 구조체 보내기....감사합니다...^^(냉무)
감사합니다....^^
간단한 udp server 소스입니다...참고하시길...[code:1
간단한 udp server 소스입니다...참고하시길...
이소스를 보면 sockaddr이라는 구조체를 통해 상대방의 ip를 알수가 있죠..
그리고 buf를 잡아서 받고,보내는거구요....
댓글 달기