반응형
Client
// -----------------------------------
// 파일명:udp_echocli.c
// 기 능 :에코 서비스를 요청하는 UDP(비연결형) 클라이언트
// 컴파일:gcc udp_echocli.c -p udp_echocli
// 사용법:./udp_echocli IP_Address Port_Number
// -----------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#define MAXLINE 511
int main(int argc, char *argv[]){
struct sockaddr_in servaddr;
int s, nbyte, addrlen = sizeof(servaddr);
char buf[MAXLINE+1];
if(argc != 3){
printf("Usage: %s ip_address port_numer\n", argv[0]);
exit(0);
}
if((s=socket(PF_INET, SOCK_DGRAM, 0)) < 0){
perror("socket fail");
exit(0);
}
// 에코 서버의 소켓주소 주고체 작성
bzero((char *)&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = inet_addr(argv[1]);
servaddr.sin_port = htons(atoi(argv[2]));
// 키보드 입력 받음
printf("입력: ");
if(fgets(buf, MAXLINE, stdin) == NULL){
printf("fgets 실패");
exit(0);
}
// 에코 서버로 메시지 송신
if(sendto(s, buf, strlen(buf), 0, (struct sockaddr *)&servaddr, addrlen) < 0){
perror("sendto fail");
exit(0);
}
// 수신된 에코 메시지
if((nbyte=recvfrom(s, buf, MAXLINE, 0, (struct sockaddr *)&servaddr, &addrl en)) < 0){
perror("recevfrom fail");
exit(0);
}
buf[nbyte] = 0;
printf("출력: %s\n", buf);
close(s);
return 0;
}
Server
// -----------------------------------
// 파일명:udp_echoserv.c
// 기 능 :에코 서비스를 수행하는 서버
// 컴파일:gcc udp_echoserv.c -o udp_echoserv
// 사용법:./udp_echoserv Port_Number
// -----------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <string.h>
#include <netinet/in.h>
#define MAXLINE 511
int main(int argc, char *argv[]){
struct sockaddr_in servaddr, cliaddr;
int s, nbyte, addrlen = sizeof(struct sockaddr);
char buf[MAXLINE+1];
if(argc != 2){
printf("Usage : %s port\n", argv[0]);
exit(0);
}
// 소켓 생성
if((s=socket(PF_INET, SOCK_DGRAM, 0)) < 0){
perror("socket fail");
exit(0);
}
// servaddr을 '\0'으로 초기화
bzero((char *)&servaddr, addrlen);
bzero((char *)&cliaddr, addrlen);
// servaddr 세팅
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(atoi(argv[1]));
// bind() 호출
if(bind(s, (struct sockaddr *)&servaddr, addrlen) < 0){
perror("bind fail");
exit(0);
}
//iterative 에코 서비스 수행
while(1){
puts("Server : waiting request");
nbyte = recvfrom(s, buf, MAXLINE, 0, (struct sockaddr *)&cliaddr, &addr len);
if(nbyte < 0){
perror("recvfrom fail");
exit(1);
}
buf[nbyte] = 0;
printf("%d byte recv: %s\n", nbyte, buf);
if(sendto(s, buf,nbyte, 0, (struct sockaddr *)&cliaddr, addrlen) < 0){
perror("sendto fail");
exit(1);
}
puts("sendto complete");
}
}
실행 과정 및 결과
<Server>
$ ./udp_echoserv 2024
Server : waiting request
<Client>
$ ./udp_echocli 127.0.0.1 2024
입력 : 메시지 입력
<Server>
17 byte recv : 메시지 입력
sendto complete
Server : waiting request
<Client>
$ ./udp_echocli 127.0.0.1 2024
입력 : 메시지 입력
출력 : 메시지 입력
반응형