분류 전체보기
-
LANShare 파일 전송 프로토콜 구축 - 프로토콜 정립토이프로젝트/LANShare 2023. 2. 5. 20:52
일반적으로 소켓통신을 하더라도, 송신자가 Send(..) 를 하더라도 해당 내용이 바로 원하는 클라이언트에게 전송되는게 아니라, 송신 버퍼에 저장이 되었다가 어느정도 쌓인 경우 전달한다. 수신자가 Recv(..) 를 하더라도 수신버퍼에 쌓여있는 데이터를 읽어온다. 그렇다면 수신자가 어떤 행위를 해야할까? 라는 생각을 했을 때 다음과 같은 생각이 들었다. 1. 송신자, 수신자가 둘 다 처음 받는 8바이트는 메타데이터 정보이다. 2. 인지를 하고 있다면 해당 메타데이터의 정보를 보고 원하는 데이터만큼 수신을 한다. 이 상태라면 원하는 데이터를 다 받을 수 있을 것 같았다. 위 그림과 같이 명령어 정보와 수신해야할 데이터의 크기 정보만 보내 후에 원래 보내고자 했던 데이터를 잘라서 보내던 통으로 보내던 계속해..
-
LANShare 파일 전송 프로토콜 구축 - 문제점 발생토이프로젝트/LANShare 2023. 1. 27. 19:27
이전에 설계 했던 프로토콜의 문제점이 한가지 있다. 이런 형태로 정보를 송신할 경우 다음과 같은 문제가 생긴다. 데이터를 보내는건 좋은데, 문제점이 소켓 내부적으로 처리하는 방법이 다르다. TCP 통신에서는 Application이 메세지를 보낸다고(Send) 하더라도 바로 전송되는 것이 아니다. 소켓 버퍼(Send Socket Buffer) 라는 버퍼에 쌓인 후 적절한 시기에 상대방에세 메세지가 전송되고 버퍼가 지워진다. 받는쪽에서도 마찬가지로 메세지가 오면 일단, 소켓버퍼에 저장된 후 Application에서 Read 함수를 호출 할 때 소켓 버퍼에 쌓인 메세지를 읽어들인다. 그럼 저런식으로 보낸 메세지가 만약 8바이트라고 가정해보자. 1. 앞에 4바이트는 명령어 정보 2. 뒤에 4바이트는 추가적인 정..
-
LANShare 파일 전송 프로토콜 구축토이프로젝트/LANShare 2023. 1. 23. 22:41
LANShare 파일 전송 프로토콜 구축 내용 의미 있는 파일이 생성되는 순서는 다음과 같다. 빈 파일을 생성한다. 파일에 데이터를 추가한다. 파일이 의미있는 파일이 되기 위해서는 위와 같은 과정을 거쳐야한다. CreateFile을 통해 저장될 파일을 생성한다. (이때 CreateFile이 호출이 된 시점에서의 파일 크기는 0바이트 이다.) 이후, WriteFile을 사용하여, 이전에 생성된 파일에 데이터를 추가한다. 모든 데이터를 추가한 경우 비로소 유효한 파일이 된다. 서버와 클라이언트의 관점에서 보면 다음과 같다. 서버는 P2P에 접속된 클라이언트에게 파일생성하라는 명령을 보낸다. 이때, 클라이언트는 데이터를 받았을 때, 이 데이터가 어떤 데이터 인지는 모른다. 그러므로, 미리 정의된 프로토콜을 기..
-
LANShare 프로젝트 소개토이프로젝트/LANShare 2023. 1. 23. 20:16
이 프로젝트는 다음과 같은 사례에서 시작되었습니다. 일반적으로 대학교에서는 새로운 프로그램을 도입할 경우, 해당 프로그램을 사람이 직접 설치를 해야합니다. 하지만, 이러한 방식은 상당히 레거시합니다. 반복적이며 불필요한 시간을 할애해야 합니다. 더욱 스마트하고, 간편한 방법을 사용할 수 있어야합니다. 만약, 어떠한 파일을 받기위해, 누군가가 직접 다음 강의를 위해 프로그램을 삭제하거나 재설치하는 번거로움이 존재해서는 안됩니다. 이러한 부분을 최소화 하기 위해, FTP 서버를 열고 많은 클라이언트가 접속해서 파일을 받아간다면 어떨까요? 하지만, 이러한 방법은 1가지일을 100번반복하기 위해 적은인원이 하기에는 상당히 번거롭습니다. 그렇다면, LANShare 프로젝트를 통해, 클라이언트 PC들의 전원을 키고..
-
C/C++ 콘솔창에서 커서를 변경해보자 (GetConsoleScreenBufferInfo, SetConsoleCursorPosition)프로그래밍/C/C++ 2023. 1. 19. 09:40
콘솔창에서 메뉴 입력을 받는 영역을 만들고 커서를 제어하여 특정 위치에서 입력을 받게 하고자했다. 위에 이미지와 같이 이미 명령어를 소개하고, 입력값을 소개 테이블 안에서 작성을 하고 싶었다. 일반적으로 콘솔 커서 관련 키워드로 찾아보다가 다음과 같은 코드를 찾을 수 있었다. COORD Cur; CONSOLE_SCREEN_BUFFER_INFO a; // 현재 커서 정보를 가져온다 GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &a); Cur.X = a.dwCursorPosition.X; Cur.Y = a.dwCursorPosition.Y; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), C..
-
Spring Boot 테스트코드 동작시 CommandLineRunner 중복 문제프로그래밍/Spring Boot 2023. 1. 9. 22:54
Spring Boot 에서 테스트코드를 작성하다가 다음과 같은 문제가 발생했다. 테스트 코드 내, @SpringBootTest, @ContextConfiguration 을 사용하여, 테스트코드를 작성해야하는 상황이 생겼는데, 이때 CommandLineRunner의 구현체를 만들어서 @Component 와 함께 사용하는 코드들이 있었다. 이 코드들을 그대로 다 @Component 를 주석처리 해주기에는 너무 부담이였다. 그래서 자료를 찾아봤는데 다음과 같은 레퍼런스를 찾을 수 있었다. https://www.baeldung.com/spring-junit-prevent-runner-beans-testing-execution 방법은 간단하다, CommandLineRunner의 구현체 부분에, @Profile("..
-
C/C++ Struct Memory Padding프로그래밍/C/C++ 2022. 12. 28. 10:53
C언어 기반으로 Struct를 사용하여 구조체를 생성 했을 경우 다음과 같은 문제를 본적이 있을 것이다. 일반적으로 내가 할당한(할) 타입의 메모리 크기를 보기위해 다음과 같은 코드를 작성한다. #include struct MyStruct { char ch; // 1바이트 char * pCh; // 4바이트 int integer; // 4바이트 }; int main() { struct MyStruct custom_type; size_t size = sizeof(custom_type); printf("Size [%d]Byte ", size); } 구조체를 만들고 해당 구조체의 크기를 알아보기 위해 sizeof(struct MyStruct) 또는 sizeof(custom_type) 을 할시 해당 구조체의 할..