|
虽说有些路由器菜单里支持DDNS,但很多都不能用。
最气人的是新弄到DLINK路由器,注_册了个帐号,居然几天之后才给回复了个激活邮件,TNND,早就过了48小时了。
免费的DDNS很多,不过有些用起来比较麻烦。
试验了几个,发现 www.myfreeip.me 不错。
myfreeip同样提供了一个客户端,不过IP地址的更新仍然使用的是www服务,Base Auth。
下面这个例子只是最初试验用的东西,没有使用 NutEncodeBase64 函数,直接用抓取封包分析之后得到的编码。
NutThreadCreate("t1", ddns_client, 0, 201);
THREAD(ddns_client, arg)
{
unsigned int t;
char ddns_server_str[]="173.225.1.91";
char ddns_request1[] = "GET /client/update.aspx?host=test.myfreeip.info HTTP/1.1\r\nUser-Agent: DDNS-Enterprise-Client-v2.0\r\nHost: www.myfreeip.me\r\n\r\n";
char ddns_request2[] = "GET /client/update.aspx?host=test.myfreeip.info HTTP/1.1\r\nUser-Agent: DDNS-Enterprise-Client-v2.0\r\nAuthorization: Basic aHDGSXVsaWFuZ0BDFAFpbC5jb308aHlsODAzMQ==\r\nHost: www.myfreeip.me\r\n\r\n";
TCPSOCKET * sock;
NutThreadSetPriority(150);
for(;;){
if ((sock = NutTcpCreateSocket()) != 0) {
if (NutTcpConnect(sock, inet_addr(ddns_server_str), 80) == 0)
{
#ifdef DEBUG
puts("DDNS Server connected!");
#endif
NutTcpSend(sock, ddns_request1, strlen(ddns_request1));
NutDelay(100);
NutTcpSend(sock, ddns_request2, strlen(ddns_request2));
NutTcpCloseSocket(sock);
#ifdef DEBUG
puts("DDNS Server disconnected!");
#endif
}else{
puts("Can't connect DDNS server");
}
NutTcpCloseSocket(sock_2);
}
else
puts("Can't create tcp socket, maybe cause by no enough memory left.");
for(t=1;t<=100;t++)
NutSleep(1000); // 1000 ms
}
}
额外说明下,这并不是完整的代码,里面的域名和base64编码后的密码也都是虚构的,而且也缺少对服务器应答的解析。
基本验证需要两个过程,客户端发起请求-->服务器应答(要求验证)-->客户端再次发起请求(发送帐号密码)。
这里host=test.myfreeip.info中的域名即为帐号,Authorization: Basic aHDGSXVsaWFuZ0BDFAFpbC5jb308aHlsODAzMQ==
比较乱的字符就是经base64编码后的密码了。
这是抓包后得到的一个例子。注意其中的回车换行。
点击此处下载 ourdev_683146H6IAMQ.txt(文件大小:857字节) (原文件名:exam.txt)
基本上可以说,在嵌入式设备式设备上实现DDNS客户端,可以解决家庭用户的域名问题,尤其是在使用了不具有DDNS功能的路由器的时候。 |
阿莫论坛20周年了!感谢大家的支持与爱护!!
知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
|