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

매우 단순한 TCP 프로그램

by RoJae 2019. 5. 20.

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

양방향 통신은 아니다.


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

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


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


댓글