목록분류 전체보기 (365)
작업환경의 디렉터리를 압축하여 전송하는 로직을 만들었다.개발 환경이나 버전에 따라 안 되는 기능들이 너무 많아 힘들었다.결국 우분투 22.04버전에서 다시 코드를 구현하기로 했다. 여러 압축 라이브러리가 있었지만 g++ 버전 및 작업 환경에 따라 오류가 발생하고정보량이 많지가 않아서 zip.h를 이용하기로 했다. 인자값이 많이 줄었다.zip.h을 위한 -lzip을 추가해 준다. #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define PORT 8080#define BUFFER_SIZE 1024using ..
간단한 txt파일을 전송해 보았다. void *clientHandler(void *newsocket){ int new_socket = *((int *)newsocket); char buffer[BUFFER_SIZE]; string str_buffer; int valread = recv(new_socket, buffer, BUFFER_SIZE, 0); str_buffer = string(buffer, valread); ifstream input_file("/home/sj/share_file_project/root_file_dir/secret.txt", ios::in | ios::binary); if(str_buffer == "1234") { while..
집에서 다른 컴퓨터와 소켓통신을 가능하게 만들어줄 것이다.이를 통해 개발내용 업데이트 사항을 다른 PC에 쉽게 전달할 수 있는 환경을 만들어주는 게 목표이다. 먼저 네트워크 설정을 해주어야 한다. VMware는 Edit에서 수정을 해준다.Bridged를 통해 가상머신의 IP를 공유기에 다이렉트로 연결해 준다.즉 host IP와 동일선상의 위치에 서있게 만들어준다. 그 후 우분투의 네트워크 설정을 Bridged로 선택해 준다.클라이언트도 이와 동일하게 해 준다.. IP가 바뀌었다. 이제 연결이 잘되는지 확인하기 위해서버의 코드를 수정해 주었다. while(true) { struct sockaddr_in client_addr; int client_addrlen = sizeof..
멀티스레드를 적용해 본다.linux에서는 스레드 코드를 디버깅할 때는 인자값을 추가해주어야 한다. tasks.json에 args에 -lpthread 인자값을 추가해 준다. #include #include #include #include #include #include #include #include #include #include #define PORT 8080#define BUFFER_SIZE 1024using namespace std;void *clientHandler(void *newsocket){ int new_socket = *((int *)newsocket); char buffer[BUFFER_SIZE]; string str_buffer; int valread = rec..
이번에는 파일 내용을 입력받아 전송해 보기로 한다.디렉터리에 미리 만든 파일을 집어넣고해당 디렉터리는 root만 접속하게 권한설정을 해둔 상태이다. chmod 700으로 통해 디렉터리 권한을 변경하고chown으로 소유자를 root로 바꾸어버렸다. 그리고 디렉터리에 secret.txt을 만들었다. 추가된 서버 코드를 보면생성되는 서버 바이너리파일의 권한설정을 해서 다른 사용자가 접근을 못하게 한다.디버깅마다 새롭게 파일이 생성돼서 시스템 명령어로 넣어버렸다.비밀번호가 맞을 때 secret.txt의 내용을 읽어와 클라이언트에게 전송한다. 일반 사용자가 서버 파일을 실행한들 권한이 없어 secret.txt의 문자열을 전송할 수 없다.root권한만 가능하다.물론 다른 취약점으로 실행할 수도 있겠지만이번에..
연습을 위해서 다양하게 코드를 수정해 본다. 1. 자신이 입력한 것을 전송하기클라이언트의 코드이다.message에 입력을 받아 send로 서버에 전송해 준다. message.data()가 아닌 message.c_str()로 전송하는 게 더욱 안전하다고 한다.string타입일 때는 c스타일로 변환해서 전송을 해야 한다. 2. 클라이언트에게 받은 문자열을 뒤집어서 다시 전송하기recv로 buffer에 문자열을 담고 string으로 바꾸어준다.문자열을 뒤집고 다시 클라이언트에게 전송한다.한 번에 string 객체로 받는 방법이 없어임시 buffer로 받은 다음에 변환해주어야 한다.참고고 recv()의 리턴값은 문자열 수신에 성공할 시 그의 길이를 받게 된다. 3. 비밀번호 입력에 따른 문자열 수신받기클..
클라이언트의 코드를 분석해 본다. #include #include #include #include #include #include #include #define PORT 8080#define BUFFER_SIZE 1024int main() { int sock = 0; struct sockaddr_in serv_addr; char buffer[BUFFER_SIZE] = {0}; // 소켓 파일 디스크립터 생성 if ((sock = socket(AF_INET, SOCK_STREAM, 0)) 전체 코드이다. // 소켓 파일 디스크립터 생성 if ((sock = socket(AF_INET, SOCK_STREAM, 0)) 이 부분은 전 서버와 같이socket()을 이용해..
이번에는 연습으로 c++로 소켓 프로그램을 구현해보려 한다.c++로는 처음 구현해 보아 gpt의 힘을 빌려공부를 진행하기로 했다. 결과부터 확인을 해보면 이게 서버의 결과 이건 클라이언트의 결과이다. 서버의 코드부터 분석을 진행해본다.#include #include #include #include #include #include #include #define PORT 8080#define BUFFER_SIZE 1024using namespace std;int main() { int server_fd, new_socket; struct sockaddr_in address; int addrlen = sizeof(address); char buffer[BUFFER_SIZ..