[C/C++] HTTP Server 요청 처리 [1] (Linux LineParser [readline])

HTTP는 기본적인 웹을 위한 프로토콜입니다. [*프로토콜 = 일종의 통신 규약] [ EX) 내가 A-A1-A2 라고 보낼 테니 처리해줘 라는 개념 ] Client -> HTTP 규약의 요청(Request) -> Server Client <- HTTP 규약의 응답(Response) <- Server 을 주고 받는 것이 기본 구조입니다. 엄청 자세한 것은 따로 책이나 문서를 찾아 보시는 것이 좋습니다. 그럼 요청을 어떤 구조로 보내야 기본적인 웹사이트에서 응답을 받을 수 있을까? 가 문제가 됩니다. 기본적인 포맷은 다음과 같습니다. EX] Naver 예 GET / HTTP/1.1\r\n Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8\r\n Accept-Encoding:gzip, deflate, sdch\r\n Accept-Language:ko-KR,ko;q=0.8,en-US;q=0.6,en;q=0.4\r\n Cache-Control:max-age=0\r\n Connection:keep-alive\r\n Cookie:npic=qkG66SYW2jtZBlXtH/Wije5Ykpf3CQP+5H+oH3ktJhsKKMuY5MFRbu1UaznPikHHCA==; NNB=22YFY2PRRCLFQ; ASID=7c3565980000015a18ebb3aa00000059; nx_ssl=2; PM_CK_rcode=04190121\r\n Host:www.naver.com\r\n Upgrade-Insecure-Requests:1\r\n User-Agent:Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36\r\n 다음과 같은 포맷을 전달 할 때 다음의 ...

제주도 자전거 여행 계획[17.04.29 ~ 17.05.03]

