-
1:1 TCP 소켓 통신 프로그램C_C++ 프로그래밍/TCP_IP 2019. 5. 21. 23:00
간단하게 1:1 TCP 소켓 통신을 하는 프로그램을 만들었다.
사실 echo 프로그램에 조금 더 추가를 하여
작성한 코드에 무한 반복문을 돌린 것이지만
하면서 더더욱 익숙해질 것 같다.
Server
Client
12345678910$ ./server 8918새로운 클라이언트 전속 IP : 127.0.0.1IP : 127.0.0.1 : hiIP : 127.0.0.1 : manIP : 127.0.0.1 : Welcomecs 12345678910$ ./clienthiServer : SUCCESSmanServer : SUCCESSWelcomeServer : SUCCESScs Server.c
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859#include<sys/socket.h>#include<sys/stat.h>#include<arpa/inet.h>#include<stdio.h>#include<string.h>#define MAXLINE 1024int 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
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758#include<sys/socket.h> // 소켓 관련 함수#include<arpa/inet.h> // 소켓 지원을 위한 각종 함수들#include<sys/stat.h> // 파일 정보를 담고 있는 함수#include<stdio.h> // C언어 문법 사용#include<string.h> // 문자열 사용#include<unistd.h> // 시스템 함수 사용#define MAXLINE 1024int main(int argc, char **argv){struct sockaddr_in serveraddr;int server_sockfd;int client_len;char buf[MAXLINE];// TCP protocol -> Errorif((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