본문 바로가기

반응형

C/C++

(66)
byte order(little-endian and big-endian) /** 1699년 걸리버가 표류한 소인국 릴리푸틴(Lilliputin)들은 삶은 달걀을 먹는 방법에 생사를 걸었다. 왕은 달걀의 양끝 중 작은 쪽부터 깨서 먹을 것을 명령했으나 큰 끝부터 깰 것을 고집하는 빅-엔디안(Big-Endians)들이 사생결단해 저항했다. 36 월력(月曆)간 6차례 대 폭동이 일어나고 1만1천명이 작은 끝부터 깨기를 거절하고 죽음을 택했다. 걸리버 여행기 中 */ 네트워크 바이트 순서(Network-byte order) CPU가 데이터를 처리하기 위해서는 가장 먼저 메모리에 데이터가 적재가 되어 있어야만 한다. 그런데 이 세상에는 CPU의 종류가 한 두 가지가 아니고, CPU를 만들어 내는 회사 또한 한 두군데가 아니다. 그리고 그 회사들은 저마다 각각의 바이트 순서(byte o..
주소값 변환 하기(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..
간단한 에코 서버 제작 /** 간만에 주말이 왔다. 내일은 약속도 없고(뭐 평소에도 그렇게 약속이 있었던 편은 아니지만), 할 일도 없으니(뭐 평소에도 주말이 바빴던 것은 아니지만) 오랫동안 생각해 왔던 것의 처음을 시작 하려고 한다. 지금 부터 얼마나 걸릴지 모르겠지만 리눅스 소켓 프로그래밍에 관련된 글을 쓰고자 한다. 이 문서는 오로지 리눅스/유닉스 계열의 소켓 프로그래밍에 관려해서만 다룰 예정이며, 내가 아직 소켓프로그래밍의 정점에 선 사람이 아니기 때문에 내 머리 속에 있는 내용을 정리 하기 보다는 다른 사람들이 적어 놓은 책들을 보고 정리 하는 차원이 될 지도 모르겠다. */ 아래의 코드는 단순히 하나의 컨넥션을 받아 들이고, 딱 한번만 클라이언트에서 오는 메시지를 에코하고 종료 되는 초 간단한 에코서버다. 다른 설명..
도메인 이름을 이용해 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; /*..
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 도데체 이게 왜 필요한거지? 그냥 닫아 버리면 무슨 문제라도 생기나? 위와 같은 의문을 충분히 가질 수 있다..
[C/C++] Read/Write lock Read/Write Lock의 개념 Read/Write Lock(이하 rwlock)의 기본적인 개념은 아래와 같이 간단하다. Read 작업은 값을 변경하지 않으니, 하나의 크리티컬 섹션에 여러개의 스레드가 진입해도 일관성 관련 문제가 발생하지 않는다. Write 작업은 값을 변경 할 수도 있으니, 하나의 크리티컬 섹션에 여러개의 스레드가 진입 할 경우 일관성이 깨질 수 있다. Read 작업은 여러개의 스레드가 하나의 크리티컬 섹션에 접근 가능하지만, Read하는 도중 값이 변경 되면 안된다. 위의 세 가지 사항 정도만 제외 한다면 rwlock은 mutex랑 비슷하다. 개념도 비슷하고, 사용법도 비슷하고, 하는 일도 비슷하다. rwlock의 장점은 read 작업에 있어서 여러개의 쓰레드가 서로 블록킹 하는..
libevent and multithread /** libevet를 멀티 쓰레드 환경에서 사용코자 했는데, 이것이 생각 처럼 동작 하지 않았다. connection이 하나만 들어 왔을 때는 정상동작 했지만, 둘 이 상이되면서 부터는 event_dispatch() 에서 1을 리턴(set 되어 있는 이벤트 가 없다라는 의미)하면서 계속 종료 되었다. 혹시나 싶어 libevent의 멀티 쓰레드 환경에 대해 찾아 보니 아래와 같은 글이 있어 짧은 영어 실력이나마 번역을 해 보았다. 혹시나 누군가가 잘 못된 내용을 진실로 받아 들이고 그걸 다른 사람에게 진실인양 전파 한다면 세상에 잘못된 지식들이 판치게 되고, 지식을 추구하 는 사람들에게 있어 그것만큼 나쁜 일이 없다. 아래의 글 중 잘 못된 내용이 있다면 언제든지 kukuta@gmail.com으로 알 려..
[C++] 전역 변수 extern 키워드 extern 키워드는 '여기서는 선언만 한다. 그 내용은 어딘가에 정의 되어 있다.' 라는 의미를 가지는 키워드 이다. 여기서 '선언'과 '정의'의 개념을 잠깐 살펴보기 전에 함수를 먼저 떠올려 보자. 예를 들어 int sum(int a, int b); int main() { std::cout

반응형