?
Hallo,
ich habe als Anfänger einige Schwierigkeiten folgendes Programm periodisch als Schleife abzuarbeiten.
Es handelt sich um ein tool des IPC@Chip von Beck und liefert diesem Zeit und Datum eines Zeitservers, allerdings im Normalfall eben nur einmal bei starten des Prgorammes.
// Defines
/*************************************************************************/
#define _DEBUG_
#define TIMEZONE 6
#define CLOCK_OFFSET_1970 2208988800l
/*************************************************************************/
// NTP structure declaration
/*************************************************************************/
typedef struct _SNTPHDR
{
unsigned char LI_VN_Mode;
unsigned char Stratum;
unsigned char Poll;
unsigned char Precision;
unsigned long Root_Delay;
unsigned long Root_Dispersion;
unsigned long Reference_Identifier;
unsigned long Reference_Timestamp1;
unsigned long Reference_Timestamp2;
unsigned long Originate_Timestamp1;
unsigned long Originate_Timestamp2;
unsigned long Receive_Timestamp1;
unsigned long Receive_Timestamp2;
unsigned long Transmit_Timestamp1;
unsigned long Transmit_Timestamp2;
} SNTPHDR;
/*************************************************************************/
// Variables
/*************************************************************************/
SNTPHDR sntphdr, recvhdr;
int error;
int sd;
struct sockaddr_in saddr, addr;
unsigned long ip;
unsigned long datetime, tmp;
struct date dt;
struct time tm;
char *month[] = {"---", "Jan", "Feb", "Mar", "Apr", "May", "Jun",
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
union REGS inregs, outregs;
int result;
/*************************************************************************/
// Set the version in the NTP structure
/*************************************************************************/
void setversion(unsigned char version, SNTPHDR *hdr)
{
if (hdr == NULL) return;
hdr->LI_VN_Mode |= ((version & 0x07) << 3);
}
/*************************************************************************/
// Set the mode in the NTP structure
/*************************************************************************/
void setmode(unsigned char mode, SNTPHDR *hdr)
{
if (hdr == NULL) return;
hdr->LI_VN_Mode |= (mode & 0x07);
}
int main(int argc, char **argv)
{
while (1)
{
api_sleep (10000);
if (argc != 2)
{
printf("\nUsage: %s <server-ip>\n", argv[0]);
return 0;
}
// prepare the structures
memset(&sntphdr, 0, sizeof(SNTPHDR));
memset(&recvhdr, 0, sizeof(SNTPHDR));
setversion(3, &sntphdr);
setmode(3, &sntphdr);
// send request to NTP server and receive response
sd = opensocket(SOCK_DGRAM, &error);
if (sd == API_ERROR)
{
#ifdef _DEBUG_
printf("\nOpen socket error: %d!!!\n", error);
#endif
return 0;
}
inet_addr(argv[1], &ip); // parameter 1 = server ip address
saddr.sin_family = AF_INET;
saddr.sin_port = htons(123); // NTP port 123
saddr.sin_addr.s_addr = ip;
result = sendto(sd, (char*)&sntphdr, sizeof(SNTPHDR), MSG_BLOCKING, (struct sockaddr*)&saddr, &error);
if (result == API_ERROR)
{
#ifdef _DEBUG_
printf("\nSend error: %d!!!\n", error);
#endif
return 0;
}
memset(&addr, 0, sizeof(struct sockaddr));
addr.sin_family = AF_INET;
result = recvfrom(sd, (char*)&recvhdr, sizeof(SNTPHDR), MSG_TIMEOUT, 10000l, (struct sockaddr*)&addr, &error);
closesocket(sd, &error);
if (result == 0)
{
#ifdef _DEBUG_
printf("\nTimeout!!!\n");
#endif
return 0;
}
// date and time translation
datetime = recvhdr.Transmit_Timestamp1;
tmp = (datetime & 0xFF000000l) >> 24; // *******************************
tmp |= (datetime & 0x00FF0000l) >> 8; // translate it in the right
tmp |= (datetime & 0x0000FF00l) << 8; // format
tmp |= (datetime & 0x000000FFl) << 24; // *******************************
datetime = tmp - CLOCK_OFFSET_1970;
unixtodos(datetime, &dt, &tm);
printf("Time: %02d:%02d:%02d\n", tm.ti_hour+TIMEZONE, tm.ti_min, tm.ti_sec);
printf("Date: %d %s %d\n", dt.da_day, month[dt.da_mon], dt.da_year);
// set date
inregs.h.ah = 0x2B;
inregs.x.cx = dt.da_year;
inregs.h.dh = dt.da_mon;
inregs.h.dl = dt.da_day;
int86(0x21, &inregs, &outregs);
// set time
inregs.h.ah = 0x2D;
inregs.h.ch = tm.ti_hour+TIMEZONE;
inregs.h.cl = tm.ti_min;
inregs.h.dh = tm.ti_sec;
int86(0x21, &inregs, &outregs);
return 0;
}
}
Die While (1) - Schleife in der main wurde von mir implementiert. Danach läuft das Programm wie gehabt einmal ordnungsgemäß, liefert aber bei den weiteren Durchläufen immer Error.
Kann mir hier jemand weiterhelfen?
Vielen Dank