2010-03-04 4 views
0

은 쿼리 이름 (예 : 호스트 이름 또는 도메인 이름)과 쿼리 유형 (A 또는 NS)의 세 가지 인수를 사용하는 C 소켓을 사용하여 DNS 클라이언트 프로그램을 작성하려고합니다. 또는 MX) 및 DNS 서버 이름. 받은 DNS 레코드의 응답 섹션에 응답을 인쇄하십시오. 내가 WWW ./a.out 입력을 줄 때 ... 그래서C 소켓을 사용하여 작성된 DNS 클라이언트

내가 거기에 알고는 명령 getaddrinfo .. 하지만 난 그냥 테이블을 조회하는 연결하려는 다음 가 DNS 서버 이름을 가져 .google.com에 144.20.190.70

가이 비슷한 표시됩니다

:

서버 : 144.20.190.70 주소 : 144.20.190.70 # 53

비를 -authoritative 답 :

이름 : www.google.com

정식 이름 : www.l.google.com

이름 : www.l.google.com 주소 : 74.125.19.104

이름 : www.l.google.com 주소 : 74.125.19.105

이름 : www.l.google.com 주소 : 74.125.19.106

이름 : www.l.google.com 주소 : 74.125.19.147

이름 : www.l.google.com 주소 : 74.125.19.99

이름 : www.l.google.com 주소 : 74.125.19.103

+0

질문을 더 명확하게해야합니다. getaddrinfo를 사용하지 않으려합니다. 이 질문에서 많은 것이 명확하지만 'dns srname'은 무엇입니까? 당신은 아마 그 질문에 대해 다시 생각해보아야 할 것입니다. – rmk

+0

제발 나를 도와 줄 수있어. – SuperMan

답변

2

는 예 롭 - Philpott은이 .NET

Click Here

을 위해 만든 Bev.net.dns 클래스를 참조 할 필요가 DNS 서버로 보내려는 요청을 작성하는 것은 쉽지 않지만 일단 서버에서 응답을 받으면 브라우저로 다시 보내야합니다. 그리고 이것이 내가 붙잡은 비트입니다.

포트 53/UDP에서 수신 대기하고 요청을 받아서 DNS 서버로 보내면 유효한 응답을 받지만 원격 클라이언트 포트를 UDP로 사용하여 브라우저로 다시 보내면 브라우저는 예외가 아닙니다. 답장.

Robs 코드는 "Resolver.Lookup"아래에 표시된 것처럼 사용하기 쉽습니다. 원래 바이트 배열이 Resolver.Message에 저장되어있는 원래의 바이트 배열이 다시 Resume.Message로 보내지도록 비트를 추가하기를 원합니다. 브라우저.

public void Listen() 
    { 
     receiveSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); 
     receiveEndPoint = new IPEndPoint(IPAddress.Any, receivePort); receiveSocket.Bind(receiveEndPoint); 
     receivePort = (receiveSocket.LocalEndPoint as IPEndPoint).Port; 
     receiveBuffer = new byte[BufferSize]; 
     receiveAsyncResult = receiveSocket.BeginReceiveFrom(receiveBuffer, 0, receiveBuffer.Length, SocketFlags.None, ref receiveEndPoint, new AsyncCallback(NetworkMessageReceivedCallback), receiveSocket); 
    } 


    public void NetworkMessageReceivedCallback(IAsyncResult asyncResult) 
    { 
     EndPoint remoteEndPoint = null;    
     byte[] bytes = null;       
     remoteEndPoint = new IPEndPoint(IPAddress.Any, 0); //Will contain the clients port     
     int bytesRead = receiveSocket.EndReceiveFrom(asyncResult, ref remoteEndPoint);            
     bytes = new Byte[bytesRead];     
     Buffer.BlockCopy(receiveBuffer, 0, bytes, 0, bytesRead); 
     //string ip = "208.67.222.222"; 
     string ip = "192.168.1.254"; 
     IPAddress dnsServer = IPAddress.Parse(ip); 
     Response R = Resolver.Lookup(bytes, dnsServer); 
     receiveSocket.SendTo(R.Message , remoteEndPoint);//127.0.0.1 
     receiveSocket.Close(); 
    Listen(); 
} 
관련 문제