티스토리 뷰
반응형
* 본 포스팅은 한국소프트웨어진흥원 출처의 리눅스 네트워크 프로그래밍 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로 접속했습니다.
잘 되네요.
반응형
'개인공부 > 소켓 프로그래밍' 카테고리의 다른 글
리눅스 소켓 프로그래밍 09 : TCP 서버 프로그램 예제 (3) | 2014.02.17 |
---|---|
리눅스 소켓 프로그래밍 08 : TCP 서버 작성절차, 함수 (0) | 2014.02.11 |
리눅스 소켓 프로그래밍 06 : TCP 클라이언트 작성절차, 함수 (0) | 2014.02.07 |
리눅스 소켓 프로그래밍 05 : IP, 도메인 주소변환 (3) | 2014.02.03 |
리눅스 소켓 프로그래밍 04 : 소켓주소 구조체 (0) | 2014.02.02 |
리눅스 소켓 프로그래밍 03 : 디스크립터 확인 예제 (2) | 2014.02.02 |
리눅스 소켓 프로그래밍 02 : 소켓 socket() 함수 (3) | 2014.02.02 |