소켓shutdown..DomainName<->IP

여태까지 우리는 소켓을 보낼때 close함수로 소켓을 닫았습니다

하지만 이럴때에 만약 한쪽에서 보낸 데이터를 보냈는데 받는측에서는 벌써 close함수가 호출되

어서 Pipe 가 (올바른 표현인가는 모르겠습니다만)  닫혀버린다면... 보낸 그 데이터는 유령 데

이터가 되어 버리겠죠..

음 자세히 설명하자면...


A------------------------------------>B
A<------------------------------------B
상황에서

A--------------data-------X------>B(close run)
A<------------------------X----------B
이런 상태가 되면 난감하니까..(close 함수로 끝내면 다 닫혀 버림..)


A----X--------------data--------->B
A<---------data--------------------B
바로 전달하고 막아버림

아 몰라... 일단 반씩 소켓을 닫는 함수를 소개하자면..

int shutdown(int sockfd,int how);
이 함수는 무쟈게~ 간단합니다...
자꾸 파이프가 생각나네요 흠..
뭐 암튼... 인자는

sockfd:............소켓 fd
how:012가 있습니다.. 각 순서는 stdin,stdout을 생각해보시면 잘 알수 있으실겝니다..

라고 해도 설명을 해야겠죠 흠..
0:입력스트림 종료 1:출력스트립 종료 2:둘다 종료
0:SHUT_RD 1:SHUT_WR 2:SHUT_RDWR 이렇게 쓰기도 합니다..
이것들은 open함수에서써먹었던 놈들이 생각나네요.. 끝부분이 비슷하죠......;;;;;;;;;;;;

도메인 이름을 -> IP 로 IP를 ->도메인 네임으로!!
새로운 구조체 등장!

#include<netdb.h>

struct hostent{
   char h_name;
   char **h_aliases;
   char h_length;
   char **h_addr_list;
}

h_name:딱 보면 나오지않는가! 바로 공식 호스트 네임 ex>www.naver.com
h_aliases:더블포인터..이라하면 여러개를 가르키는.. 그리고 이름을 보자 alias...
떠오르는게 없을려나! 바로..비슷한 이름을 치면 공식 호스트 네임의 서버로 들어가는것
설명이 더 힘들다 간단한 ex>www.naver.co.kr,  naver.com
h_addrtype: ipv4(걍 여태까진 ip4라고 했죠? 귀찮아서 축약)ip6인지 알아낼수 있습니다
h_length:주소의 길이,위의 값에 따라 달라진다 버전4==4 버전6==16
h_addr_list:넣은 도메인 이름의 IP 큰회사일경우 IP가 여러개 찍힐수 있다(서버 갯수가 많으므로)그것때문에 2차원 포인터.

이 구조체로 써먹을수 있는 함수들은..

1.도메인이름으로  IP주소와 그에 따른 정보 알아보기
struct hostent* gethostbyname(const char * name);
성공시 hostent구조체 반환,즉 이 함수가 성공하면 걍 구조체안의 변수들을 출력하기만
하면 호스트의 정보를 볼수 있다
인자는 볼것도 없다.. 그냥 따옴포 치고 넣어주던가 아님 argv로 받아서 넘겨주면 끝

2.아까꺼랑 반대로 .. IP로 도메인 이름 알아보기
struct hostent* gethostbyaddr(const char *addr,int len,int type);
addr:(char *)&addr.sin_addr 을 넣어주면 된다..
(뭐 당연히 addr은 구조체를 뭘 했냐에 따라서 다르다)
len:ipv4==4 ipv6==16을 넣어준다
type:말 그대로 타입..AF_INET,AFINET6 를 선택해서 집어넣는다(각 ipv4 ipv6)

**혹시 해서 적는데.. 포인터로 받으니까.. 에러시 리턴값은 NULL이다