读书人

UDP发包提速的有关问题

发布时间: 2012-03-28 15:40:03 作者: rapoo

UDP发包提速的问题
各位大侠们,帮我看下,这段代码,我想平均快速发送UDP包,计划每200 us发一个包,可是测试时总不能平均发送,速度也提不上来,不知道是怎么;回事~~~

C/C++ code
#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>#include<pthread.h>#include<math.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//3600s*24h*(365days*70years+17days)#define  From00to70 0x83aa7e80U#define  NTPSVR            "192.168.2.30"                        //MY server//#define  LOCAL              "192.168.2.109"#define  LOCALPORT       8000#define  NTPPORT           123  int                pthreads                    =  0;            //定义线程的数量#define            timer                      200                   // 计算每x us发一个包                 long int           total_pkt             =   0;                       //   计算发包量,初始化为0个   int                 maxpkt                 =   0  ;               //一次发包量   int                 counter                =      0;            //发送临时算数器int                 fd[2];int                 send_tmp             =     0;                 //发送临时计数器int                 rec_maxpkt;                                   //接收总量int                 rec_pkt                =     0;              //接收计数     pthread_mutex_t ntppack_mutex = PTHREAD_MUTEX_INITIALIZER;//init pthreadpthread_mutex_t newpack_mutex = PTHREAD_MUTEX_INITIALIZER;//init pthread  int32  sockfd;  struct timeval tv_start,tv_end;  struct timezone tz_start,tz_end;  struct sockaddr_in addr,local_addr;     pthread_t tidA;/**NTP包的结构**/typedef 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);}/**按给定的要求每x us 发送一个请求**/void *send_pkt(void *);void  *send_pkt  (void *vptr)   {     //every pthread need send X packets         int  num =0;    struct timeval tv_send_start,tv_send_end;    struct timezone tz_send_start,tz_send_end;    for(num;num<maxpkt;num++)        {                   pthread_mutex_trylock(&ntppack_mutex);                     //加锁            counter=send_tmp+1;                 //发送数据请求包         sendto(sockfd,&ntppack,sizeof(ntppack),0,                                  (struct sockaddr *)&addr,sizeof(struct sockaddr));                    send_tmp=counter;                 printf(" A have been send  %d  packets\n",counter);                 pthread_mutex_unlock(&ntppack_mutex);                  //解锁       usleep(timer);     //计算每X us发一个请求          }  volatile pid_t pid;int create_fork(){  int num_fork=0;  for (num_fork;num_fork<4;num_fork++)      pid=fork();  return pid;}int main( ){  int    tid_capacity  =  0;                            //第几个线程  int rebind_port = 1;    int counterA=0,counterA2=0,counterB=0,counterB2=0,counterC=0,counterC2=0,counterD=0,counterD2=0;    int counter_tmp=0;   int fork_process=0;   printf("How many packets do you want to send :");  scanf("%ld",&total_pkt); printf("How many pthreads do you need: "); scanf("%d",&pthreads); maxpkt=total_pkt/pthreads; //服务器结构填充   addr.sin_family=AF_INET;   //IPV4协议   addr.sin_port =htons(NTPPORT);   //NTP专用的123端口   addr.sin_addr.s_addr=inet_addr(NTPSVR);   //校时服务器   bzero(&(addr.sin_zero),8);   //清零  //本地信息结构填充   local_addr.sin_family=AF_INET;   local_addr.sin_port=htons(LOCALPORT);   local_addr.sin_addr.s_addr=INADDR_ANY;                                    //inet_addr(LOCAL);   bzero(&(local_addr.sin_zero),8);          NTP_Init();       int status;   gettimeofday(&tv_start,&tz_start);   create_fork();        if(pid>0)        {            for (tid_capacity;tid_capacity<pthreads;tid_capacity++)         {             if((sockfd=socket(AF_INET,SOCK_DGRAM,0))<0)            {            perror("create socket error!\n");             exit(1);            }                           pthread_create (&tidA,NULL,send_pkt,NULL);            //创建线程              pthread_join (tidA,NULL);                                    //回收线程                                     close(sockfd);          }        waitpid(pid,&status,0);        printf("status %d\n",status);     }         else if(pid==0)        {       for (tid_capacity;tid_capacity<pthreads;tid_capacity++)           {                  if((sockfd=socket(AF_INET,SOCK_DGRAM,0))<0)               {                perror("create socket error!\n");                exit(1);                }            pthread_create (&tidA,NULL,send_pkt,NULL);            //创建线程                 pthread_join (tidA,NULL);                                    //回收线程                                        close(sockfd);           }          }     gettimeofday(&tv_end,&tz_end);     printf("use pthreads = %d\n",pthreads);     printf("%d us send a packet\n",timer);         long long use_time=1000000*((long long)tv_end.tv_sec - (long long)tv_start.tv_sec)                                           +(tv_end.tv_usec-tv_start.tv_usec);     printf("total run time %lld us\n",use_time );     exit(1);    } 



[解决办法]
这个 线程id 是不是有问题?? 是这个吧 &tid_capacity, 否则好多线程共用了 tidA, 这个不可重入啊。

读书人网 >UNIXLINUX

热点推荐