이미지
이번 징검 다리 휴가를 맞아... 휴가하루를 내고 제주도 자전거 여행을 가려합니다. 계획이래봣자 거창한건 없고 경로 , 근처 게스트 하우스, 자전거 대여? 정도로 계획짜려합니다. (완주하면 남다른 하체를 가지는 건지...?) [그림 출처](http://m.post.naver.com/viewer/postView.nhnvolumeNo=4272048&memberNo=472213&vType=VERTICAL} 04.29 (토) 20:30 제주 국제공항 도착 예매를 늦게해서 비행기 표가 저녁시간대 밖에 없어... 우선 도착 후, 근처 게스트하우스에서 하루를 묵고 다음날 부터 시작합니다. 근처 게스트하우스가 두개인데, 어느쪽이 공항에서 가장 가까울지 모르겠습니다. 미라클 게스트하우스 같은 경우, 평이 그렇게 좋지는 않고 B: 고추잠자리게스트하우스 인데, 연예인 오재현씨가 운영한다고 합니다. 남: 6 , 여: 6 예약만 받아서 제가 갈 때, 자리가 있을지 모르겠네요 그리고 먹방파티라고하는 파티를 하는데[필수랍니다] (오후 7 ~ 새벽 1시) 도착시간이 20:30 이라서 받아 줄지 모르겠네요. 일단은 두개의 게스트하우스를 선정합니다. 04.30 (일) 08:00  일어나 준비를 하고 대여를 하러갑니다. 반시계 방향으로 돌 예정이라 가장 가까우면서, 인터넷상 가격이 명시 된 곳으로 찾습니다. (필수 짐받이) 일단 기본적으로 준비할 사항 [스포츠 안경, 팔토시 , 자전거용 목 쿨토시, 다리토시(레깅스) , 고글, 장갑, 자전거 라이트, 우비 정도는 필요합니다] 헬멧 , 자전거, 로프, 스마트폰 거치대 정도는 대여점에서 빌릴 수 있구요 [다른 것도 빌릴 수 있긴 하지만, 가서 고르기에는 좀 애매해서..] 이후 일정...

[C&C++] fseek , ftell, lseek ,사용 정리

이미지
매번 찾아보는 게 귀찮아서 정리. 함수  int fseek(FILE * stream, long offset, int whence) 헤더  stdio.h 인자 정보 FILE *stream (파일 포인터) long offset (이동할 크기) int whence (어디서 부터 이동할지의 위치) whence의 경우, 정의된 값 혹은 상수값 사용 가능 SEEK_SET = 파일 시작 부 SEEK_CUR = 현재 파일 포인터 위치 SEEK_END = 파일 끝 반환 값 0(성공) or -1(실패) 함수  long ftell(FILE * fp) 헤더  stdio.h 인자 정보 FILE *fp (파일 포인터) 반환 값 현재 파일포인터의 위치(성공) , -1(에러) fseek + ftell을 사용하면 파일 사이즈를 구할 수 있다. fseek(fp, 0, SEEK_END); int file_size = ftell(fp); fseek(fp, 0, SEEK_SET); /* do File Work */ 함수  off_t lseek(int file_des, off_t offset, int whence) (Linux 기반) 헤더  unistd.h 인자 정보 int file_des (파일 디스크립터) off_t offset (이동할 크기) int whence (어디서 부터 이동할지의 위치) 반환 값 현재 파일포인터의 위치(성공) , -1(에러) fseek와 차이점은 FILE 포인터를 쓰냐 디스크립터를 쓰냐의 차이. 파일 Size를 구할 때, int file_size = lseek (fd , 0 , SEEK_END); /* do File Work */ 로 사용 [출처] http://forum.falinux.com/zbxe/index.php?do...

[네트워크] Quality Of Service 개념 [1]

이미지
Quality Of Service = 특정 네트워크 대역폭을 보장하는 것 정도로 정의할 수 있다. Ex] - 서버가 특정 사용자에 대해 대역폭 제어하도록 유도 하는 것 현재 기업들에서 사용하는 방법은 주로 사용량을 토대로 구분합니다. 일정 이상 사용하게 된다면, QoS를 적용하여 특정 수치의 대역폭만 사용하도록 유도하는 것이지요. 실시간으로 이것을 조절하는 기업은 못 본것 같습니다. 주로 쓰이는 QoS는 DiffServ / InterServ입니다. 1. DiffServ / InterServ 개념 및 모델 일단 결론 부터 말하면 스위치/라우터 계층에서 가능한 QoS이다. 즉, 라우터/스위치가 우선 전송을 하는 방식인데, App 레벨에서, Type of Service 라고 하는 필드에 표시만 하면 된다. IP 헤더 안, TOS 필드 마킹을 통해 전송 우선 순위를 스위치/라우터가 진행 하는 방식 InterServ의 경우  TOS 필드 중 3bit를 사용 하지만 DiffServ의 경우 TOS 필드 전체 사용 TOS 비트 위치에 따라 DS 필드 라고도 불린다. DiffServ에서는 TOS를 DSCP(DifferServ Code Point) 라고 부른다. 이를 바탕으로 동작하는 것을 PHB(Per-Hob-Behavior) , 홉 단위 동작 구분이라고 한다. 결론 부터 말하면, 대역폭 조절을 라우터 및 스위치에 맡겨버리는 형식 가장 오버헤드가 적은 걸로 알고 있다. 자세한 모델 및 알고리즘은 다음과 같다 InterServ RSVP = Reservation Protocol WFQ = 가중치 큐 장점으로 엄격한 QoS 보장 가능하며, 실시간 지원이 가능하다 (End-to-End 개념으로의 QoS) 단점으로 적용되는 스위치/라우터 모델 기준이 Ve...

[네트워크/Unix] 소켓 통신 개념

이미지
Unix 소켓 통신의 개념을 함수 별로 정리해보려 합니다. --- 1. Application에서 Socket 함수 호출 시, Kernel을 통해 Socket 기술자가 생성됩니다. --- 2. Bind, IP 혹은 Port정보를 통해, 소켓 기술자와 Application을 연결합니다. --- 3. 이후 Listen을 호출하면 해당 소켓에 대한 Back log Queue, 연결 대기 큐가 생기게 됩니다. --- 4. Client 연결 요청에 따라, Backlog Queue 에 쌓이게 됩니다. --- 5.  이후 Backlog Queue에 쌓인 Client를 FIFO 로 가져오게됩니다. 여기까지가 unix 함수를 통해 알아본 소켓 내부 동작과정입니다. 아마 거의 모든 소켓프로그래밍이 이 과정을 거치리라 생각합니다. 추가로 읽으면 좋을 것

