본문 바로가기

반응형

진리는어디에

(289)
간단한 에코 서버 제작 /** 간만에 주말이 왔다. 내일은 약속도 없고(뭐 평소에도 그렇게 약속이 있었던 편은 아니지만), 할 일도 없으니(뭐 평소에도 주말이 바빴던 것은 아니지만) 오랫동안 생각해 왔던 것의 처음을 시작 하려고 한다. 지금 부터 얼마나 걸릴지 모르겠지만 리눅스 소켓 프로그래밍에 관련된 글을 쓰고자 한다. 이 문서는 오로지 리눅스/유닉스 계열의 소켓 프로그래밍에 관려해서만 다룰 예정이며, 내가 아직 소켓프로그래밍의 정점에 선 사람이 아니기 때문에 내 머리 속에 있는 내용을 정리 하기 보다는 다른 사람들이 적어 놓은 책들을 보고 정리 하는 차원이 될 지도 모르겠다. */ 아래의 코드는 단순히 하나의 컨넥션을 받아 들이고, 딱 한번만 클라이언트에서 오는 메시지를 에코하고 종료 되는 초 간단한 에코서버다. 다른 설명..
도메인 이름을 이용해 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..
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을 잘 받았다는..
[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

반응형