>> Delete No. 32369 article
No. [A]DNS 쿼리 프로그램 질문.

등록 2001-06-06 03:46:00 By localhost     조회 2
이름 달기사    

		적수동의 나이스한 리눅서 님들께,
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 se
tting         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 s
ockaddr))) == -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
[관리자] 패스워드를 입력 하십시오. 답장이 존재하면 함께 삭제됩니다.[ 목록 | 이전 ]
패스워드:    

Copyleft 1999-2026 by JSBoard Open Project
Theme Designed by IDOO All right reserved