본문 바로가기
C_C++ 프로그래밍/UDP

구조체를 이용한 UDP 통신

by RoJae 2019. 5. 29.

 


소스코드

 

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

 

 

 

 

 

 

 

 

 

 

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

 

 

 

댓글