ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 1:1 TCP 소켓 통신 프로그램
    C_C++ 프로그래밍/TCP_IP 2019. 5. 21. 23:00


    간단하게 1:1 TCP 소켓 통신을 하는 프로그램을 만들었다.

    사실 echo 프로그램에 조금 더 추가를 하여

    작성한 코드에 무한 반복문을 돌린 것이지만

    하면서 더더욱 익숙해질 것 같다.


    Server

    Client

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $ ./server 8918
     
    새로운 클라이언트 전속 IP : 127.0.0.1
     
    IP : 127.0.0.1 : hi
     
    IP : 127.0.0.1 : man
     
    IP : 127.0.0.1 : Welcome
     
    cs
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $ ./client
     
    hi
    Server : SUCCESS 
     
    man
    Server : SUCCESS 
     
    Welcome
    Server : SUCCESS 
    cs



    Server.c

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    #include<sys/socket.h>
    #include<sys/stat.h>
    #include<arpa/inet.h>
    #include<stdio.h>
    #include<string.h>
     
    #define MAXLINE 1024
     
    int main(int argc, char **argv)
    {
        int server_sockfd, client_sockfd;
        int client_len, n;
        char buf[MAXLINE];
        char *ans = "SUCCESS";
     
        struct sockaddr_in clientaddr, serveraddr;
        client_len = sizeof(clientaddr);
     
        if((server_sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP )) == -1){
            perror("서버 소켓 에러 : ");
            exit(0);
        }
        
        bzero(&serveraddr, sizeof(serveraddr));
        serveraddr.sin_family = AF_INET;
        serveraddr.sin_addr.s_addr = htonl(INADDR_ANY);
        serveraddr.sin_port = htons(atoi(argv[1]));
     
        if( bind(server_sockfd, (struct sockaddr *&serveraddr, sizeof(serveraddr)) == -1 ){
            printf("Bind error : ");
            exit(1);        
        }
     
        if( listen(server_sockfd, 5== -1){
            printf("Listen error : ");
            exit(1);
        }
     
        if((client_sockfd = (accept(server_sockfd, (struct sockaddr *&clientaddr, &client_len))) > 0){
                printf("새로운 클라이언트 전속 IP : %s\n",inet_ntoa(clientaddr.sin_addr));
        }
        
        while(1){
                if(client_sockfd == -1){
                printf("client connection fail");
                exit(1);
            }
            memset(buf, 0x00, MAXLINE);
            read(client_sockfd, buf, MAXLINE);    // 클라이언트의 데이터를 수신한다 (대기모드)
            printf("IP : %s : %s \n",inet_ntoa(clientaddr.sin_addr), buf);
            
            memset(buf, 0x00, MAXLINE);
            
            write(client_sockfd, ans, 8);
        }
        close(client_sockfd);
        close(server_sockfd);
        return 0;
    }
    cs



    Client

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    #include<sys/socket.h>  // 소켓 관련 함수
    #include<arpa/inet.h>   // 소켓 지원을 위한 각종 함수들
    #include<sys/stat.h>    // 파일 정보를 담고 있는 함수
    #include<stdio.h>       // C언어 문법 사용
    #include<string.h>      // 문자열 사용
    #include<unistd.h>      // 시스템 함수 사용
     
    #define MAXLINE 1024
     
    int main(int argc, char **argv){
            struct sockaddr_in serveraddr;
            int server_sockfd;
            int client_len;
            char buf[MAXLINE];
     
            // TCP protocol -> Error
            if((server_sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1){
                    perror("Error : ");
                    return 1;
            }
     
        // 연결을 요청할 서버 주소와 포트번호 프로토콜등을 지정
            server_sockfd = socket(AF_INET, SOCK_STREAM, 0);        // 요청할 서버 구조
            serveraddr.sin_family = AF_INET;                        // 요청할 서버의 도메인
            serveraddr.sin_addr.s_addr = inet_addr("127.0.01");     // host back!
            serveraddr.sin_port = htons(8918);
     
            client_len = sizeof(serveraddr);
     
            // 서버에 연결을 시도하자
            // connect (소켓 디스크립터, 서버 주소 정보에 대한 포인터, 포인터가 가르키는 구>조체 크기)
            // (struct sockaddr *)은 오버로딩을 위해서 사용함
            if(connect(server_sockfd, (struct sockaddr *&serveraddr,client_len) == -1){
                    perror("connect error : ");
                    return 1;
            }
            memset(buf, 0x00, MAXLINE);
        
        while(1)
        {    
                memset(buf,0x00,MAXLINE);
                read(0, buf, MAXLINE);          // 키보드의 입력을 기다린다.
        
            if(write(server_sockfd, buf, MAXLINE) <= 0)     // 입력받은 데이터를 서버에 전송
                {
                        perror("wrtie error : ");
                        return 1;
                }
            if((read(server_sockfd, buf, MAXLINE)) < 0){
                perror("read error : ");
                return 1;
            }
            printf("Server : %s \n",buf);
        }
        close(server_sockfd);
        return 0;
    }
     
    cs



    ※ 본 글은 개인 포트폴리오 혹은 공부용으로 사용하기 때문에, 무단 복사 유포는 금지하지만, 개인 공부 용도로는 얼마든지 사용하셔도 좋습니다


    반응형
Designed by Tistory.