본문 바로가기

반응형

분류 전체보기

(425)
주소값 변환 하기(inet_aton, inet_ntoa, inet_addr, inet_network) #include #include #include struct in_addr { unsigned long int s_addr; }; int inet_aton(const char *cp, struct in_addr *inp); char *inet_ntoa(struct in_addr in); in_addr_t inet_addr(const char *cp); in_addr_t inet_network(const char *cp); inet_aton() IPv4의 Dotted-Decimal Notaion 아이피 주소를 네트워크 바이트 오더(big-endian) 바이너리 폼으로 변경하여 in_addr에 저장한다. 주소가 정상적인 것이라면 0이 아닌 값을 리턴하고, 그렇지 않다면 0을 리턴한다. #include #in..
arithmetic coding 요즘들어 내가 기초 실력이 부족하다는 사실을 뼈져리게 느끼고 있다. 프로그래머라고 자처 하는 놈이 기본적인 알고리즘의 효율계산하는 것도 버벅대고, 수학도 잘 못하고, 기본원리도 잘 모른다. 과연 API나 쓰고 예외 상황들에 대한 경험만 쌓아 가는게 프로그래머가 아닌데.. 어제도 Arithmetic coding이라는 것을 들었을 때, 이것이 어떻게 돌아가는 것인 줄도 몰랐다. 뭐 지금 찾아 봐도 여전히 모르는것은 마찬가지지 싶다. 엔트로피 코딩이라고 하는데 당최 이게 무슨 소린지 나는 학교 다닐 때 도데체 뭘 배우고 온거지?? 왜 나는 알고리즘 계산을 하나도 못 하는 걸까? 요즘 같아서는 어디가서 내가 프로그래머라고 이야기하는 것도 부끄럽다. 내 직업에 부끄럽지 않은 실력을 가진 사람이 되어야 하는데, 그..
간단한 에코 서버 제작 /** 간만에 주말이 왔다. 내일은 약속도 없고(뭐 평소에도 그렇게 약속이 있었던 편은 아니지만), 할 일도 없으니(뭐 평소에도 주말이 바빴던 것은 아니지만) 오랫동안 생각해 왔던 것의 처음을 시작 하려고 한다. 지금 부터 얼마나 걸릴지 모르겠지만 리눅스 소켓 프로그래밍에 관련된 글을 쓰고자 한다. 이 문서는 오로지 리눅스/유닉스 계열의 소켓 프로그래밍에 관려해서만 다룰 예정이며, 내가 아직 소켓프로그래밍의 정점에 선 사람이 아니기 때문에 내 머리 속에 있는 내용을 정리 하기 보다는 다른 사람들이 적어 놓은 책들을 보고 정리 하는 차원이 될 지도 모르겠다. */ 아래의 코드는 단순히 하나의 컨넥션을 받아 들이고, 딱 한번만 클라이언트에서 오는 메시지를 에코하고 종료 되는 초 간단한 에코서버다. 다른 설명..
도메인 이름을 이용해 IP 주소 얻기(gethostbyname) gethostbyname 함수의 이름 대로 이름에서 host 주소를 얻어 올 수 있는 함수다. 그렇다고 해서 꼭 IP주소만을 가져 오느냐 하면 그것도 아니다. struct hostent 라는 구조체를 이요해서 호스트의 대표이름, 별명, 주소의 타입, 주소 리스트들을 얻어 올수 있다. IPv4에서만 정상적으로 돌아가는 함수이며 다음 POSIX에서 퇴출 당할 가능성이 있다고는 하지만 여지껏 일반적으로 잘 사용 되어져 왔던 함수다. #include extern int h_errno; struct hostent *gethostbyname(const char *name); struct hostent { char *h_name; /* official name of host */ char **h_aliases; /*..
Leader/Follower pattern 얼마전에 libevent가 threadsafe 하지 않다는 글을 대충 번역 해서 올렸더니, 지인이 leader/follower pattern이라는 것을 소개 해줬다. 인터넷 검색 결과 ACE framework에서 사용 되는 서버패턴의 일종이라는데 아직 구현을 해보지 않아서 성능이 얼마나 나올는지는 장담하지 못한다. 내가 구현 하려고 했던 형식은 이벤트(accept/read ..etc)를 감시하는 thread가 하나 있고, 이벤트가 발생하면 event queue에 그 이벤트들을 집어 넣는다. 그럼 event queue 반대편의 worker thread들이 그 이벤트에 맞는 핸들링을 하는 구조 였는데 오버헤드가 많아서 실질적으로 사용하기는 다소 무리가 있는 형식이었다. 그에 반에 leader/follower..
지름신 강림 시리즈 2편 - GP2X 가격 : 165,000 원 상품평 : 일단 3D 지원 안되고, 화질 이 구리고, 베터리가 AA 사이즈를 사용하기 때문에 서너 시간 마다 한번씩 갈아 줘야 하고, SD 메모리를 사용하기 때문에 업로드 속도가 느리다라는것 외에는 아주 마음에 든다. 개인적으로 오락을 별로 좋아하지 않기 때문에 오락 할 일도 별로 없고, 웅장한 사운드, 커다란 화면에서 영화를 보는 것을 즐기기 때문에 여기서 영화 볼일도 없다. mp3와 ogg가 지원된다고 하나 음악은 잘 안들으니 일단 패스~! 그럼 이 기계가 나에게 무슨 필요가 있을까? OPEN SOURCE!! 이유는 오직 하나 오픈소스 이기 때문이다. 위키피데아를 살펴보니 SDK도 잘 지원이 되는 것 같고, 이것 저것 필요한 유틸들을 사람들이 많이 올려 놓는것 같다. 아직 ..
Condition Variables condition variables와 mutex를 같이 사용할 경우 condition variable은 임의의 상태(condition)이 발생하길 기다리는 race-free 한 방법을 제공 한다. condition과 mutex의 사용에 대한 간략한 개념을 이야기 하자면 : condition 자체는 mutex와 함께 사용되어야만 한다. mutex는 condition variable이 wait로 넘어가기 전의 초기화라던지 기타 등등에 대한 concurrency를 보장한다. condition variable 초기화 condition variable이 사용되기 전에 역시 다른 동기화 객체와 마찬가지로 초기화라는 것이 필요하다. C/C++에서 condition variable은 pthread_cond_t 데이터 ..
sendto & recvfrom TCP는 연결지향의 통신에 신뢰성을 보장하고 UDP는 비연결 지향의 통신에 신뢰성을 보장하지 못한다는 것 같은 지루하고 이론적인 이야기는 저기 나 보다 더 많이 공부하신 분들이 써 놓은 책이나 웹페이지에게 떠넘겨 버리고(http://en.wikipedia.org/wiki/User_Datagram_Protocol), 여기서는 유닉스계열 쪽의 UDP소켓 API의 사용법에 대해 간략히 알아보고, 그에 발생 할 수 있는 예외 상황들을 다뤄 보고자 한다. UDP 통신은 위에서 언급했던것 처럼 말 그대로 비연결이다. 한글로 또박또박 풀어 쓰자면 연결하는 과정이 따로요 없다는 소리다. 어떻게 연결을 하지 않고 통신을 할 수 있는가라고 반문한다면 TCP의 four-way handshake처럼 쌍방간에 연결을 맺었다는 ..
[socket] shutdown (half close) "Half-close"?? 절반만 닫는다는게 무슨 소리야? half-close의 의미는 소켓의 레퍼런스 카운트나 기타 등등 들은 유지한체 write stream이나 read stream만을 선별적으로 닫는다는 뜻이다. 그에 대한 API는 아래와 같다. #include int shutdown(int fd, int how); fd : half-close 하고자하는 파일 디스크립터 how : close 모드. 아래 값 중 하나를 가질 수 있다. SHUT_RD : 입력 스트림 종료. 상수 값 0 SHUT_WR : 출력 스트림 종료. 상수 값 1 SHUT_REWR : 입출력 스트림 모두 종료. 상수 값 2 도데체 이게 왜 필요한거지? 그냥 닫아 버리면 무슨 문제라도 생기나? 위와 같은 의문을 충분히 가질 수 있다..
소켓 종료와 TIME_WAIT(Socket termination and TIME_WAIT) 오늘은 소켓의 종료와 그에 따라 발생하는 소켓의 상태 변화에 대해 알아 보도록 하겠다. 먼저 소켓은 생성될 때는 3-way hand shaking을 통해서 생성되지만, 종료 될때는 한단계 더 많은 4-way hand shaking을 거쳐 종료 된다. 위에서 분명히 4-way.. 4단계라고 이야기 했다. 그럼 어떤 4단계를 거치는지 알아 보자. 1. A가 B에게 연결 종료를 요청한다. 2. B는 바로 종료를 하는 것이 아니라, 단순히 ACK만을 날리고 있다. B도 종료 하기 전에 할 일이 있기 때문에 바로 FIN을 날리지 않고, 단순히 ACK를 날리고 CLOSE_WAIT 상태로 넘어 간다. 3. 볼일을 다 보고난 B는 이제서야 FIN을 날리고 연결을 종료 하고자 한다. 4. A는 B의 FIN을 잘 받았다는..

반응형