w5100实现dns解析功能

w5100实现dns解析功能


本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明.


环境:

主机:WIN7

开发环境:MDK4.72

MCU:STM32F103ZE


说明:

在项目中我要搭建一个服务器,服务器域名固定,但ip是动态的.每一个带w5100的板子需要解析dns,获得服务器ip.


dns协议格式:

参考链接:http://blog.csdn.net/wangyifei0822/article/details/2316857


源代码:

dns请求:

/*********************************************************************
*							dns请求
*参数:socket:端口
*     url:目标url
*     dns_ip:dns服务器ip
**********************************************************************/

void inf_w5100_dns_query(uint8_t socket,char *url,uint8_t *dns_ip)
{
	uint8_t data[100] = {0};
	uint8_t i = 0;
	uint8_t j = 0;
	uint8_t str_len = 0;
	uint8_t index_num = 0;
	
	//dns标识字段
	data[i++] = (DNS_ID >> 8) & 0xff;
    data[i++] = DNS_ID & 0xff;
    //dns头
	data[i++] = 0x01;
	data[i++] = 0x00;
    data[i++] = 0x00;
    data[i++] = 0x01;
    data[i++] = 0x00;
    data[i++] = 0x00;
    data[i++] = 0x00;
    data[i++] = 0x00;
    data[i++] = 0x00;
    data[i++] = 0x00;
    //正文
	j = 0;
	str_len = 0;
	index_num = i++;
	while (1)
	{
		//判断是否到字符末尾
		if (url[j] == '\0')
		{
			data[index_num] = str_len;
			data[i++] = 0x00;
			break;
		}
		
		if (url[j] != '.')
		{
			data[i++] = url[j];
			str_len++;
		}
		else
		{
			//字符长度
			data[index_num] = str_len;
			str_len = 0;
			index_num = i++;
		}
		
		j++;
	}
	//dns尾
	data[i++] = 0x00;
	data[i++] = 0x01;
	data[i++] = 0x00;
	data[i++] = 0x01;
    
    //发送
    inf_w5100_write_data(socket, data, i,dns_ip,53);
}


dns解析:

/*********************************************************************
*							dns响应
*参数:data:接收的数据
*     size:数据长度,单位字节
**********************************************************************/

void inf_w5100_dns_response(uint8_t *data,uint16_t size)
{
    uint8_t i = 0;
    
    for (i = 0;i < 4;i++)
    {
        Server_Ip[i] = data[size - 4 + i];
    }
}

说明:

因为我不需要解析出的dns的ip列表,而只需要一个ip.所以简便起见,我直接取最后一个ip为服务器ip.



你可能感兴趣的:(w5100实现dns解析功能)