【原】socket通信实现域名解析

//extern     unsigned char gSntpServerIP[20];
int GetNTPTime(unsigned char *ntpServerIP,unsigned int ntpPort,unsigned int  *data)  
{  
    int sockfd=0;  
    char ntpServerName[20];
    
      
    STNP_Header H_NTP;        
    
    H_NTP.LiVnMode = 0x1b;//LI(2bit )  VN(3bit 版本)      Mode(3bit客户端模式)  
    H_NTP.Stratum = STRATUM;
    H_NTP.Poll = POLL;
    H_NTP.Precision =PREC;
    
    memset(ntpServerName,0,sizeof(ntpServerName));
    sprintf(ntpServerName,"%s",ntpServerIP);

    NF_LOG(DEBUG_K,"@_@,sync time from %s,H_NTP.Stratum=%d\n", ntpServerName,H_NTP.Stratum); 

    #if 0//不能解析域名的方式
    struct sockaddr_in server;
    server.sin_family = AF_INET;  
    server.sin_addr.s_addr = gethostIPbyname((const char*)ntpServerName);  
    server.sin_port = htons(ntpPort);
    if(-1 == (int)server.sin_addr.s_addr)  
    {
        NF_LOG(ERROR_L,"[%s,%d]s_addr error...\n",__FUNCTION__,__LINE__);
        return -1;  
    }
    
    sockfd = socket(AF_INET, SOCK_DGRAM, 0);  
    if(sockfd<0)  
    {  
        NF_LOG(ERROR_L,"[%s,%d]socket error...\n",__FUNCTION__,__LINE__);
        return -1;  
    }
    #endif

    
    #if 1//getaddrinfo可以解析域名的方式
    int  rc;
    addrinfo hin
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个简单的用C语言实现DNS域名解析通过UDP实现client端与localserver通信的例子代码: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <sys/socket.h> #include <netinet/in.h> #include <netdb.h> #define SERVER "127.0.0.1" // localserver地址 #define BUFLEN 512 // 缓冲区长度 #define PORT 53 // DNS服务器端口号 void error(const char *msg) { perror(msg); exit(1); } int main(int argc, char **argv) { struct sockaddr_in si_other; // server地址 int s, slen = sizeof(si_other), i; char buf[BUFLEN]; if (argc < 2) { printf("Usage: %s <hostname>\n", argv[0]); return 0; } // 创建socket if ((s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1) { error("socket"); } // 设置server地址 memset((char *) &si_other, 0, sizeof(si_other)); si_other.sin_family = AF_INET; si_other.sin_port = htons(PORT); if (inet_aton(SERVER, &si_other.sin_addr) == 0) { fprintf(stderr, "inet_aton() failed\n"); exit(1); } // 构造DNS请求报文 char hostname[100]; strcpy(hostname, argv[1]); for (i = 0; i < strlen(hostname); i++) { if (hostname[i] == '.') { hostname[i] = i - (i > 0 ? 1 : 0); } } int len = strlen(hostname) + 1; char dns_query[len + 16]; memset(dns_query, 0, len + 16); dns_query[1] = 1; dns_query[len + 15] = 1; for (i = 0; i < len; i++) { dns_query[i + 12] = hostname[i]; } // 发送请求报文 if (sendto(s, dns_query, len + 16, 0, (struct sockaddr *) &si_other, slen) == -1) { error("sendto"); } // 接收响应报文 if (recvfrom(s, buf, BUFLEN, 0, (struct sockaddr *) &si_other, &slen) == -1) { error("recvfrom"); } // 解析响应报文 int answer_len = ntohs(*(unsigned short *)(buf + 6)) + 12; char answer[answer_len]; memcpy(answer, buf, answer_len); struct sockaddr_in addr; memcpy(&addr.sin_addr, answer + answer_len - 4, 4); printf("%s: %s\n", argv[1], inet_ntoa(addr.sin_addr)); close(s); return 0; } ``` 该例子通过构造DNS请求报文,发送UDP数据包到localserver,接收localserver返回的响应报文,并解析出IP地址。 注意:该例子只适用于IPv4地址解析。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值