반응형
gethostbyname(3)
#include <netdb.h>
struct hostent *gethostbyname(const char *name);
서버 이름 또는 도메인(예. www.it-note.kr)으로부터 주소정보(IP Address)를 얻습니다. 주소 정보는 local computer의 /etc/hosts 파일 또는 DNS 서버로 부터 주소 정보를 얻습니다.
struct hostent 구조체
struct hostent {
char *h_name; /* official name of host */
char **h_aliases; /* alias list */
int h_addrtype; /* host address type : AF_INET 또는 AF_INET6 */
int h_length; /* length of address */
char **h_addr_list; /* list of addresses */
}
#define h_addr h_addr_list[0] /* for backward compatibility */
파라미터
name
- IP 주소를 얻으려는 서버 이름 또는 서버에 대한 도메인명
RETURN
NULL
- 오류가 발생하였습니다.
NULL 아님
- struct hostent *를 return하며, 주소는 h_addr 멤버 변수에 저장되며,
그 주소의 길이는 h_length에 저장됩니다.
- h_addr의 format은 network byte order의 주소이며,
인터넷 표준 점표기법으로 표시하려면 inet_ntoa( )로 변환이 필요합니다.
활용 예제
Sample
#include <stdio.h>
#include <errno.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#define SERVER_PORT 6905
#define SERVER_NAME "www.it-note.kr"
......
int main(int argc, char **argv)
{
struct hostent *he;
struct sockaddr_in server_addr;
int sock;
......
if((he = gethostbyname(SERVER_NAME)) == NULL) {
fprintf(stderr, "%s는 등록되지 않은 서버명입니다.\n", SERVER_NAME);
return -1;
}
memset(&server_addr, 0x00, sizeof(struct sockaddr_in));
server_addr.sin_samily = AF_INET;
memcpy(server_addr.sin.sin_addr, he->h_addr, he->h_length);
server_addr.sin_port = htons(SERVER_PORT);
if((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
fprintf(stderr, "Socket 생성 오류: %s\n", strerror(errno));
return -1;
}
if(connect(sock, (struct sockaddr *)&server_addr, sizeof(struct sockaddr_in)) == -1) {
fprintf(stderr, "Connection Error: %s\n", strerror(errno));
close(sock);
return -1;
}
......
}
see also : Socket 통신과 Socket 응용
반응형