common.cpp 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. /*
  2. * comm.cpp
  3. *
  4. * Created on: Jul 29, 2017
  5. * Author: wangyu
  6. */
  7. #include "common.h"
  8. #include "log.h"
  9. raw_mode_t raw_mode=mode_faketcp;
  10. unordered_map<int, const char*> raw_mode_tostring = {{mode_faketcp, "faketcp"}, {mode_udp, "udp"}, {mode_icmp, "icmp"}};
  11. int socket_buf_size=1024*1024;
  12. static int random_number_fd=-1;
  13. uint64_t get_current_time()
  14. {
  15. timespec tmp_time;
  16. clock_gettime(CLOCK_MONOTONIC, &tmp_time);
  17. return tmp_time.tv_sec*1000+tmp_time.tv_nsec/(1000*1000l);
  18. }
  19. uint64_t pack_u64(uint32_t a,uint32_t b)
  20. {
  21. uint64_t ret=a;
  22. ret<<=32u;
  23. ret+=b;
  24. return ret;
  25. }
  26. uint32_t get_u64_h(uint64_t a)
  27. {
  28. return a>>32u;
  29. }
  30. uint32_t get_u64_l(uint64_t a)
  31. {
  32. return (a<<32u)>>32u;
  33. }
  34. char * my_ntoa(uint32_t ip)
  35. {
  36. in_addr a;
  37. a.s_addr=ip;
  38. return inet_ntoa(a);
  39. }
  40. void myexit(int a)
  41. {
  42. if(enable_log_color)
  43. printf(RESET);
  44. exit(a);
  45. }
  46. void init_random_number_fd()
  47. {
  48. random_number_fd=open("/dev/urandom",O_RDONLY);
  49. if(random_number_fd==-1)
  50. {
  51. mylog(log_fatal,"error open /dev/urandom\n");
  52. myexit(-1);
  53. }
  54. }
  55. uint64_t get_true_random_number_64()
  56. {
  57. uint64_t ret;
  58. read(random_number_fd,&ret,sizeof(ret));
  59. return ret;
  60. }
  61. uint32_t get_true_random_number()
  62. {
  63. uint32_t ret;
  64. read(random_number_fd,&ret,sizeof(ret));
  65. return ret;
  66. }
  67. uint32_t get_true_random_number_nz() //nz for non-zero
  68. {
  69. uint32_t ret=0;
  70. while(ret==0)
  71. {
  72. ret=get_true_random_number();
  73. }
  74. return ret;
  75. }
  76. uint64_t ntoh64(uint64_t a)
  77. {
  78. if(__BYTE_ORDER == __LITTLE_ENDIAN)
  79. {
  80. return __bswap_64( a);
  81. }
  82. else return a;
  83. }
  84. uint64_t hton64(uint64_t a)
  85. {
  86. if(__BYTE_ORDER == __LITTLE_ENDIAN)
  87. {
  88. return __bswap_64( a);
  89. }
  90. else return a;
  91. }
  92. void setnonblocking(int sock) {
  93. int opts;
  94. opts = fcntl(sock, F_GETFL);
  95. if (opts < 0) {
  96. mylog(log_fatal,"fcntl(sock,GETFL)\n");
  97. //perror("fcntl(sock,GETFL)");
  98. myexit(1);
  99. }
  100. opts = opts | O_NONBLOCK;
  101. if (fcntl(sock, F_SETFL, opts) < 0) {
  102. mylog(log_fatal,"fcntl(sock,SETFL,opts)\n");
  103. //perror("fcntl(sock,SETFL,opts)");
  104. myexit(1);
  105. }
  106. }
  107. /*
  108. Generic checksum calculation function
  109. */
  110. unsigned short csum(const unsigned short *ptr,int nbytes) {
  111. register long sum;
  112. unsigned short oddbyte;
  113. register short answer;
  114. sum=0;
  115. while(nbytes>1) {
  116. sum+=*ptr++;
  117. nbytes-=2;
  118. }
  119. if(nbytes==1) {
  120. oddbyte=0;
  121. *((u_char*)&oddbyte)=*(u_char*)ptr;
  122. sum+=oddbyte;
  123. }
  124. sum = (sum>>16)+(sum & 0xffff);
  125. sum = sum + (sum>>16);
  126. answer=(short)~sum;
  127. return(answer);
  128. }
  129. int set_buf_size(int fd)
  130. {
  131. if(setsockopt(fd, SOL_SOCKET, SO_SNDBUFFORCE, &socket_buf_size, sizeof(socket_buf_size))<0)
  132. {
  133. mylog(log_fatal,"SO_SNDBUFFORCE fail\n");
  134. myexit(1);
  135. }
  136. if(setsockopt(fd, SOL_SOCKET, SO_RCVBUFFORCE, &socket_buf_size, sizeof(socket_buf_size))<0)
  137. {
  138. mylog(log_fatal,"SO_RCVBUFFORCE fail\n");
  139. myexit(1);
  140. }
  141. return 0;
  142. }
  143. void INThandler(int sig)
  144. {
  145. if(enable_log_color)
  146. printf(RESET);
  147. myexit(0);
  148. }
  149. int numbers_to_char(id_t id1,id_t id2,id_t id3,char * &data,int &len)
  150. {
  151. static char buf[buf_len];
  152. data=buf;
  153. id_t tmp=htonl(id1);
  154. memcpy(buf,&tmp,sizeof(tmp));
  155. tmp=htonl(id2);
  156. memcpy(buf+sizeof(tmp),&tmp,sizeof(tmp));
  157. tmp=htonl(id3);
  158. memcpy(buf+sizeof(tmp)*2,&tmp,sizeof(tmp));
  159. len=sizeof(id_t)*3;
  160. return 0;
  161. }
  162. int char_to_numbers(const char * data,int len,id_t &id1,id_t &id2,id_t &id3)
  163. {
  164. if(len<int(sizeof(id_t)*3)) return -1;
  165. id1=ntohl( *((id_t*)(data+0)) );
  166. id2=ntohl( *((id_t*)(data+sizeof(id_t))) );
  167. id3=ntohl( *((id_t*)(data+sizeof(id_t)*2)) );
  168. return 0;
  169. }
  170. program_mode_t program_mode=unset_mode;//0 unset; 1client 2server