간단하게 1:1 TCP 소켓 통신을 하는 프로그램을 만들었다.
사실 echo 프로그램에 조금 더 추가를 하여
작성한 코드에 무한 반복문을 돌린 것이지만
하면서 더더욱 익숙해질 것 같다.
Server |
Client |
||||||
|
|
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 |
※ 본 글은 개인 포트폴리오 혹은 공부용으로 사용하기 때문에, 무단 복사 유포는 금지하지만, 개인 공부 용도로는 얼마든지 사용하셔도 좋습니다
'C_C++ 프로그래밍 > TCP_IP' 카테고리의 다른 글
멀티쓰레드를 이용한 소켓 통신 (0) | 2019.06.04 |
---|---|
[TCP/IP] [OOB] OOB 통신에 대해서 알아보자 (0) | 2019.06.04 |
[struct rlimit] setrlimit, getrlimit... (0) | 2019.05.20 |
매우 단순한 TCP 프로그램 (0) | 2019.05.20 |
댓글