-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcli.c
79 lines (68 loc) · 1.97 KB
/
cli.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
//
// Created by 谢卫凯 on 2022/4/1.
//
/* client.c */
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include "message.h"
#include "wrap.h"
int main(int argc, char *argv[])
{
char dnsIp[51];
char hostName[101];
char buff[1024]; // 装报文用的内存
ssize_t n; //报文大小
printf("dns server ip:");
scanf("%s",dnsIp);
printf("hostname:");
scanf("%s",hostName);
message *msg = newMsg();
// 设置请求头
setQuery(msg);
msg->ID = 0x1234; // 两字节ID,随便给的
setOpcode(msg,QUERY);
setFlag(msg,RD);
// 设置question section
question q;
setQNAME(&q,hostName);
q.q_type = A; q.q_class = IN;
addQuestion(msg,&q);
// 将msg编为报文
n = encode(msg,buff);
destroyMsg(msg); //释放空间
//创建socket发送请求
struct sockaddr_in servaddr;
int sockfd;
socklen_t servaddr_len;
sockfd = Socket(AF_INET,SOCK_DGRAM,0); // 创建socket
// 设置服务器ip+端口
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(53);
if(!(inet_pton(AF_INET, dnsIp, &servaddr.sin_addr))){
fprintf(stderr,"error occur when parsing dns server ip:%s\n",dnsIp);
exit(-1);
}
// 向服务器发送信息
if(sendto(sockfd,buff,n,0,(struct sockaddr*)&servaddr,sizeof(servaddr)) == -1)
perr_exit("sendto error");
printf("sendto server and waiting for respone ......\n");
// 设置接收超时时间 5s
struct timeval tv;
tv.tv_sec = 5;
tv.tv_usec = 0;
setsockopt(sockfd,SOL_SOCKET,SO_RCVTIMEO,&tv,sizeof (tv));
//接收服务器信息
n = recvfrom(sockfd,buff,1024,0,NULL,0);
if(n == -1)
perr_exit("recvfrom error");
msg = decode(buff); // 将报文转化为message结构
printf("\n\nrecv message!!\n");
showMsg(msg); //展示报文
printf("\n\nmemory:\n");
showMem(buff,n); // 展示内存
destroyMsg(msg);
return 0;
}