Linux C 코드 질문드립니다.

글쓴이: 익명 사용자 / 작성시간: 월, 2017/09/11 - 7:12오후
#include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <time.h> #include <string.h> #include <stdio.h> #define HELLO_PORT 12345 #define HELLO_GROUP "225.0.0.37" #define MSGBUFSIZE 256 main(int argc, char *argv[]) { struct sockaddr_in addr; int fd, nbytes,addrlen; struct ip_mreq mreq; char msgbuf[MSGBUFSIZE]; u_int yes=1; /*** MODIFICATION TO ORIGINAL */ /* create what looks like an ordinary UDP socket */ if ((fd=socket(AF_INET,SOCK_DGRAM,0)) < 0) { perror("socket"); exit(1); } /**** MODIFICATION TO ORIGINAL */ /* allow multiple sockets to use the same PORT number */ if (setsockopt(fd,SOL_SOCKET,SO_REUSEADDR,&yes,sizeof(yes)) < 0) { perror("Reusing ADDR failed"); exit(1); } /*** END OF MODIFICATION TO ORIGINAL */ /* set up destination address */ memset(&addr,0,sizeof(addr)); addr.sin_family=AF_INET; addr.sin_addr.s_addr=htonl(INADDR_ANY); /* N.B.: differs from sender */ addr.sin_port=htons(HELLO_PORT); /* bind to receive address */ if (bind(fd,(struct sockaddr *) &addr,sizeof(addr)) < 0) { perror("bind"); exit(1); } /* use setsockopt() to request that the kernel join a multicast group */ mreq.imr_multiaddr.s_addr=inet_addr(HELLO_GROUP); mreq.imr_interface.s_addr=htonl(INADDR_ANY); if (setsockopt(fd,IPPROTO_IP,IP_ADD_MEMBERSHIP,&mreq,sizeof(mreq)) < 0) { perror("setsockopt"); exit(1); } /* now just enter a read-print loop */ while (1) { addrlen=sizeof(addr); if ((nbytes=recvfrom(fd,msgbuf,MSGBUFSIZE,0, (struct sockaddr *) &addr,&addrlen)) < 0) { perror("recvfrom"); exit(1); } puts(msgbuf); } }
해당 프로그램은 multicst로 뿌려진 메시지를 받아오는 프로그램입니다.
임베디드 리눅스 환경에서 실행되야합니다.
문제점 : 현재 msgbuf로 메시지를 받을 경우 예를들어, "hello"라는 메시지를 보냈을때, "h"만 받아오는 문제가있습니다.
해당 문제를 해결할 방법을 알고싶습니다.
Forums:
Send 프로그램은 C#으로 짜서 발생하는 문제인가
Send 프로그램은 C#으로 짜서 발생하는 문제인가 싶어서 추가 내용적습니다.
wireshark 로 send 쪽에서 제대로 데이터를
wireshark 로 send 쪽에서 제대로 데이터를 보내는지 확인해 보세요 ~
wireshark로 메시지 send 확인했고, C
wireshark로 메시지 send 확인했고, C#으로 Receive 프로그램 작성해서 받아보니 정상적으로 받아집니다.
Unicode(UTF-16)으로 보내는건 아닌지 확인해보세요.
Wireshark으로 확인해서 1234을 보냈을 때 31 00 32 00 33 00 34 00 이런식으로 가면 UTF-16같은걸로 보내서 C로 짜여진 수신 프로그램에서는 31 00 까지만 보고 1 만 출력하는 겁니다.
C#에서 문자열 인코딩할 때 UTF-8이나 ASCII으로 인코딩하도록 해보세요.
댓글 달기