首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 操作系统 > UNIXLINUX >

NTP服务器接收端的有关问题

2012-02-24 
NTP服务器接收端的问题急急~~~~~为了测试NTP服务器的处理能力,写了两个文档,一个用来专门发送请求,一个专

NTP服务器接收端的问题
急急~~~~~
为了测试NTP服务器的处理能力,写了两个文档,一个用来专门发送请求,一个专门用来接收服务器返回的请求。我的发送端分可以正常发数据,但是接收那一端却是一个数据也收不到,将两个整合在一起却又可以正常收发,弄不明白是为什么?原来想用bind()来绑定一个NTP端口的,但是运行时提示“无法分配请求的地址”,百思不得其解。后来将端口改大了,就可以通过,但是我要的NTP专用的端口 123,请问如何解决接收数据的问题啊?用了那些强制允许重复绑定的函数也不能正常运行,还是提示“bind error: Cannot assign requested address
”不知道哪位大侠能指点下小弟,感激不尽。


接收端的代码如下:

C/C++ code
//ntp_rev.c#include <stdio.h>#include <stdlib.h>#include <string.h>#include <sys/wait.h>#include <sys/socket.h>#include <sys/types.h>#include <sys/time.h>#include <netinet/in.h>#include <netdb.h>#include <unistd.h>#include <arpa/inet.h>#include <sys/ioctl.h>#define  int8      char#define  uint8     unsigned char#define  uint32    unsigned int#define  ulong32   unsigned long#define  long32    long#define  int32     int#define  long64    long long#define  debug //3600s*24h*(365days*70years+17days)#define  From00to70 0x83aa7e80U#define  NTPSVR  "192.168.2.8"        //myserver#define  NTPPORT  123typedef struct NTPPACKET{  uint8     li_vn_mode;  uint8     stratum;  uint8     poll;  uint8     precision;                                         //有符号整数表示本地时钟精确度  ulong32   root_delay;                                   //到达服务器的一次往返的总延时,是15到16位有符号的定点小数  ulong32   root_dispersion;                           // 到达服务器的一次标准误差,是15-16位的无符号的定点小数  int8      ref_id[4];  ulong32   reftimestamphigh;                      //本地时钟最后被设定或校正的时间T4  ulong32   reftimestamplow;  ulong32   oritimestamphigh;                //向服务器请求分离客户机的时间戳,采用64位时标格式T1  ulong32   oritimestamplow;  ulong32   recvtimestamphigh;             //向服务器请求到客户机的时间戳,采用64位时标格式T2  ulong32   recvtimestamplow;  ulong32   trantimestamphigh;           //向客户机答复分离服务器的时间戳,采用64位时标格式T3,用T3来校正本地时间   ulong32   trantimestamplow;}NTPPacket;NTPPacket  ntppack,newpack;//定义为long64,解决32位数的符号位问题long64   firsttimestamp,finaltimestamp;long64   diftime,delaytime;void NTP_Init(){  bzero(&ntppack,sizeof(ntppack));  ntppack.li_vn_mode=0x1b;//0|(3<<2)|(3<<5);  //获取初始时间戳T1  firsttimestamp="From00to70"+time(NULL);//-8*3600;  ntppack.oritimestamphigh=htonl(firsttimestamp);}int main(){//  ulong32 clienttime;//  ulong32 diftime,firsttimestamp,finaltimestamp; // fd_set  inset1;  int32  sockfd;  struct timeval tv,tv1;  struct timezone tz;  struct sockaddr_in addr;  addr.sin_family=AF_INET;   //IPV4协议  addr.sin_port =htons(NTPPORT);   //NTP专用的123端口  addr.sin_addr.s_addr=inet_addr(NTPSVR);//INADDR_ANY,NTPSVR;   //校时服务器  bzero(&(addr.sin_zero),8);   //清零    /*build a socket */  if((sockfd=socket(AF_INET,SOCK_DGRAM,0))<0)    {      perror("create socket error!\n");      exit(1);    }   /*bind a port*/      //  int  bDontLinger = 0;   //setsockopt( socket, SOL_SOCKET, SO_DONTLINGER, ( const char* )&bDontLinger, sizeof( int ) );//   int bReuseaddr=1;//   setsockopt(sockfd,SOL_SOCKET ,SO_REUSEADDR,(const char*)&bReuseaddr,sizeof(int));/*     if(bind(sockfd,(struct sockaddr *)&addr,sizeof(struct sockaddr))==-1)       {           perror("bind error");           exit(1);       }*/  while(1)   {          NTP_Init();       //发送数据请求包   //  sendto(sockfd,&ntppack,sizeof(ntppack),     //                                            0,(struct sockaddr *)&addr,sizeof(struct sockaddr));        // recvfrom(s,buffer,sizeof(buffer),0,&addr,&addr_len); //  sendto(s,buffer,len,0,&addr,addr_len);   int recvbyte=0;       printf("sockfd %d \n",sockfd);      recvbyte=recv(sockfd,&newpack,sizeof(newpack),0);   //接收数据在newpack中。        printf("OK %d  \n",recvbyte);     // printf("OK\n");       if(recvbyte<0)             {      perror("recv error!\n");      exit(1);      }  //  }   //到达客户机时间戳T4  finaltimestamp=time(NULL)+From00to70;//-8*3600;    //将网络上传送的大端数据改为小端形式。数据的转换方式 newpack.root_delay= ntohl(newpack.root_delay); newpack.root_dispersion= ntohl(newpack.root_dispersion); newpack.reftimestamphigh=ntohl(newpack.reftimestamphigh); newpack.reftimestamplow= ntohl(newpack.reftimestamplow); newpack.oritimestamphigh= ntohl(newpack.oritimestamphigh); newpack.oritimestamplow= ntohl(newpack.oritimestamplow); newpack.recvtimestamphigh= ntohl(newpack.recvtimestamphigh); newpack.recvtimestamplow= ntohl(newpack.recvtimestamplow); newpack.trantimestamphigh= ntohl(newpack.trantimestamphigh); newpack.trantimestamplow= ntohl(newpack.trantimestamplow); diftime=(5-9)>>1;  printf("Before Update ,Current time is...\n");  system("date");tv1.tv_sec=newpack.trantimestamphigh - From00to70;       //校对时间 settimeofday(&tv1,NULL); printf("Current time is...\n"); system("date"); usleep(3000000);}} 




[解决办法]
1024 以下的端口只有root用户可以使用

“将两个整合在一起却又可以正常收发” --这时候你是在哪个端口接收的报文?
[解决办法]
那你这样,发送/接收两个进程之间需要有某种通信方式了
接收进程怎么能知道发送进程绑定的端口呢

为什么要拆分为两个进程呢?
[解决办法]
貌似两个进程不能重复绑定同一个端口吧

热点排行