ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 매우 단순한 TCP 프로그램
    C_C++ 프로그래밍/TCP_IP 2019. 5. 20. 04:45

    처음으로 공부를 하면서 대강 만들어본 채팅 프로그램

    양방향 통신은 아니다.


    Server가 어떤 특정한 포트를 타고 들어오는 상대의 IP를 알 수 있도록 만들었다.

    Client는 Server에 이동한 이후에, (서버와 대화는 못 하지만.. ) 혼자 한 말을 다시 받는다.





    실행 화면

    개발 환경 : Linux (vi)

    Server

     Client

    1
    2
    3
    4
    $ ./server 0000
     
    $ ./server 8918
    New Client Connect: 127.0.0.1
    cs

     

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    $ ./client
    connect error : : Connection refused
     
    $ ./client
    connect error : : Connection refused
     
    $ fuser 0000/tcp
    0000/tcp:             1900  6007
     
    $ ./client
    hi
    READ : hi
    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
    #include <sys/socket.h>
    #include <sys/stat.h>
    #include <arpa/inet.h>
    #include <stdio.h>
    #include <string.h>
     
    #define MAXBUF 1024
    int main(int argc, char **argv)
    {
            int server_sockfd, client_sockfd;
            int client_len, n;
            char buf[MAXBUF];
            struct sockaddr_in clientaddr, serveraddr;
            client_len = sizeof(clientaddr);
            if ((server_sockfd = socket (AF_INET, SOCK_STREAM, IPPROTO_TCP )) == -1)
            {
                    perror("socket error : ");
                    exit(0);
            }
            bzero(&serveraddr, sizeof(serveraddr));                 // 0으로 바이트 스트림 초기화
            serveraddr.sin_family = AF_INET;
            serveraddr.sin_addr.s_addr = htonl(INADDR_ANY);         // INADDR_ANY는 자기 자신을 뜻한다.
            serveraddr.sin_port = htons(atoi(argv[1]));             // 포트번호 
     
            bind (server_sockfd, (struct sockaddr *)&serveraddr, sizeof(serveraddr));
            listen(server_sockfd, 5);
     
            while(1)
            {
                    memset(buf, 0x00, MAXBUF);
                    client_sockfd = accept(server_sockfd, (struct sockaddr *)&clientaddr,&client_len);
                    printf("New Client Connect: %s\n", inet_ntoa(clientaddr.sin_addr));
                    if ((n = read(client_sockfd, buf, MAXBUF)) <= 0)
                    {
                            close(client_sockfd);
                            continue;
                    }
                    if (write(client_sockfd, buf, MAXBUF) <=0)
                    {
                            perror("write error : ");
                            close(client_sockfd);
                    }
                    close(client_sockfd);
            }
            close(server_sockfd);
            return 0;
    }
     
    cs




    Client.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
    #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);
            read(0, buf, MAXLINE);          // 키보드의 입력을 기다린다.
     
            if(write(server_sockfd, buf, MAXLINE) <= 0)     // 입력받은 데이터를 서버에 전송
            {
                    perror("wrtie error : ");
                    return 1;
            }
     
            memset(buf, 0x00, MAXLINE);
     
            // 서버로 부터 데이터를 읽는다.
            if(read(server_sockfd, buf, MAXLINE) <= 0){
                    perror("read error : ");
                    return 1;
            }
     
            close(server_sockfd);
            printf("READ : %s ", buf);
            return 0
    }
    cs

    윈도우에서는 실행이 불가능하다.


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


    반응형
Designed by Tistory.