: 적수동의 나이스한 리눅서 님들께,
: 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 serve
r 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 ((se
ndbytes=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, //Rece
ivev IP from NameServer
: (struct sockaddr *)&ns_addr, (socklen_t*)addr_len)) =
= -1) { // for Query
: perror("recvfrom");
: e
xit(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를 wr
apping해서 사용합니다.
^^