반응형

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
입력 : 메시지 입력
출력 : 메시지 입력
반응형