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

1:1 TCP 소켓 통신 프로그램

by RoJae 2019. 5. 21.


간단하게 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



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


댓글