티스토리 뷰



* 본 포스팅은 한국소프트웨어진흥원 출처의 리눅스 네트워크 프로그래밍 PDF 파일을 토대로 작성되었습니다.

* 개인공부 후 자료를 남기기 위한 목적임으로 내용 상에 오류가 있을 수 있음을 밝힙니다.




소켓 프로그래밍으로 간단한 TCP 클라이언트 프로그램을 만들어보겠습니다.


해당서버에서 daytime 서비스가 구동 중이면, 서버시간을 받아 올 수 있는 프로그램입니다.


daytime 서비스는 xinetd 네트워크 서비스 내에서 찾을 수 있습니다.



tcp_daytime.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
/*
daytime 클라이언트 프로그램이 실행되기 위해서는
서버쪽에서 xinetd의 daytime이 구동하고 있어야한다.
coder YoWu
*/
 
#include "stdio.h"
#include "sys/types.h"
#include "sys/socket.h"
#include "netinet/in.h"
 
#define BUF_LEN 128
 
void main(int argc, char *argv[])
{
        int s, n;
        char *haddr;
        struct sockaddr_in server_addr;
        //struct sockaddr_in server_addr : 서버의 소켓주소 구조체
        char buf[BUF_LEN+1];
 
        if(argc != 2)
        {
                printf("usage : %s ip_Address\n", argv[0]);
                exit(0);
        }
        haddr = argv[1];
 
        if((s = socket(PF_INET, SOCK_STREAM, 0)) < 0)
        {//소켓 생성과 동시에 소켓 생성 유효검사
                printf("can't create socket\n");
                exit(0);
        }
 
        bzero((char *)&server_addr, sizeof(server_addr));
        //서버의 소켓주소 구조체 server_addr을 NULL로 초기화
 
        server_addr.sin_family = AF_INET;
        //주소 체계를 AF_INET 로 선택
        server_addr.sin_addr.s_addr = inet_addr(argv[1]);
        //32비트의 IP주소로 변환
        server_addr.sin_port = htons(13);
        //daytime 서비스 포트 번호
 
        if(connect(s, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0)
        {//서버로 연결요청
                printf("can't connect.\n");
                exit(0);
        }
 
        while((n = read(s, buf, BUF_LEN)) > 0)
        {//서버가 보내오는 daytime 데이터의 수신
                buf[n] = NULL;
                printf("%s", buf);
        }
 
        close(s);
        //사용이 완료된 소켓을 닫기
}


소스코드를 보면 대부분이 서버에 대한 정보를 설정하거나 연결수립을 위한 코드이고


실제로 데이터를 받아와서 처리하는 부분은 while문 내부(50~54 line) 임을 알 수 있습니다.


실제로 포트번호만 맞으면 while문 내부의 소스만 수정하고 

전혀 다른 프로그램을 만들어 볼 수도 있겠네요(이렇게 2탕..3탕..)



실행결과



제가 아는 서버중에서는 daytime을 돌리는 서버가 없어


개인 VM 서버에서 daytime을 서비스에 올리고 localhost로 접속했습니다.


잘 되네요.


저작자 표시 비영리 변경 금지
신고
공유하기 링크
태그 클라우드
, , , ,
프로필사진

Yowu (Yu Yongwoo)

My MBTI type is ENTP. (Of course I do not believe it 100%, but I want to do that) I use Node.js to develop the backend. I use Ubuntu Linux as my development environment, and I love Vim. I am interested in open source and are keen to contribute. I have a bachelor's degree in computer science from Catholic University and now a software engineer at Plating Inc., I spent about 5 years developing and learning, and I am still interested in software development and culture. Recently, I am interested in React, Serverless structure, Domain Design Driven. Sometimes I play drums in the band.