-
매우 단순한 TCP 프로그램C_C++ 프로그래밍/TCP_IP 2019. 5. 20. 04:45
처음으로 공부를 하면서 대강 만들어본 채팅 프로그램
양방향 통신은 아니다.
Server가 어떤 특정한 포트를 타고 들어오는 상대의 IP를 알 수 있도록 만들었다.
Client는 Server에 이동한 이후에, (서버와 대화는 못 하지만.. ) 혼자 한 말을 다시 받는다.
실행 화면
개발 환경 : Linux (vi)
Server
Client
1234$ ./server 0000$ ./server 8918New Client Connect: 127.0.0.1cs 123456789101112$ ./clientconnect error : : Connection refused$ ./clientconnect error : : Connection refused$ fuser 0000/tcp0000/tcp: 1900 6007$ ./clienthiREAD : hics Server.c
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748#include <sys/socket.h>#include <sys/stat.h>#include <arpa/inet.h>#include <stdio.h>#include <string.h>#define MAXBUF 1024int 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
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);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 윈도우에서는 실행이 불가능하다.
※ 본 글은 개인 포트폴리오 혹은 공부용으로 사용하기 때문에, 무단 복사 유포는 금지하지만, 개인 공부 용도로는 얼마든지 사용하셔도 좋습니다
반응형'C_C++ 프로그래밍 > TCP_IP' 카테고리의 다른 글
멀티쓰레드를 이용한 소켓 통신 (0) 2019.06.04 [TCP/IP] [OOB] OOB 통신에 대해서 알아보자 (0) 2019.06.04 1:1 TCP 소켓 통신 프로그램 (0) 2019.05.21 [struct rlimit] setrlimit, getrlimit... (0) 2019.05.20