>> Edit article
이름
제목
패스워드
: 적수동의 나이스한 리눅서 님들께, : nslookup 비슷한 UDP 프로그램을 만들려고합니다. : sendto()에 쿼리 도메인을 날렸는데 대답이 없는지 먹통입니다. : : DNS 메시지 형식이 나와있는 RFC 자료나 nslookup 소스를 : 구할 수 있는 곳이어없을까여? : : 답답합니당....T.T; : : 혹은 잘못된 부분이라도 있음 지적해주세여.....부탁..... : : 소스 별첨했습니다. : : //KYURAK,CHOE : //usage : # query 164.124.101.2 53 [enter] : // yahoo.com [enter] : #include <stdio.h> : #include<unistd.h> : #include<arpa/inet.h> : #include<netinet/in.h> : #include <stdlib.h> : #include <errno.h> : #include <string.h> : #include <sys/types.h> : #include <netinet/in.h> : #include <netdb.h> : #include <sys/socket.h> : #include <sys/wait.h> : #include<stdlib.h> : : #define MAXBUFLEN 512 : : int main(int argc, char *argv[]){ : : int sockfd; : struct sockaddr_in ns_addr; //name server adress info. : int recvbytes,addr_len,sendbytes; : char recv_buf[MAXBUFLEN],send_buf[MAXBUFLEN+1]; //Buffer for Receving,Sending : : if (argc < 3) { : fprintf(stderr,"usage: querier [NameserverAddress] [port]"); : exit(1); : } : : if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) { //Creating socket : perror("socket"); : exit(1); : } : : ns_addr.sin_family = AF_INET; : ns_addr.sin_port = atoi(argv[2]); //name server adress setting : ns_addr.sin_addr.s_addr =inet_addr(argv[1]); : bzero(&(ns_addr.sin_zero), 8); : : : if(fgets(send_buf,MAXBUFLEN,stdin)){ //Get Domain From STDIN(KEYBOARD) : send_buf[MAXBUFLEN+1]=' '; //and insert to SendBuffer : }else{ : printf("input error"); : exit(0); : } : : if ((sendbytes=sendto(sockfd, send_buf, strlen(send_buf), 0, : (struct sockaddr *)&ns_addr, sizeof(struct sockaddr))) == -1) { : perror("sendto"); //querying By UDP sendto() : : } : : printf("sent %d bytes of query for domain,%sto %s",sendbytes,send_buf,inet_ntoa(ns_addr.sin_addr)); : : : : addr_len = sizeof(struct sockaddr); : if ((recvbytes=recvfrom(sockfd, recv_buf, MAXBUFLEN, 0, //Receivev IP from NameServer : (struct sockaddr *)&ns_addr, (socklen_t*)addr_len)) == -1) { // for Query : perror("recvfrom"); : exit(1); : } : : printf("got packet from %s",ns_addr.sin_addr); : printf("packet is %d bytes long",recvbytes); : recv_buf[recvbytes+1] = ' '; : printf("packet contains "%s"",recv_buf); : : : close(sockfd); //close Socket. : : return 0; : } : : -- : MoonPriest 생각하시는 것보다는 DNS Query format 이 더 복잡합니다. 또 모든 type을 다 지원하려면 Response를 다시 parsing하는 program이 필요합니다. 제 경우엔 GNU의 adns를 wrapping해서 사용합니다. ^^
Copyleft
1999-2026 by
JSBoard Open Project
Theme Designed by
IDOO
All right reserved