열렬히.뛰기

8. 여러가지 소켓 관련 함수

네트워크 > 소켓 프로그래밍 > 소켓 프로그래밍 > 8. 여러가지 소켓 관련 함수

소켓 관련 함수들을 정리해보자.

도메인 관련 함수 (1)

도메인에서 ip를 얻어오거나, 반대로 할 수 있는 함수들이다.

여기에서 주로 쓰이는 구조체 hostent는 다음과 같이 생겼다.

c
struct hostent
{
	char	*h_name;		   // 공식 도메인 이름
	char	**h_aliases;	 // 같은 ip로 접속되는 다른 이름들
	int		h_addrtype;		 // ip주소의 종류 (ipv4인지, v6인지 등)
	int		h_length;		   // ip주소의 크기
	char	**h_addr_list; // ip주소
};

책에서 소개하는 함수들

c
// 도메인 이름 -> ip주소
struct hostent *gethostbyname(const char *hostname);

// ip주소 -> 도메인 이름
struct hostent *gethostbyaddr(const char *addr, socklen_t len, int family);
// addr : ip주소를 가진 구조체 in_addr의 포인터
// len : 주소정보의 길이. ipv4면 4, ipv6면 16
// family : 주소체계 정보. ipv4면, AF_INET, ipv6면 AF_INET6

도메인 관련 함수 (2)

웹서브 과제에서 안내한 함수들

c
// 도메인 
int getaddrinfo(const char *hostname, // 도메인이나 IP
								const char *service,  // 서비스 이름 또는 포트번호
                const struct addrinfo *hints, // 추가정보
                struct addrinfo **result); // 네트워크 정보를 담을 매개변수

// 위의 result를 해제시켜줄 함수.
void freeaddrinfo(struct addrinfo *res);

// getaddrinfo의 output인 int 값을 해석하는 함수
const char *gai_strerror(int errornum);

여기서 쓰는 addrinfo 구조체는 다음과 같다.

c
struct addrinfo {
	  int		ai_flags;     	/* 추가적인 옵션을 정의 할 때 사용, 여러 flag를 bitwise OR-ing 하여 넣는다.*/
    int			ai_family;    	/* address family를 AF_INET등과 같이 나타낸다. */
    int			ai_socktype;  	/* 소켓 타입으로 SOCK_STREAM등과 같이 나타낸다. */
	  int			ai_protocol;  /* 0혹은 IPv4와 IPv6에 대한 IPPROTO_XXX와 같은 값을 가진다.  */
    char  	       *ai_canonname;   /* host의 canonical name을 나타낸다. */
    size_t      	ai_addrlen;     /* 소켓 주소인 ai_addr 길이를 나타낸다. */
    struct sockaddr    *ai_addr;   	/* ai_addr은 소켓 주소 구조체를 가리키는 포인터다. */
    struct addrinfo    *ai_next;	/* addrinfo는 링크드 리스트로, 다음 데이터 포인터를 가리킨다. */
};

기타 유용한 함수

웹서브 과제에서 안내한 함수들

c
#include <sys/socket.h>

int getsockname(int s, struct sockaddr *name, socklen_t *namelen);

소켓에 관한 정보를 얻어올 수 있는 함수. 
<반환값>
- ENOTSOCK : s 가 유효한 기술자가 아니다.
- ENOBUFS : s 가 소켓이 아닌 파일일경우
c
#include <sys/socket.h>

getprotobyname()

프로토콜 이름을 통해 해당 네트워크 프로토콜에 대한 정보를 가져오는 데 사용.
주로 네트워킹 응용 프로그램에서 프로토콜 번호와 같은 프로토콜 정보를 얻기 위해 사용.