[Unix/Linux] Thread Pool 구현 [1]

이미지
Thread Pool을 만들 일이 있어 포스팅 합니다. 일단 Event Driven 형식으로 Epoll Event가 오면, 작업을 시작하는데, Non-Block을 하려하지만 큰 파일 전송 상황을 가정하여 ThreadPool로 구현합니다. 구현을 위해서, thread 작업 클래스가 필요하며, 작업이 끝남을 알기위해, flag를 넣었습니다. 일단 기초 작업이며, 이것을 base로 작업하시면 요긴하실 것 같습니다.  우선적으로 threadPool로 사용할 클래스입니다.  작업 시 필요한 것을 class화 시키고, flag 또한 dataClass에 넣습니다. 작업이 끝남을 확인하기 위한 ch_flag Test입니다. StartService 시, false -> true로 바꾸고 do_work(thread 작업) 시 true -> false로 재변환 합니다. 그리고 endService() 에서 종료를 검사합니다. 다음은 실행 시 결과입니다. 이를 바탕으로 thread pool을 구현하겠습니다. 추가로 읽으면 좋을 것

[일상] 남산타워 여행기

이미지
10.02 (일) 개천절 기념으로 남산을 다녀왔습니다. 정자역에서 출발했는데, 1시간 넘게 걸리더군요... 갓다오니 녹초 서울 야경을 찍었습니다. 탁 트인 모습이 굉장히 좋더군요 비록 비는 왔지만... 안에 들어 갈 수 있는 건물입니다. 여기서 최상층 까지 갈수 있는데 비용은 만원정도 하더군요 (성인 기준) 입구 들어가는길 보이는 화면입니다 ㅎㅎ 되게 예쁘더군요  저도 여자친구가 생기면....ㅜ 자물쇠가 되게 많았습니다. 또한 다양한 국적의 사람들이 와서 신기하였죠 ㅎㅎ 탁 트인 남산. 한번쯤은 와보셔도 좋을 거 같네요 ㅎㅎ 순환번스 타면 금방오는거 같아요 ㅎㅎ

[Linux/Centos] Centos 설치, Putty 연동 하기

이미지
최근에 바빠서.. 따른 일을 준비 하는 바람에, 안드로이드 보다 Linux 관련 게시물을 업로드 하게 되었습니다. 일단 Centos와 Oracle Vitual Box를 설치 합니다. https://www.virtualbox.org/ 여기서 그냥 아무버전이나 받으시면 될 것같네요. 그 다음에 Centos dvd 버전을 다운 받습니다. http://isoredirect.centos.org/centos/6/isos/i386/ i386 버전인데, x86-x64 버전과는 틀립니다. 제 노트북이 OS windows 8.1, 64bix 인데, 버츄얼 박스에서 x86-x64 버전은 설치가 안되더군요. http://isoredirect.centos.org/centos/6/isos/i386/ 아마 다른 분들도 비슷하지 않을까..해서 올려둡니다. 그다음 새로 가상머신을 만듭니다. Linux - [Red-Hat 32bit] 로 설정하면 됩니다. 그 다음 설정에 들어가셔서 컨트롤러 가상 이미지 파일 iso 를 설정 해 준뒤 실행합니다. 그 다음, Putty 통신을 하려면 SSH와 Iptables를 셋팅해주어야 합니다. iptables는 방화벽 설정이고, SSH는    네트워크  상의 다른 컴퓨터에 로그인하거나 원격 시스템에서 명령을 실행하고  다른 시스템으로 파일을 복사할 수 있도록 해 주는  응용 프로그램  또는 그  프로토콜 을 가리킵니다. su 명령어를 통해 Root 계정으로 만듭니다. yum -y install openssh-server openssh-clients service sshd start 명령어를 통해 활성화 시킵니다. yum install iptables-service ...

