STM32F1网络编程-DNS客户端查询域名IP地址(基于W5500网卡)

DNS客户端查询域名IP地址(基于W5500网卡)

在进行socket进行编程时,有时只知道目标主机的域名,不清楚其IP地址,这里就需要通过DNS进行查询目标主机的IP地址。W5500的驱动支持DNS客户端,因此可以通过它来实现目标主机IP地址查询。本文将详细介绍如何使用W5500的DNS客户端进行IP地址查询。

前面的文章对W5500的驱动移植做了详细的介绍,请参考:

DNS客户端目标主机IP地址的主要步骤如下:

  • 初始化DNS客户端,通过调用DNS_init函数实现
  • 执行DNS进行目标主机IP地址查询。通过调用DNS_run函数实现。

main.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
80
81
82
83
84
85
/\* Private includes ----------------------------------------------------------\*/
/\* USER CODE BEGIN Includes \*/
#include <stdio.h>
#include "w5500\_port.h"
#include <string.h> // memcmp
#include "app\_config.h"
#ifdef DNS\_DEMO
#include "DNS/dns.h"
#endif
/\* USER CODE END Includes \*/

/\* USER CODE BEGIN PV \*/
#ifdef DNS\_DEMO
#define DATA\_BUFFER\_SIZE 2048
uint8\_t data_buffer[DATA_BUFFER_SIZE];
const uint8\_t dns_server[4] = { 8, 8, 8, 8 }; // DNS服务器地址
#define SOCK\_DNS 0
#define WEB\_SERVER\_NAME "www.baidu.com"
uint8\_t web_server_ip[4];
#endif
/\* USER CODE END PV \*/

int main(void) {
/\* USER CODE BEGIN 1 \*/

/\* USER CODE END 1 \*/

/\* MCU Configuration--------------------------------------------------------\*/

/\* Reset of all peripherals, Initializes the Flash interface and the Systick. \*/
HAL\_Init();

/\* USER CODE BEGIN Init \*/

/\* USER CODE END Init \*/

/\* Configure the system clock \*/
SystemClock\_Config();

/\* USER CODE BEGIN SysInit \*/

/\* USER CODE END SysInit \*/

/\* Initialize all configured peripherals \*/
MX\_GPIO\_Init();
MX\_USART1\_UART\_Init();
MX\_SPI1\_Init();
/\* USER CODE BEGIN 2 \*/
printf("-----STM32 W5500 Ethernet Demo-----\r\n");
w5500\_restart(); // hardware restart through RESET pin
wiznet\_register();
w5500\_network\_init\_static();
wiznet\_chip\_config();

#ifdef DNS\_DEMO
// DNS客户端初始化
DNS\_init(SOCK_DNS, data_buffer);
uint32\_t try = 0;
int ret = 0;
while (1) {
// 执行DNS查询
if ((ret = DNS\_run(dns_server, WEB_SERVER_NAME, web_server_ip)) > 0) {
printf("dns server responsed\r\n");
break;
}
try++;
printf("dns client try %d...\r\n", try);
HAL\_Delay(1000);
}
printf("web server ip:%d.%d.%d.%d\r\n", web_server_ip[0], web_server_ip[1],
web_server_ip[2], web_server_ip[3]);
#endif

/\* USER CODE END 2 \*/

/\* Infinite loop \*/
/\* USER CODE BEGIN WHILE \*/
while (1) {
/\* USER CODE END WHILE \*/
//loopback\_tcpc(0, (uint8\_t\*) recv\_buff, destip, destport);
/\* USER CODE BEGIN 3 \*/
}
/\* USER CODE END 3 \*/
}

文章来源: https://iotsmart.blog.csdn.net/article/details/125925623