-
구조체를 이용한 UDP 통신C_C++ 프로그래밍/UDP 2019. 5. 29. 00:35
소스코드
Sever.c
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960#include <sys/types.h>#include <sys/stat.h>#include <sys/socket.h>#include <unistd.h>#include <stdio.h>#include <string.h>#include <netinet/in.h>#include <arpa/inet.h>#define PORT_NUM 20046#define MAXLEN 256struct usr_data{char name[MAXLEN];char buf[MAXLEN];};int main(int argc, char **argv){int sockfd;char *ans = "SUCCESS";socklen_t addrlen;struct sockaddr_in addr, cliaddr;struct usr_data rdata;if((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1){return 1;}memset((void *)&addr, 0x00, sizeof(addr));addr.sin_family = AF_INET;addr.sin_addr.s_addr = htonl(INADDR_ANY);addr.sin_port = htons(PORT_NUM);addrlen = sizeof(addr);if(bind(sockfd, (struct sockaddr *)&addr, addrlen) == -1){return 1;}while(1){addrlen = sizeof(cliaddr);recvfrom(sockfd, (void *)&rdata, sizeof(rdata), 0, (struct sockaddr *)&cliaddr, &addrlen);printf("Client Info : %s (Port : %d)\n", inet_ntoa(cliaddr.sin_addr), ntohs(cliaddr.sin_port));printf("[%s] said : %s \n",rdata.name ,rdata.buf);memset(rdata.buf, 0x00, sizeof(rdata.buf));sscanf(ans, "%s", rdata.buf);rdata.buf[strlen(rdata.buf)-1] = '\n';sendto(sockfd, (void *)&rdata, sizeof(rdata), 0, (struct sockaddr *)&cliaddr, addrlen);}return 1;}cs Client.c
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172#include <sys/types.h>#include <sys/stat.h>#include <sys/socket.h>#include <unistd.h>#include <stdio.h>#include <string.h>#include <netinet/in.h>#include <arpa/inet.h>#define PORT_NUM 20046#define MAXLEN 256struct usr_data{char name[256];char buf[MAXLEN];};int main(int argc, char **argv){int sockfd;struct sockaddr_in addr;struct usr_data sdata, recvaddr;char msg[MAXLEN];socklen_t addrlen;if (argc != 2){printf("Usage : %s [ipaddress]\n", argv[0]);return 1;}if ( (sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1 ){return 1;}memset((void *)&addr, 0x00, sizeof(addr));memset((void *)&sdata, 0x00, sizeof(sdata));addr.sin_family = AF_INET;addr.sin_addr.s_addr = inet_addr(argv[1]);addr.sin_port = htons(PORT_NUM);printf("Input your name \n");// input user namefgets(sdata.name, MAXLEN, stdin);sdata.name[strlen(sdata.name)-1] ='\0';printf("If you want to quit, input \"quit\"\n");while(1){memset(sdata.buf, 0x00, MAXLEN);printf("> ");fgets(sdata.buf, sizeof(msg), stdin);if(strncmp(sdata.buf, "quit\n",5) == 0){break;}addrlen = sizeof(addr);sendto(sockfd, (void *)&sdata, sizeof(sdata), 0, (struct sockaddr *)&addr, addrlen);memset(sdata.buf, 0x00, MAXLEN);recvfrom(sockfd, (void *)&sdata, sizeof(sdata), 0, (struct sockaddr *)&recvaddr, &addrlen);printf("Server : %s", sdata.buf);}close(sockfd);}cs
실행결과
Server Client 123456$ ./serverClient Info : 127.0.0.1 (Port : 49766)[rojae] said : hiClient Info : 127.0.0.1 (Port : 49766)[rojae] said : i'm rojaecs
12345678$ ./client 127.0.0.1Input your namerojaeIf you want to quit, input "quit"> hiServer : SUCCES> i'm rojaeServer : SUCCEScs ※ 본 글은 개인 포트폴리오 혹은 공부용으로 사용하기 때문에, 무단 복사 유포는 금지하지만, 개인 공부 용도로는 얼마든지 사용하셔도 좋습니다
반응형