[안드로이드] 기상청 중기예보 [1]

이미지
중기예보 측정을 안드로이드 환경에서 진행 중 입니다. 하면 할수록 열받아서 하기 싫긴 하네요.. 문제점을 한번 나열 해보겠습니다. 1. 날씨 정보와 온도정보를 나눈 것 - 같은 날임에도 불구하고 Url 요청을 두번해야합니다. 2. 중기육상예보과 중기육상온도예보의 지역코드가 틀립니다. - 중기 육상은 그렇다 치더라도, 온도의 경우 이해할 수 없는 지역코드 - 해당 도시가 없는 코드는 따로 예외처리를 해주어야함 이렇게 애매하게 할거면 그냥 중기육상예보코드랑 동일하게 가는게 맞다고 생각합니다. 최소 도 단위까지는 구분을 지어야 하는데, 위 코드에 없는 도시는 따로 개발과정에서 예외처리를 일일이 해주어야합니다. 3. 중기예보 코드를 보시면 '강원도 영서' 와 '강원도 영동'에 대한 지역코드 존재 - 문서에는 강원도 영서, 영동을 나누는 기준이 없음 - 최소 위도, 경도의 기준값이라도 제시해 줘야 한다고 생각함 - 그게 아니라도, 어떤 도시들은 영동이고 어떤 도시는 영서인지는 포함되어야 할듯 4. 동네 예보의 경우 자기들만의 위도 경도 변환식을 사용 - 문서에 나와있긴 하지만 '왜 변환을 하지?'라는 생각이 듭니다.. 기상청 API를 사용하면서 느끼는 점은 개발자한테 예외에 대해 다 떠넘기는 거 같아서 불편하네요. 어쨋든 조만간 안드로이드 기반 중기예보에 대해 포스팅 하겠습니다. 추가로 읽으면 좋을 것

[안드로이드/자바] String.replaceAll을 이용한 숫자 추출

