본문 바로가기

반응형

socket

(17)
도메인 이름을 이용해 IP 주소 얻기(getaddrinfo) #include #include #include int getaddrinfo(const char *node, const char *service, const struct addrinfo *hints, struct addrinfo **res ); struct addrinfo { int ai_flags; /* AI_PASSIVE, AI_CANONNAME */ int ai_family; /* AF_XXX */ int ai_socktype; /* SOCK_XXX */ int ai_protocol; /* 0 or IPPROTO_XXX for IPv4, IPv6 */ size_t ai_addrlen; struct sockaddr *ai_addr; char *ai_canonname; struct addrinfo *a..
[socket] socket 함수에 관한 고찰 들어가며 프로그래밍을 공부하면서 최소한 소켓 프로그래밍라는 것에 대해서 한 두번은 들어 보셨다고 가정하겠습니다. 그렇지 않으시다면 이 포스팅을 찾아서 읽고 계실 이유가 없겠지요. 뭐, 그것이 아니라면 최소한 소켓프로그래밍에 관심이 있어 어디에서 든지 배워 보고자 하시는 분들이겠지요. 따라서 소켓의 역사니, 어쩌고 귀찮은 이야기 들은 하지 않도록 하겠습니다. 간단 명료하게 시작하도록 하겠습니다. 소켓프로그램을 시작하기 위해서는 '소켓(socket)'이라는 것이 필요 합니다. 너무 당연한 말인가요? 일단 소켓이라는 것이 무엇인지에 대해서 먼저 알아보도록 하겠습니다. 전산학에 관련된 모든 정의를 내린다고 해도 과언이 아닐 정도로 정의를 많이 가지고 있는 RFC문서에 따르자면 아래와 같이 이야기 하고 있습니다...
TIME_WAIT vs CLOSE_WAIT TCP 소켓에는 총 11가지의 상태가 있고(netstat를 이용해 소켓의 상태를 보면 CLOSED, LISTEN, SYN_SENT, SYN_RECV, ESTABLISHED, CLOSE_WAIT, LAST_ACK, FIN_WAIT1, FIN_WAIT2, CLOSING, TIME_WAIT..중에 하나가 나온다) 그 중 사람들이 자주 헷갈리는 것이 TIME_WAIT와 CLOSE_WAIT는 요 두가지 상태이다. 오늘은 이 TIME_WAIT와 CLOSE_WAIT, 요 두 상태에 대해 말해 보도록 하겠다. 들어가기에 앞서, 용어 정리를 먼저 하도록 하자. Active Open : connect()를 호출 하는 쪽. 즉, SYN 세그먼트를 전송한 쪽. 종종 클라이언트가 된다. 하지만 100% 클라이언트라고 할 수는 ..
소켓 프로그래밍 - '네트워크에 중복된 이름이 있기 때문에 연결되지 않았습니다' 윈도우 소켓 프로그래밍을 할때 특히 대량 접속 프로그램을 만들때 저 에러가 뜬다면 프로세스에서 생성 할수 있는 소켓이 한계에 도달했다는 의미다. 프로그램이 active close를 하고 있는지 확인하고, 만일 active close를 하고 있다면 linger option을 꺼줘야 한다. 여기서 active close라는 것은 상대방이 close를 하는 것이아니라 프로그램 자신이 close를 호출하는 것을 의미한다. close를 호출하는 쪽은 TIME_WAIT 상태에 빠지게 되어 일정 시간동안 소켓 리소스를 해제하지 않고 유지하게 된다. 예를 들어 서버라면 수많은 클라이언트들이 접속을 할텐데 그 연결들에 대해 서버가 close를 호출하게 되면 TIME_WAIT에 빠진 소켓들을 다른 클라이언트로 부터의 연결..
블로킹 소켓에서의 send 동작 얼마전에 간단한 서버/클라이언트 프로그램을 만든적이 있다. 어떤 놈이 나에게 못 미더운 듯이 묻기를 왜 recv를 처리하는 곳에는 while을 이용해서 read operation에 대한 오류 처리를 해주는데 send에 대해서는 아무런 처리를 하지 않냐고 했다. 블록킹 소켓일 경우 send 함수는 지정된 바이트를 모두 전송하기 전까진 리턴을 하지 않기 때문에 괜찮다라는 이야기를 친절(?)하게 해주었지만 이 샹콤한 놈의 자식이 아니라고 바득 바득 우기는데야...결국에 실험으로 보여주기는 너무 귀찮아져 man page를 찾아 보여주는 수고까지 해야 했다. When the message does not fit into the send buffer of the socket, send normally blocks,..
RST 메시지 1. Connect 시도시 목적 host와 port에 connection을 대기하는(listen)하는 프로세스가 없는 경우 발생 2. TCP가 현재 맺고 있는 연결을 날려 버리고자 하는 경우 발생. 3. TCP가 이전에 맺고 있던 연결이 더 이상 유효 하지 않다고 알리는 경우 발생
connected UDP socket 일반적으로 UDP는 비연결 지향형 프로토콜로 알려져 있다. 맞는 말이다. 하지만 디폴트 UDP에 connect라는 것을 첨가하여 보다 편리 하게 쓸 수 있는 것도 사실이다. UDP소켓에다 connect 함수를 사용 한다는 것은 TCP의 그것 처럼 동작한다는 뜻은 아니다(Three-way handshaing 이라던지 하는 과정 들이 없다). 다만 커널에 소켓이 향하고 있는 주소를 기록해 두고 send 할 때 마다 주소를 넘겨 줘야 한다는 것 외의 모든 동작방법이나 기타등등은 다 똑같다. 자꾸 말을 번복하는 것 같지만, 내부에서 돌아가는 것은 다 똑같으나 사용법에 있어서 connected UDP와 unconnected(default) UDP는 다소 다른 점이 있다. 더 이상 목적지 주소와 포트를 지정 할 필..
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..
간단한 에코 서버 제작 /** 간만에 주말이 왔다. 내일은 약속도 없고(뭐 평소에도 그렇게 약속이 있었던 편은 아니지만), 할 일도 없으니(뭐 평소에도 주말이 바빴던 것은 아니지만) 오랫동안 생각해 왔던 것의 처음을 시작 하려고 한다. 지금 부터 얼마나 걸릴지 모르겠지만 리눅스 소켓 프로그래밍에 관련된 글을 쓰고자 한다. 이 문서는 오로지 리눅스/유닉스 계열의 소켓 프로그래밍에 관려해서만 다룰 예정이며, 내가 아직 소켓프로그래밍의 정점에 선 사람이 아니기 때문에 내 머리 속에 있는 내용을 정리 하기 보다는 다른 사람들이 적어 놓은 책들을 보고 정리 하는 차원이 될 지도 모르겠다. */ 아래의 코드는 단순히 하나의 컨넥션을 받아 들이고, 딱 한번만 클라이언트에서 오는 메시지를 에코하고 종료 되는 초 간단한 에코서버다. 다른 설명..

반응형