소켓 관련 함수들을 정리해보자.
도메인 관련 함수 (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()
프로토콜 이름을 통해 해당 네트워크 프로토콜에 대한 정보를 가져오는 데 사용.
주로 네트워킹 응용 프로그램에서 프로토콜 번호와 같은 프로토콜 정보를 얻기 위해 사용.