From 3e8342b01c1e72efb561ce61bc1061b9be1565c6 Mon Sep 17 00:00:00 2001 From: falconlee236 Date: Sun, 7 Jul 2024 05:16:40 +0000 Subject: [PATCH] add make re code --- Dockerfile | 4 ++-- README.md | 39 ++++++++++++++++++++++++++++++++++++--- src/main.cpp | 30 ++++++++++++++++++++++++++---- start.sh | 5 ----- 4 files changed, 64 insertions(+), 14 deletions(-) delete mode 100644 start.sh diff --git a/Dockerfile b/Dockerfile index a168f18..3a43e75 100644 --- a/Dockerfile +++ b/Dockerfile @@ -10,6 +10,6 @@ RUN apt-get -qq update\ COPY . /usr/src/irc_server/ -RUN chmod +x start.sh +RUN make re -CMD [ "./start.sh" ] \ No newline at end of file +CMD [ "./ircserv", "3000", "a" ] \ No newline at end of file diff --git a/README.md b/README.md index 6c14c70..cfedb32 100644 --- a/README.md +++ b/README.md @@ -2,14 +2,47 @@ IRC Webserver based RFC1459 -### docker 접속 방법 +## docker 명령어 정리 +### docker image build ```bash docker build --rm -t irc_server . -docker run -p 3000:3000 irc_server ``` + +### docker image run +```bash +docker run -d -p 3000:3000 irc_server +``` +d를 붙이면 컨테이너를 백그라운드로 실행한다. + + +### docker container stop +```bash +docker stop $(container name) +``` + +### docker container restart +```bash +docker restart $(container name) +``` + ### docker 실행중인거 삭제 방법 ```bash docker rm -f $(docker ps -qa) ``` -`docker ps -qa`는 현재 실행하는 모든 컨테이너의 id를 출력 \ No newline at end of file +`docker ps -qa`는 현재 실행하는 모든 컨테이너의 id를 출력 + +### docker image 전체 삭제 +```bash +docker rmi -f $(docker ps -qa) +``` + +### docker dangling image 전체 삭제 (none 뜨는 이미지) +```bash +docker image prune +``` + +### docker image 확인 +```bash +docker images +``` \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index 849eeac..f021ca5 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,11 +1,25 @@ #include #include #include +#include #include #include #include // inet_ntoa -int main(void){ +int main(int ac, char **av){ + if (ac != 3) { + std::cerr << "Invalid argument, need 2 arguments" << "\n"; + std::cerr << "1st: Port number, 2nd: password" << "\n"; + exit(1); + } + + std::istringstream iss(av[1]); + int PORT; + iss >> std::noskipws >> PORT; + if (!iss.eof() || iss.fail() || PORT <= 0 || PORT > 65535){ + std::cerr << "error!\n"; + exit(1); + } /* //SECTION domain - AF_INET = ipv4, @@ -28,7 +42,7 @@ int main(void){ // NOTE - INADDR_ANY 자신의 모든 랜카드로 ip를 받을 수 있음. server_addr.sin_addr.s_addr = htonl(INADDR_ANY); // NOTE - Server ip의 PORT번호 지정 - server_addr.sin_port = htons(3000); + server_addr.sin_port = htons(PORT); // NOTE - socket과 ip를 연경하는 작업 int binded = bind(server_socket, (struct sockaddr *)&server_addr, sizeof(server_addr)); @@ -42,6 +56,8 @@ int main(void){ if (binded != 0) { std::cerr << "bind error!" << "\n"; exit(1); + } else { + std::cout << "irc server is running on port: " << PORT << "\n"; } while(1) { @@ -52,10 +68,16 @@ int main(void){ std::cerr << "get client socket error!" << "\n"; exit(1); } - + std::string client_ip = std::string(inet_ntoa(client_addr.sin_addr)); + int client_port = ntohs(client_addr.sin_port); + std::cout << "client " << client_ip << ":" << client_port << " conneted\n" << "\n"; while(1){ char buffer[1024] = { 0, }; - recv(client_socket, buffer, sizeof(buffer), 0); + ssize_t recv_byte = recv(client_socket, buffer, sizeof(buffer), 0); + if (recv_byte == 0) { + std::cout << "client " << client_ip << ":" << client_port << " is leaved" << "\n"; + break; + } std::cout << "received! : " << buffer << "\n"; std::string msg = buffer; diff --git a/start.sh b/start.sh deleted file mode 100644 index 524c12b..0000000 --- a/start.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/sh - -make re -ls -./ircserv \ No newline at end of file