新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 嵌入式Linux網絡編程之:實驗內容——NTP協議實現

        嵌入式Linux網絡編程之:實驗內容——NTP協議實現

        作者: 時間:2013-09-13 來源:網絡 收藏

        本文引用地址:http://www.104case.com/article/257114.htm

        /*獲取NTP時間*/

        intget_ntp_time(intsk,structaddrinfo*addr,structntp_packet*ret_time)

        {

        fd_setpending_data;

        structtimevalblock_time;

        chardata[NTP_PCK_LEN*8];

        intpacket_len,data_len=addr->ai_addrlen,count=0,result,i,re;

        if(!(packet_len=construct_packet(data)))

        {

        return0;

        }

        /*客戶端給服務器端發送數據包*/

        if((result=sendto(sk,data,

        packet_len,0,addr->ai_addr,data_len))0)

        {

        perror(sendto);

        return0;

        }

        /*調用select()函數,并設定超時時間為1s*/

        FD_ZERO(pending_data);

        FD_SET(sk,pending_data);

        block_time.tv_sec=10;

        block_time.tv_usec=0;

        if(select(sk+1,pending_data,NULL,NULL,block_time)>0)

        {

        /*接收服務器端的信息*/

        if((count=recvfrom(sk,data,

        NTP_PCK_LEN*8,0,addr->ai_addr,data_len))0)

        {

        perror(recvfrom);

        return0;

        }

        if(protocol==TIME)

        {

        memcpy(ret_time->transmit_timestamp,data,4);

        return1;

        }

        elseif(countNTP_PCK_LEN)

        {

        return0;

        }

        /*設置接收NTP包的數據結構*/

        ret_time->leap_ver_mode=ntohl(data[0]);

        ret_time->startum=ntohl(data[1]);

        ret_time->poll=ntohl(data[2]);

        ret_time->precision=ntohl(data[3]);

        ret_time->root_delay=ntohl(*(int*)(data[4]));

        ret_time->root_dispersion=ntohl(*(int*)(data[8]));

        ret_time->reference_identifier=ntohl(*(int*)(data[12]));

        ret_time->reference_timestamp.coarse=ntohl*(int*)(data[16]));

        ret_time->reference_timestamp.fine=ntohl(*(int*)(data[20]));

        ret_time->originage_timestamp.coarse=ntohl(*(int*)(data[24]));

        ret_time->originage_timestamp.fine=ntohl(*(int*)(data[28]));

        ret_time->receive_timestamp.coarse=ntohl(*(int*)(data[32]));

        ret_time->receive_timestamp.fine=ntohl(*(int*)(data[36]));

        ret_time->transmit_timestamp.coarse=ntohl(*(int*)(data[40]));

        ret_time->transmit_timestamp.fine=ntohl(*(int*)(data[44]));

        return1;

        }/*endofifselect*/

        return0;

        }

        linux操作系統文章專題:linux操作系統詳解(linux不再難懂)


        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 右玉县| 合山市| 阳江市| 大港区| 江城| 上林县| 乌苏市| 邻水| 宿迁市| 莱芜市| 蒲江县| 肃南| 高阳县| 湘西| 汾西县| 临武县| 花莲市| 湟源县| 泸水县| 东乡族自治县| 黔东| 轮台县| 十堰市| 阜宁县| 徐汇区| 遵化市| 大新县| 福鼎市| 图木舒克市| 昭觉县| 柏乡县| 湖北省| 泽州县| 华安县| 西和县| 松溪县| 文登市| 郴州市| 德江县| 盐池县| 麦盖提县|