ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 구조체를 이용한 UDP 통신
    C_C++ 프로그래밍/UDP 2019. 5. 29. 00:35

     


    소스코드

     

    Sever.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
    60
    #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 256  
     
    struct 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, 0x00sizeof(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, 0x00sizeof(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

    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
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    #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 256 
     
    struct 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, 0x00sizeof(addr));
            memset((void *)&sdata, 0x00sizeof(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 name
            fgets(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
    1
    2
    3
    4
    5
    6
    $ ./server 
    Client Info : 127.0.0.1 (Port : 49766)
    [rojae] said : hi
     
    Client Info : 127.0.0.1 (Port : 49766)
    [rojae] said : i'm rojae
    cs



    1
    2
    3
    4
    5
    6
    7
    8
    $ ./client 127.0.0.1
    Input your name 
    rojae
    If you want to quit, input "quit"
    > hi
    Server : SUCCES
    > i'm rojae 
    Server : SUCCES
    cs

     

     

     

     

     

     

     

     

     

     

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

     

     

     

    반응형
Designed by Tistory.