소켓 프로그램에서 송수신으로 가장 많이 사용되는 것은 recv,send 와 recvfrom, sendto 일 것이다. 전자를 TCP 용 후자를 UDP 용으로 흔히 알고 사용하는데, 그 이유는 연결지향형이 아닌 경우 매 패킷마다 주소지가 다른 데이터가 올라 올 수 있기 때문에 주소를 받거나 보낼 수 있는 시스템 콜을 사용하게 된다. UDP의 경우 기대되는 데이터의 흐름은 다음과 같다. 서버 1. UDP 서버가 대기 2. 패킷 및 클라이언트 주소 수신 3. 클라이언트 주소로 응답 송신 클라이언트 1. 서버주소 및 요구사항 송신 2. 패킷 및 서버 주소 수신 여기서 주의할 점이 클라이언트가 데이터를 송신하고서 recvfrom 으로 대기하고 있다면, 서버가 아닌 다른 누군가가 패킷을 쏜다면 (이것은 네트웍 중간..
아쿠아리얼 스키니쉬 디지멀 이펙트라는 말은 약 35분 전에 만들어진 신조어다. 그 뜻은 어떤 느낌에 대한 효과를 설명하기 위함인데, 이 글을 읽고 있는 당신은 끝까지 눈을 뗄 수 없을 것이다. 효과 재현법. 1. 상온의 물을 준비한다. 상온의 물은 전날 저녁 1.7 liter 들이 주전자에 물을 채워서 끓인 다음 500 ml 정도를 마신 뒤 밤새 식힌다. 식힐 때, 옆에 있을 필요는 없다. 2. 머그컵을 준비한다. 컵을 들고 몸무게를 잴 때, 평소보다 300g 이상 더 나가야한다. 3. 아내 혹은 같이 자는 사람에게 자신을 일찍 깨워달라고 한다. 혼자 일어나도 될 수 있을 것 같은데, 그런 경우 아쿠아리얼 스키니쉬 디지멀 이펙트의 효과는 반감하니 참고하시길 바란다. 4. 밤에 잠을 잘 때, 약간 덥게 자..
TCP/IP 서버를 만들때는 다음과 같은 방법으로 만들게 된다. 1. 소켓 생성 2. bind 3. listen 4. accept 로 클라이언트 소켓 생성 소켓 프로그램을 처음하는 사람들이 겪게 되는 의문 중의 하나는 무엇에다가 묶고(bind), 듣기전까지는 어떤 일이 일어나길래 들어야(listen)하는가인데, 여기에는 발상의 전환이 필요하다. 일반적으로 파일을 열고 파일에서 읽는 과정을 생각해보면, 이미 경로라는 구별되어 있는 개체가 존재하고 그것을 다루기 위한 기술자(descriptor)를 만들어 기술자를 모든 파일 관련 입출력 함수에 인자로 넘기게 되는데, 소켓 프로그램은 그 반대라는 것이 중요하다. 기술자(socket)를 먼저 만들고, 그 기술자를 구별될 수 있는 경로 혹은 주소에 가져다가 붙이는..
#!/usr/bin/hojinsh 머리가 아픈 것은 물이 없이 말라 버린 모래주머니에 유리조각을 넣고 굴리는 것과 같은 것이다. 그것이 일 때문이거나, 그것이 방금칠한 페인트 냄새때문이거나, 그것이 잠이 부족해서이거나, 모두 물이 없이 말라 버린 모래 주머리의 유리조각 처럼 돼 있기 때문에 그렇기 때문에, 그런 상상을 진지하게 하고 나서, 물 한 모금을 마시면 된다. 이야하! 물이 들어가면, 체내의 독소의 농도가 내려가게 되고, 알량한 몇 0.0001%의 변화로 머리가 아프지 않게 된다. 안믿는 사람은 exit 1 되고, 믿는 사람은 exit 0 될 지어다.
컴파일러 캐시(ccache)와 gcc 3.4 이상이나 Visual Studio가 지원하는 미리 컴파일된 헤더(Precompiled Header; pch)의 주 목적은 컴파일 속도를 높히는데 있다. 간단히 이들의 원리를 설명하자면, 컴파일러 캐시는 PATH상에서 먼저 설치 돼있는, gcc로 이름이 바뀌어 있는 ccache가 gcc를 실행시킬때 수행되어 PATH의 이하 부분에 오는 실제 gcc를 자식 프로세스로 실행하면서, gcc의 버전, gcc의 전처리 결과(gcc -E) command line 인자 등을 분석하여 동일한 실행 명령과 전처리 결과가 오면, 컴파일을 수행하지 않고 이전에 컴파일 결과로 나온 목적파일(Object file)을 현재 시각으로 복사해서 만들어주는 일을 한는 것이며, 미리 컴파일된 ..
http://bbs.kldp.org/viewtopic.php?t=768 여기에 썼던글이다. (drupal로 이관하면서 이관된 문서를 찾으려 했으나 역부족.) 본 글은 IP 주소를 얻는 방법에 대해 쓴 것이 아니라, 그 이면에 있는 드라이버와의 통신에 대해 다룬다.#include #include #include #include #include #include #include #include #include #include #if defined(sun) #include #endif #include #if defined(linux) #include #endif #define BUFFERSIZE 1024 const char * localip = "0.0.0.0"; const char * myip() { cons..
소켓프로그래밍 깊이 보기 1 : 접속이 닫힌 후 읽을 수 있는 버퍼Quiz 하나를 생각해보자.클라이언트가 서버에 접속하여 뭔가를 전송하고 있다. 클라이언트는 1000 바이트를 전송하고나서 바로 소켓을 종료하였는데, 서버는 1 byte 씩 읽으면서 행의 끝을 판단하는 구조로 되어 있다. 서버가 10 바이트를 읽었는데, 실상 접속은 종료되었다. 서버쪽 프로그램은 11 바이트를 읽을 때, 접속 종료를 바로 알 수 있을까? 싱겁지만, 답은 서버쪽에서 1001번째를 읽기 시도할 때 비로소 안다는 것이다. 그 이유는 TCP는 데이터의 정확한(?) 전송을 보장하도록 되어 있기 때문인데, 끊어진 클라이언트에게 일단 1000 바이트에 대해 받았다는 신호를 보냈기 때문에, 서버 프로그램에 안정적으로 데이터를 올려 보낸후 ..
- Total
- Today
- Yesterday
- MySQL
- JavaScript
- SVN
- macosx
- Linux
- 구근
- 퀴즈
- ssh
- 벤자민
- url
- tattertools
- OpenID
- Subversion
- Tattertools plugin
- VIM
- BlogAPI
- 대화
- 수선화
- writely
- 디버깅
- SSO
- 덴드롱
- perl
- 오픈소스
- 킹벤자민
- 커피
- 클레로덴드럼
- nodejs
- 식물
- TCP/IP
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |