- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我无法理解我的代码的问题。
//SNTP Client
#include <inttypes.h> //(since C99) Format conversion of integer types
#include <stdio.h> //Input/output example printf
#include <stdlib.h> //General utilities: memory management, program utilities, string conversions, random numbers
#include <unistd.h> //standard symbolic constants and types
#include <string.h> //string operations
#include <sys/types.h> //data types
#include <sys/socket.h> //Internet Protocol family
#include <netinet/in.h> //Internet address family
#include <netdb.h> //definitions for network database operations
#include <time.h> //time types
#include <sys/time.h> //time types
#include <arpa/inet.h> //definitions for internet operations
//#include<linux/time.h>//time types in linux
//struct for gettimeofday
typedef struct {
long tv_sec;
long tv_usec;
} timeval;
struct packets
{
uint8_t LIVNMODE;
uint8_t startum;
uint8_t poll;
uint8_t precision;
uint32_t Root_Delay;
uint32_t Root_Dispersion;
uint32_t Ref_Identifier;
uint32_t Ref_T;
uint32_t Ref_Tp2;
uint32_t Origin_T;
uint32_t Origin_Tp2;
uint32_t Receive_T;
uint32_t Receive_Tp2;
uint32_t T_T;
uint32_t T_Tp2;
};
int main(int argc, char *argv[])
{
int sock_desc;
socklen_t len;
int today_time;
struct sockaddr_in Cli_addr,Serv_addr;
struct packets message_send;
struct packets message_receive;
//add all packets in initialization
//LI, VN and MODE in a one bytes as a 00 100 011 eg VN=4
message_send.LIVNMODE=0b00100011;
message_send.startum=0;
message_send.poll=0;
message_send.precision=0;
message_send.Root_Delay=0;
message_send.Root_Dispersion=0;
message_send.Ref_Identifier=0;
message_send.Ref_T=0;
message_send.Ref_Tp2=0;
message_send.Origin_T=0;
message_send.Origin_Tp2=0;
message_send.Receive_T=0;
message_send.Receive_Tp2=0;
message_send.T_T=0;
message_send.T_Tp2=0;
message_receive.Ref_T=0;
message_receive.Ref_Tp2=0;
message_receive.Origin_T=0;
message_receive.Origin_Tp2=0;
message_receive.Receive_T=0;
message_receive.Receive_Tp2=0;
message_receive.T_T=0;
message_receive.T_Tp2=0;
char * HOSTADDRESS;
int PORT;
if (argc>=2){
HOSTADDRESS=(char *)argv[1];
PORT = atoi(argv[2]);
}
else{
printf("--------------------------------------------\n");
printf("usage: ./file.out HOST_ADDRESS PORT \n");
printf("--------------------------------------------\n");
return -1;
}
if ((sock_desc = socket(AF_INET,SOCK_DGRAM,0)) < 0){
printf("Error: can't create the socket ");
return -1;
}
len=sizeof(struct sockaddr_in);
bzero((char *) &Serv_addr,sizeof(Serv_addr));
Serv_addr.sin_family = AF_INET;
Serv_addr.sin_addr.s_addr=inet_addr(HOSTADDRESS);
Serv_addr.sin_port=ntohs(PORT);
if(sendto(sock_desc,&message_send,sizeof(message_send),0,(struct sockaddr *)&Serv_addr,len) < 0){
printf("Error: can not send a message on a socket");
return -1;
}
if(recvfrom(sock_desc,&message_receive,sizeof(message_receive),0,(struct sockaddr *)&Cli_addr,&len) < 0){
printf("Error: can not receive a message on a socket");
return -1;
}
printf("message_receive.Ref_T: %" PRIu32 "\n",message_receive.Ref_T);
printf("message_receive.Ref_Tp2: %" PRIu32 "\n",message_receive.Ref_Tp2);
printf("message_receive.Origin_T: %" PRIu32 "\n",message_receive.Origin_T);
printf("message_receive.Origin_Tp2: %" PRIu32 "\n",message_receive.Origin_Tp2);
printf("message_receive.Receive_T: %" PRIu32 "\n",message_receive.Receive_T);
printf("message_receive.Receive_Tp2: %" PRIu32 "\n",message_receive.Receive_Tp2);
printf("message_receive.T_T: %" PRIu32 "\n",message_receive.T_T);
printf("message_receive.T_Tp2: %" PRIu32 "\n",message_receive.T_Tp2);
int receive_T=ntohl(message_receive.Receive_T);
today_time = receive_T-2208988800;
printf("Today time is: %s",ctime((const long *)&today_time));
}
此代码是我的 perl 代码的翻译版本。我了解收到的消息值与服务器发送的消息值不同。因为我正在查看 wireshark,它正在发送正确的数据包,但无法理解如何修复它。
编辑:所以我必须直截了当。这是输出!日期总是不同的。
输出1:
message_receive.Ref_T: 4232652250
message_receive.Ref_Tp2: 684824910
message_receive.Origin_T: 0
message_receive.Origin_Tp2: 0
message_receive.Receive_T: 1112352218
message_receive.Receive_Tp2: 1556395294
message_receive.T_T: 1112352218
message_receive.T_Tp2: 2125642782
Today time is: Tue Dec 26 01:44:10 4248
1 分钟后另一个输出 2:
message_receive.Ref_T: 4232652250
message_receive.Ref_Tp2: 684824910
message_receive.Origin_T: 0
message_receive.Origin_Tp2: 0
message_receive.Receive_T: 3796706778
message_receive.Receive_Tp2: 260377675
message_receive.T_T: 3796706778
message_receive.T_Tp2: 3180073547
Today time is: Mon Dec 11 17:18:34 4197
请帮忙!!!
最佳答案
服务器以网络字节序发送数据,您需要将它们转换为主机字节序。请参阅 ntohs()、ntohl()
。
关于c - SNTP 客户端版本 4,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34439841/
我无法理解我的代码的问题。 //SNTP Client #include //(since C99) Format conversion of integer types #include
SNTP 是对完整 NTP 规范的简化。 我想对集成在 Windows XP 中的内部 SNTP 服务器使用完整的 NTP 客户端。这会起作用还是 NTP 客户端需要一个完整的 NTP 服务器才能工作
我需要帮助来完成以下脚本: import socket import struct import sys import time NTP_SERVER = '0.uk.pool.ntp.org' TI
我正在尝试使用 lwip netconn API(使用 esp-open-rtos)为 ESP8266 编写简单的 SNTP 客户端。问题是我无法从服务器收到答案。 代码(没有错误检查和调试消息):
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: Is there any C/C++ library to connect with a remote NT
我正在用 c/c++ 搜索从服务器 (ntp.belnet.be) 获取时间和日期的工作代码。它使用 UDP 并使用端口 123。 有人可以帮忙吗? //sending pakket memset(&
我是一名优秀的程序员,十分优秀!