이미지
안드로이드에서 숫자만 추출해서 쓸 일이 있어서 따로 적어두려합니다. Java 환경에서는 모두 동작할 듯 싶습니다. public static int AfterDay(String data) { String mData = ""; mData = data.replaceAll("[^0-9]", ""); Log.i(TAG, TAG + " : " + mData); return Integer.valueOf(mData); } replaceAll(string1,string2) 함수를 통해, 값을 얻어냅니다. 원래 replaceAll 은 string1의 조건이 만족하는 string을 string2로 교체하는 역활입니다. replace같은 경우, 처음만 바꾸는 등의 여러 조건이 있지만, replaceAll은 문장 전체에 해당합니다. 위의 replaceAll("[^0-9]","")는 숫자를 제외한 String을 ""로 바꾸어 줍니다. 그리고 Integer.valueOf(String)을 통해 String -> int 형으로 값 변환을 합니다. 두가지 방법이 더 있는데, String clean3 = string1 . replaceAll ( "\\D" , "" ); String clean2 = string2 . replaceAll ( "[^\\d]" , "" ); 를 통해서도 추출이 가능합니다. 정규표현식으로 알고 있는데, 자세히는 모르겠네요, 다음에 포스팅 해야겠습니다.. 위의 그림은 Input 값 wf30을 30으로 바꾸어 추출한 결과입니다. (출처 : http://stackoverflow.com/questions/6...

[안드로이드] 기상청 중기예보 [0]

이미지
기상청 OpenApi를 써서 중기예보에 대해 만들고 있는데, 아니 대체왜 API를 이런식으로 구성 했는지 이해가 안된다. OpenWeather처럼 한 날짜에 정보를 넣을 수 있을 텐데 날씨정보 & 기온 정보를 얻을려면 두번의 api요청을 해야되고, (중기육상조회[ MiddleLandWeatherRequest ]  , 중기기온조회[ getMiddleTemperatureRequest ] 두번) 심지어 10일 치 날씨라고 해놓고 현재부터 3일 뒤의 날씨를 알려준다. (오늘이 13일 이라면, 16일 날씨부터 23일 날씨까지 알려줌) 도대체 왜??? 그럼 다음날,다다음날은? 만들꺼면 제대로 만들었으면 하는 아쉬움만 남는다 중기만 그런게 아니고 동네예보도 문제가 많다. OpenWeather를 많이 쓰는 이유가 있는 것 같다. 추가로 읽으면 좋을 것

[안드로이드] SimpleDataFormat을 이용한 현재날짜, 시간 받아오기

이미지
시간을 따로 받아야 할 경우가 생겨 따로 함수로 구현하였습니다. 이를 통해, 년 월 일 시간 분 으로 쪼개어 사용하는 함수입니다. public ArrayList MakeSaveData() { SimpleDateFormat currentTime = new SimpleDateFormat("yyyy.MM.dd.HH.mm"); //SimpleDateFormat sdfNow = new SimpleDateFormat("yyyy.MM.dd.HH.mm.ss"); String time = currentTime.format(new Date(System.currentTimeMillis())); StringTokenizer mToken = new StringTokenizer(time,"."); ArrayList mTemp = new ArrayList<>(); while(mToken.hasMoreTokens()) { mTemp.add(mToken.nextToken()); } Log.i(TAG, "time print: " + time); for(int i = 0; i < mTemp.size(); i++) Log.i(TAG, "time print: " + mTemp.get(i)); return mTemp; } 로그를 통해 결과를 확인 해 보면, 다음과 같은 결과를 얻습니다. 시간의 경우 현재 휴대폰의 시간을 통해 얻습니다. 추가로 읽으면 좋을 것

[알고리즘] 3. 동적 계획법 개념

이미지
동적 계획법 이란, 동적 계획법(Dynamic Programming) ,  줄여서 DP는 특정 범위까지의 값을 구하기 위해서 그것과 다른 범위까지의 값을 이용하여 효율적으로 값을 구하는  알고리즘  설계 기법이다. 조금 장난스럽게 말해서 답을 재활용하는거다. 앞에서 구했던 답을 뒤에서도 이용하는 것으로 볼 수있다. (출처 : 나무위키 - 동적계획법 https://namu.wiki/w/%EB%8F%99%EC%A0%81%20%EA%B3%84%ED%9A%8D%EB%B2%95?from=%EB%8F%99%EC%A0%81%EA%B3%84%ED%9A%8D%EB%B2%95) 이 말처럼 DP, 동적계획법은 완전 탐색에서 중복된 부분 문제를 한번만 계산 하기 위한 메모이제이션( Memoization) 이다. 메모이제이션이란,  같은 계산을 여러 번 해야 할 때, 한 번 계산한 결과를 메모리에 저장해 이후 동일한 계산 과정을 생략할 수 있게 하는 기법이다. (출처 : 나무위키 - 메모이제이션)   https://namu.wiki/w/%EB%A9%94%EB%AA%A8%EC%9D%B4%EC%A0%9C%EC%9D%B4%EC%85%98 ) 보통 동적계획법 알고리즘 구현은, 1. 주어진 문제를 완전 탐색 이용 해결, 2. 중복된 부분 문제를 한 번만 계산하도록 메모이제이션 적용 두가지 방법으로 나뉜다. 이를 토대로 탐색을 통해 이전 값을 참고하는 것을 해 본다면, [취업] 삼성 SW후기 포스팅의 문제를 동적계획법으로 설계 해 보려 한다. 일단 문제는, Player 비행기가 끝까지 도달하였을 때, 코인의 최대값이 문제다 (자세히는 포스팅을 참조...) 보통 완전탐색으로 모든 경우의 수 탐색을 통해 해결할 수 있지만, 크기가 커지면 탐색하는데 시간 초과가 발생한다. 이를 해결하기위해 동적계획법을 쓴다면, ...

이 블로그의 인기 게시물

윤석열 계엄령 선포! 방산주 대폭발? 관련주 투자 전략 완벽 분석

대통령 퇴진운동 관련주: 방송·통신·촛불수혜주 완벽 분석

키움 OPEN API MFC 개발 (1)