private ArrayList ParseAnswers(byte[] reply,int answerCount,ref int offset)
{
/* RFC 1035 4.1.3. Resource record format
1 1 1 1 1 1
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| |
/ /
/ NAME /
| |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| TYPE |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| CLASS |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| TTL |
| |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| RDLENGTH |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--|
/ RDATA /
/ /
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
*/
ArrayList answers = new ArrayList();
//---- Start parsing aswers ------------------------------------------------------------------//
for(int i=0;i<answerCount;i++){
string name = "";
if(!GetQName(reply,ref offset,ref name)){
throw new Exception("Error parisng anser");
}
int type = reply[offset++] << 8 | reply[offset++];
int rdClass = reply[offset++] << 8 | reply[offset++];
int ttl = reply[offset++] << 24 | reply[offset++] << 16 | reply[offset++] << 8 | reply[offset++];
int rdLength = reply[offset++] << 8 | reply[offset++];
object answerObj = null;
switch((QTYPE)type)
{
case QTYPE.A:
answerObj = ParseARecord(reply,ref offset,rdLength,ttl);
offset += rdLength;
break;
case QTYPE.NS:
answerObj = ParseNSRecord(reply,ref offset,rdLength,ttl);
// pos += rdLength;
break;
case QTYPE.CNAME:
answerObj = ParseCNAMERecord(reply,ref offset,rdLength,ttl);
// offset += rdLength;
break;
case QTYPE.SOA:
answerObj = ParseSOARecord(reply,ref offset,rdLength,ttl);
// offset += rdLength;
break;
case QTYPE.PTR:
answerObj = ParsePTRRecord(reply,ref offset,rdLength,ttl);
// offset += rdLength;
break;
case QTYPE.HINFO:
answerObj = ParseHINFORecord(reply,ref offset,rdLength,ttl);
// offset += rdLength;
break;
case QTYPE.MX:
answerObj = ParseMxRecord(reply,ref offset,ttl);
break;
case QTYPE.TXT:
answerObj = ParseTXTRecord(reply,ref offset,rdLength,ttl);
offset += rdLength;
break;
case QTYPE.AAAA:
answerObj = ParseAAAARecord(reply,ref offset,rdLength,ttl);
offset += rdLength;
break;
default:
answerObj = "dummy"; // Dummy place holder for now
offset += rdLength;
break;
}
// Add answer to answer list
answers.Add(answerObj);
}
return answers;
}