mscc.c 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372
  1. #include <winsock2.h>
  2. #include <ws2tcpip.h>
  3. #include <windows.h>
  4. #include <process.h>
  5. #include "../../../common/cf_platform.h"
  6. /*fuck vs-2013*/
  7. #pragma warning(disable: 4996)
  8. int su_platform_init()
  9. {
  10. struct WSAData wsa_data_;
  11. WSAStartup((WORD)MAKEWORD(2, 2), &wsa_data_);
  12. return 0;
  13. }
  14. int su_platform_uninit()
  15. {
  16. WSACleanup();
  17. return 0;
  18. }
  19. su_thread su_create_thread(char* name, su_thread_fun func, void* data)
  20. {
  21. return (su_thread)_beginthreadex(NULL, 0, (unsigned int(_stdcall*)(void*))func, data,
  22. 0, NULL);
  23. }
  24. void su_destroy_thread(su_thread thread)
  25. {
  26. return;
  27. }
  28. su_mutex su_create_mutex()
  29. {
  30. CRITICAL_SECTION* m = (CRITICAL_SECTION*)malloc(sizeof(CRITICAL_SECTION));
  31. InitializeCriticalSection(m);
  32. return (su_mutex)m;
  33. }
  34. void su_mutex_lock(su_mutex mutex)
  35. {
  36. EnterCriticalSection((CRITICAL_SECTION*)mutex);
  37. }
  38. int su_mutex_trylock(su_mutex mutex)
  39. {
  40. return !TryEnterCriticalSection((CRITICAL_SECTION*)mutex);
  41. }
  42. void su_mutex_unlock(su_mutex mutex)
  43. {
  44. LeaveCriticalSection((CRITICAL_SECTION*)mutex);
  45. }
  46. void su_destroy_mutex(su_mutex mutex)
  47. {
  48. DeleteCriticalSection((CRITICAL_SECTION*)mutex);
  49. free((void *)mutex);
  50. }
  51. typedef struct
  52. {
  53. HANDLE event;
  54. }su_cond_t;
  55. su_cond su_create_cond()
  56. {
  57. su_cond_t* cond = (su_cond_t *)malloc((size_t)sizeof(su_cond_t));
  58. cond->event = CreateEvent(NULL, FALSE, FALSE, NULL);
  59. return (su_cond *)cond;
  60. }
  61. void su_cond_wait(su_cond cond)
  62. {
  63. su_cond_t* c = (su_cond_t *)cond;
  64. WaitForSingleObject(c->event, INFINITE);
  65. }
  66. void su_cond_signal(su_cond cond)
  67. {
  68. su_cond_t* c = (su_cond_t *)cond;
  69. SetEvent(c->event);
  70. }
  71. void su_destroy_cond(su_cond cond)
  72. {
  73. su_cond_t* c = (su_cond_t *)cond;
  74. free((void *)c);
  75. }
  76. int64_t su_get_sys_time()
  77. {
  78. FILETIME ft;
  79. int64_t t;
  80. GetSystemTimeAsFileTime(&ft);
  81. t = (int64_t)ft.dwHighDateTime << 32 | ft.dwLowDateTime;
  82. return t / 10 - 11644473600000000; /* Jan 1, 1601 */
  83. }
  84. int su_udp_create(const char* ip, uint16_t port, su_socket* fd)
  85. {
  86. SOCKET s;
  87. SOCKADDR_IN addr;
  88. int buf_size = 1024 * 64;
  89. s = socket(AF_INET,SOCK_DGRAM,0);
  90. setsockopt(s, SOL_SOCKET, SO_RCVBUF, (void *)&buf_size, sizeof(int));
  91. setsockopt(s, SOL_SOCKET, SO_SNDBUF, (void *)&buf_size, sizeof(int));
  92. memset(&addr,0,sizeof(struct sockaddr_in));
  93. addr.sin_family = AF_INET;
  94. addr.sin_port = htons((u_short)port);
  95. addr.sin_addr.s_addr= htonl(INADDR_ANY);
  96. if (bind(s, (struct sockaddr *)&addr, sizeof(struct sockaddr)) < 0) {
  97. return -1;
  98. }
  99. *fd = s;
  100. return 0;
  101. }
  102. int su_tcp_create(su_socket* fd)
  103. {
  104. int buf_size = 16 * 2014;
  105. int enable = 1;
  106. int s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  107. if (s < 0)
  108. return -1;
  109. setsockopt(s, SOL_SOCKET, SO_RCVBUF, (const char *)&buf_size, sizeof(int));
  110. setsockopt(s, SOL_SOCKET, SO_SNDBUF, (const char *)&buf_size, sizeof(int));
  111. *fd = s;
  112. return 0;
  113. }
  114. int su_tcp_listen_create(uint16_t port, su_socket* fd)
  115. {
  116. int s;
  117. int buf_size;
  118. struct sockaddr_in addr;
  119. s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  120. if (s < 0)
  121. return -1;
  122. buf_size = 16 * 1024;
  123. setsockopt(s, SOL_SOCKET, SO_RCVBUF, (void *)&buf_size, sizeof(int32_t));
  124. setsockopt(s, SOL_SOCKET, SO_SNDBUF, (void *)&buf_size, sizeof(int32_t));
  125. addr.sin_family = AF_INET;
  126. addr.sin_addr.s_addr = htonl(INADDR_ANY);
  127. addr.sin_port = htons((u_short)port);
  128. if (bind((SOCKET)s, (const struct sockaddr *)&addr, (int)sizeof(struct sockaddr_in)) < 0){
  129. closesocket((SOCKET)s);
  130. return -1;
  131. }
  132. if (listen((SOCKET)s, 1024) == -1){
  133. closesocket((SOCKET)s);
  134. return -1;
  135. }
  136. *fd = s;
  137. return 0;
  138. }
  139. int su_socket_noblocking(int fd)
  140. {
  141. int mode = 1;
  142. ioctlsocket((SOCKET)fd, FIONBIO, (u_long FAR*)&mode);
  143. return 0;
  144. }
  145. int32_t su_udp_send(su_socket fd, su_addr* addr, void* buf, uint32_t len)
  146. {
  147. return sendto((SOCKET)fd, (const char*)buf, len, 0, (const struct sockaddr*)addr, (int)sizeof(struct sockaddr));
  148. }
  149. int32_t su_udp_recv(su_socket fd, su_addr* addr, void* buf, uint32_t len, uint32_t ms)
  150. {
  151. int32_t ret = -1;
  152. if (ms > 0){
  153. fd_set fds;
  154. struct timeval timeout = { 0, ms * 1000 };
  155. FD_ZERO(&fds);
  156. FD_SET(fd, &fds);
  157. switch (select(fd + 1, &fds, NULL, NULL, &timeout))
  158. {
  159. case -1:
  160. return -1;
  161. case 0:
  162. return 0;
  163. default:
  164. break;
  165. }
  166. if (!(FD_ISSET(fd, &fds)))
  167. return -1;
  168. }
  169. {
  170. int addr_len = sizeof(struct sockaddr_in);
  171. ret = recvfrom(fd, (char*)buf, len, 0, (struct sockaddr*)addr, (addr == NULL ? NULL : &addr_len));
  172. if (ret <= 0)
  173. return -1;
  174. }
  175. return ret;
  176. }
  177. void su_socket_destroy(su_socket fd)
  178. {
  179. closesocket((SOCKET)fd);
  180. }
  181. void su_set_addr(su_addr* addr, const char* ip, uint16_t port)
  182. {
  183. memset((void *)addr, 0, sizeof(struct sockaddr_in));
  184. addr->sin_family = AF_INET;
  185. addr->sin_port = htons(port);
  186. addr->sin_addr.s_addr = inet_addr(ip);
  187. }
  188. void su_set_addr2(su_addr* addr, uint32_t ip, uint16_t port)
  189. {
  190. memset((void *)addr, 0, (size_t)sizeof(struct sockaddr_in));
  191. addr->sin_family = AF_INET;
  192. addr->sin_port = htons((u_short)port);
  193. addr->sin_addr.s_addr = htonl((u_long)ip);
  194. }
  195. void su_addr_to_addr(su_addr* srcAddr, su_addr* dstAddr)
  196. {
  197. dstAddr->sin_family = AF_INET;
  198. dstAddr->sin_port = srcAddr->sin_port;
  199. dstAddr->sin_addr.s_addr = srcAddr->sin_addr.s_addr;
  200. }
  201. char* su_addr_to_string(su_addr* addr, char* str, int len)
  202. {
  203. uint8_t b1, b2, b3, b4;
  204. if (len < 24 || addr == NULL || str == NULL)
  205. return NULL;
  206. b1 = addr->sin_addr.S_un.S_un_b.s_b1;
  207. b2 = addr->sin_addr.S_un.S_un_b.s_b2;
  208. b3 = addr->sin_addr.S_un.S_un_b.s_b3;
  209. b4 = addr->sin_addr.S_un.S_un_b.s_b4;
  210. sprintf(str, "%u.%u.%u.%u:%u", b1, b2, b3, b4, ntohs(addr->sin_port));
  211. return str;
  212. }
  213. void su_string_to_addr(su_addr* addr, char* str)
  214. {
  215. char* pos, ip[IP_SIZE] = { 0 };
  216. uint16_t port, i;
  217. if (addr == NULL || str == NULL)
  218. return;
  219. i = 0;
  220. pos = str;
  221. do{
  222. ip[i++] = *pos++;
  223. } while (*pos != ':' && *pos != '\0' && i < IP_SIZE - 1);
  224. if (*pos == ':')
  225. pos++;
  226. port = (uint16_t)atoi((const char *)pos);
  227. su_set_addr(addr, ip, port);
  228. }
  229. char* su_addr_to_iport(su_addr* addr, char* str, int len, uint16_t* port)
  230. {
  231. uint8_t b1, b2, b3, b4;
  232. if (len < 24 || addr == NULL || str == NULL)
  233. return NULL;
  234. b1 = addr->sin_addr.S_un.S_un_b.s_b1;
  235. b2 = addr->sin_addr.S_un.S_un_b.s_b2;
  236. b3 = addr->sin_addr.S_un.S_un_b.s_b3;
  237. b4 = addr->sin_addr.S_un.S_un_b.s_b4;
  238. sprintf(str, "%u.%u.%u.%u", b1, b2, b3, b4);
  239. *port = ntohs(addr->sin_port);
  240. return str;
  241. }
  242. int su_addr_cmp(su_addr* srcAddr, su_addr* dstAddr)
  243. {
  244. if (srcAddr->sin_addr.s_addr > dstAddr->sin_addr.s_addr)
  245. return 1;
  246. else if (srcAddr->sin_addr.s_addr < dstAddr->sin_addr.s_addr)
  247. return -1;
  248. else if (srcAddr->sin_port > dstAddr->sin_port)
  249. return 1;
  250. else if (srcAddr->sin_port < dstAddr->sin_port)
  251. return -1;
  252. else
  253. return 0;
  254. }
  255. int su_addr_eq(su_addr* srcAddr, su_addr* dstAddr)
  256. {
  257. if (srcAddr->sin_addr.s_addr == dstAddr->sin_addr.s_addr && srcAddr->sin_port == dstAddr->sin_port)
  258. return 0;
  259. return -1;
  260. }
  261. void su_sleep(uint64_t seconds, uint64_t micro_seconds)
  262. {
  263. Sleep((DWORD)(seconds * 1000 + micro_seconds / 1000));
  264. }
  265. //ºÜºÄʱ
  266. void su_performance_msleep(long lTime)
  267. {
  268. LARGE_INTEGER litmp;
  269. LONGLONG QPart1,QPart2;
  270. double dfMinus, dfFreq, dfTim, dfSpec;
  271. QueryPerformanceFrequency(&litmp);
  272. dfFreq = (double)litmp.QuadPart;
  273. QueryPerformanceCounter(&litmp);
  274. QPart1 = litmp.QuadPart;
  275. dfSpec = 0.001*lTime;
  276. do
  277. {
  278. QueryPerformanceCounter(&litmp);
  279. QPart2 = litmp.QuadPart;
  280. dfMinus = (double)(QPart2-QPart1);
  281. dfTim = dfMinus / dfFreq;
  282. }while(dfTim<dfSpec);
  283. }
  284. #define ARRAY_SIZE(x) (((sizeof(x)/sizeof(x[0]))))
  285. #define IS_PRIVATE_IP(ip) \
  286. ((((ip) >> 24) == 127) || (((ip) >> 24) == 10) \
  287. || (((ip) >> 20) == ((172 << 4) | 1)) \
  288. || (((ip) >> 16) == ((192 << 8) | 168)))
  289. #define IS_VPN(ip) ((((ip) >> 16) & 0x00ff) > 250)
  290. uint32_t su_get_local_ip()
  291. {
  292. size_t i;
  293. char hostname[256];
  294. struct hostent* host;
  295. if (gethostname((char *)hostname,(int) ARRAY_SIZE(hostname)) != 0 || strlen(hostname) == 0)
  296. return 0;
  297. if (host = gethostbyname((const char *)hostname)){
  298. for (i = 0; host->h_addr_list[i]; ++i){
  299. uint32_t ip = ((uint32_t)*((uint32_t*)host->h_addr_list[i]));
  300. if (IS_PRIVATE_IP(ntohl(ip)) && !IS_VPN(ntohl(ip)))
  301. return ip;
  302. }
  303. }
  304. return 0;
  305. }