1、DNS域名解析espconn_gethostbyname、DNS域名解析完的回调函数
void ICACHE_FLASH_ATTR DNS_callback(const char *name,ip_addr_t *ipaddr,void* arg)
espconn_gethostbyname(&ST_NetCon,RATION_SITE,&site_ip,DNS_callback);
espconn_gethostbyname第三个参数,并不是存解析后的IP地址,而是在回调函数的参数ipaddr里;
回调函数是有一定格式的,要在DNS的回调里利用ipaddr得到解析出的IP地址,然后赋值到arg的网络传输结构体的remote_ip中,利用arg来建立TCP连接,用之前的ST_NetCon是无法建立TCP连接的;
2、关键代码
//初始化TCP通信,端口8266;
void ICACHE_FLASH_ATTR TCP_port8266_init()
{
ST_NetCon.type = ESPCONN_TCP; //通信协议:TCP
ST_NetCon.proto.tcp = (esp_tcp *)os_zalloc(sizeof(esp_tcp));// 申请内存
ST_NetCon.proto.tcp->local_port = 8266 ; // 设置本地端口
ST_NetCon.proto.tcp->remote_port = 80;
espconn_gethostbyname(&ST_NetCon,RATION_SITE,&site_ip,DNS_callback);
espconn_regist_connectcb(&ST_NetCon,TCP_connect_callback); //建立TCP连接后回调
espconn_regist_reconcb(&ST_NetCon,TCP_reconncect_callback); //TCP异常断开连接
}
//解析完域名的回调函数
void ICACHE_FLASH_ATTR DNS_callback(const char *name,ip_addr_t *ipaddr,void* arg)
{
struct espconn * t_arg = arg;
if(ipaddr == NULL){
os_printf("DNS FAIL!\n"); //DNS解析失败
}else{
if(ipaddr->addr != 0){
os_printf("\nDNS OK!\n"); //DNS解析成功
//site_ip.addr = ipaddr->addr;
os_printf("%d,%d\n",ipaddr->addr,site_ip.addr);
os_memcpy(t_arg->proto.tcp->remote_ip,&ipaddr->addr,4);
os_printf("www.rationmcu.com IP = %d.%d.%d.%d\n",
*((u8*)&ipaddr->addr), *((u8*)&ipaddr->addr+1),
*((u8*)&ipaddr->addr+2),*((u8*)&ipaddr->addr+3));
//ESP8266作为客户端,是向服务器申请TCP连接
espconn_connect(t_arg);
}
}
}
3、结果
4、DNS的IP地址
DNS服务器解析域名的IP,DNS也有自己的IP地址,这个IP地址是出厂设置好的, 也可以自行修改;
刚找了一圈,SDK里只有espconn_dns_setserver没有手册里的getserver呀,这样的发,,咱也不知道里面DNS服务器的IP,咱也不改了。