HQDEST.C
上传用户:bjghjy
上传日期:2007-01-07
资源大小:379k
文件大小:13k
源码类别:

金融证券系统

开发平台:

Visual C++

  1. #include <windows.h>
  2. #include "hq.h"
  3. #include "pctcp.h"
  4. #include "hqdest.h"
  5. DEST_INFOS dest_infos;
  6. BOOL fDestInited =FALSE;
  7. HANDLE hThrdScanDest =NULL;
  8. void FreeDest(void);
  9. LPDEST_INFO GetDest(struct sockaddr *dest);
  10. LPDEST_INFO GetDestByUser(LPSTR userID);
  11. LPDEST_INFO GetFirstDeadDest(void);
  12. int FillDpMain(LPDP_MAIN lpDpMain);
  13. extern HWND ghWndMain;
  14. extern BOOL run_cancelled;
  15. extern void ErrMsg(HWND, LPSTR);
  16. extern int UDP_Server_Send_Hq10(LPDEST_INFO);
  17. extern int UDP_Server_Send_Gra10(LPDEST_INFO);
  18. extern int UDP_Server_Send_Dp(struct sockaddr *, BOOL);
  19. extern void HqResetChangedTimes(void);
  20. extern void SetHqUsers(int);
  21. extern BOOL IsZsRec(int, short);
  22. extern int sdHq;
  23. extern void SendMsg(int sd, LPSTR lpMsg, struct sockaddr * lpdest);
  24. BOOL DestInit(void)
  25. {
  26. fDestInited =TRUE;
  27. memset(&dest_infos, 0, sizeof(dest_infos));
  28. return TRUE;
  29. }
  30. void DestExit(void)
  31. {
  32. if(!fDestInited) return;
  33. fDestInited =FALSE;
  34. FreeDest();
  35. if(hThrdScanDest) CloseHandle(hThrdScanDest);
  36. }
  37. long GetDestCount(void)
  38. {
  39. return MAKELONG(dest_infos.destCount, dest_infos.aliveCount);
  40. }
  41. int HqDestActiveUsr(int sd, struct sockaddr *lpdest, LPSTR userID)
  42. {
  43. LPDEST_INFO lpDestTmp, lpDestTmp1;
  44. lpDestTmp =GetDest(lpdest);
  45. if(lpDestTmp ==NULL)return -1;
  46. lpDestTmp1 =GetDestByUser(userID);
  47. if(lpDestTmp1 !=NULL)
  48. {
  49. if(lpDestTmp1->isDead ==FALSE)
  50. {
  51. if(((struct sockaddr_in *)&lpDestTmp1->dest)->sin_addr.s_addr
  52. !=((struct sockaddr_in *)lpdest)->sin_addr.s_addr)
  53. SendMsg(sd, "Another user using your userID, killed it!", lpdest);
  54. lpDestTmp1->isDead =TRUE;
  55. return 1;
  56. }
  57. }
  58. strcpy(lpDestTmp->userID, userID);
  59. lpDestTmp->isDead =FALSE;
  60. return 0;
  61. }
  62. int AddDest(int sd, struct sockaddr *dest, int curJys,
  63. int reqType, short *params, short paramsCount)
  64. {
  65. int i;
  66. LPDEST_INFO lpDestNext, lpDestTmp;
  67. LPDEST_INFO *lpDestNew =NULL;
  68. //while(dest_infos.isUsing ==TRUE);
  69. //dest_infos.isUsing =TRUE;
  70. lpDestNext =dest_infos.lpDestHead;
  71. lpDestNew =&dest_infos.lpDestHead;
  72. for(i =0; i<dest_infos.destCount; i++)
  73. {
  74. if(!lpDestNext) break;
  75. lpDestNew =&lpDestNext->lpNext;
  76. lpDestNext =lpDestNext->lpNext;
  77. }
  78. lpDestTmp = malloc(sizeof(DEST_INFO));
  79. if(lpDestTmp ==NULL)
  80. {
  81. ErrMsg(ghWndMain, "addDest: alloc dest_info failed!");
  82. return -1;
  83. }
  84. memset(lpDestTmp, 0, sizeof(DEST_INFO));
  85. lpDestTmp->sd =sd;
  86. lpDestTmp->curJys =curJys;
  87. lpDestTmp->reqType =reqType;
  88. lpDestTmp->isDead =FALSE;
  89. lpDestTmp->isEchoed =TRUE;
  90. lpDestTmp->params =(short *)malloc(paramsCount*sizeof(short));
  91. if(lpDestTmp->params ==NULL)
  92. {
  93. free(lpDestTmp);
  94. ErrMsg(ghWndMain, "addDest: alloc params failed!");
  95. return -1;
  96. }
  97. memcpy(lpDestTmp->params, params, sizeof(short)*paramsCount);
  98. if(reqType ==REQ_HQ10)
  99. {
  100. lpDestTmp->lpCjss =(int *)malloc(params[0]*sizeof(int));
  101. if(lpDestTmp->lpCjss ==NULL)
  102. {
  103. free(lpDestTmp->params);
  104. free(lpDestTmp);
  105. ErrMsg(ghWndMain, "addDest: alloc lpCjss failed!");
  106. return -1;
  107. }
  108. for(i =0; i<params[0]; i++)
  109. {
  110. lpDestTmp->lpCjss[i] =HqData[curJys].lpRefData[params[i+1]].cjss;
  111. }
  112. }
  113. else if(reqType ==REQ_GRA10)
  114. {
  115. if(lpDestTmp->lpCjss)
  116. {
  117. free(lpDestTmp->lpCjss);
  118. lpDestTmp->lpCjss =NULL;
  119. }
  120. if(IsZsRec(curJys, params[0]))
  121. {
  122. lpDestTmp->lpZsGraph =malloc(sizeof(ZS_GRAPH));
  123. if(lpDestTmp->lpZsGraph ==NULL)
  124. {
  125. free(lpDestTmp->params);
  126. free(lpDestTmp);
  127. ErrMsg(NULL, "alloc zsgraph failed!");
  128. return -1;
  129. }
  130. memcpy(lpDestTmp->lpZsGraph->Maxmin, MaxMinData[curJys],
  131. sizeof(MAXMIN_DATA)*2);
  132. }
  133. else
  134. {
  135. lpDestTmp->lpGraph =(LPGRAPH)malloc(sizeof(GRAPH));
  136. if(lpDestTmp->lpGraph ==NULL)
  137. {
  138. free(lpDestTmp->params);
  139. free(lpDestTmp);
  140. ErrMsg(NULL, "alloc graph failed!");
  141. return -1;
  142. }
  143. memcpy(&lpDestTmp->lpGraph->mmp, &MmpData[curJys].lpMmp[params[0]],
  144. sizeof(MMP));
  145. }
  146. lpDestTmp->cjss =HqData[curJys].lpRefData[params[0]].cjss;
  147. }
  148. else
  149. {
  150. free(lpDestTmp->params);
  151. free(lpDestTmp);
  152. return -1;
  153. }
  154. FillDpMain(&lpDestTmp->DpData[0]);
  155. lpDestTmp->paramsCount =paramsCount;
  156. memcpy(&lpDestTmp->dest, dest, sizeof(struct sockaddr));
  157. lpDestTmp->isDead =TRUE;
  158. *lpDestNew =lpDestTmp;
  159. dest_infos.destCount ++;
  160. dest_infos.aliveCount ++;
  161. //dest_infos.isUsing =FALSE;
  162. return 0;
  163. }
  164. int ChangeDest(int sd, LPDEST_INFO lpDestTmp, struct sockaddr *dest, int curJys,
  165. int reqType, short *params, short paramsCount)
  166. {
  167. int i;
  168. if(lpDestTmp ==NULL) return 0;
  169. //while(dest_infos.isUsing ==TRUE);
  170. //while(lpDestTmp->isUsing ==TRUE);
  171. dest_infos.isUsing =TRUE;
  172. lpDestTmp->isUsing =TRUE;
  173. lpDestTmp->isDead =TRUE;
  174. lpDestTmp->paramsCount =0;
  175. if(--dest_infos.aliveCount<0) dest_infos.aliveCount =0;
  176. SetHqUsers(dest_infos.aliveCount);
  177. lpDestTmp->sd =sd;
  178. lpDestTmp->curJys =curJys;
  179. lpDestTmp->reqType =reqType;
  180. lpDestTmp->isEchoed =TRUE;
  181. if(lpDestTmp->paramsCount <paramsCount)
  182. lpDestTmp->params =(short *)realloc(lpDestTmp->params, paramsCount*sizeof(short));
  183. if(lpDestTmp->params ==NULL)
  184. {
  185. ErrMsg(ghWndMain, "ChangeDest: alloc params failed!");
  186. dest_infos.isUsing =FALSE;
  187. lpDestTmp->isUsing =FALSE;
  188. return -1;
  189. }
  190. if(reqType ==REQ_HQ10)
  191. {
  192. /*if(lpDestTmp->lpGraph)
  193. {
  194. free(lpDestTmp->lpGraph);
  195. lpDestTmp->lpGraph =NULL;
  196. }
  197. if(lpDestTmp->lpZsGraph)
  198. {
  199. free(lpDestTmp->lpZsGraph);
  200. lpDestTmp->lpZsGraph =NULL;
  201. }*/
  202. if(lpDestTmp->params[0] <params[0])
  203. lpDestTmp->lpCjss =(int *)realloc(lpDestTmp->lpCjss, params[0]*sizeof(int));
  204. if(lpDestTmp->lpCjss ==NULL)
  205. {
  206. ErrMsg(ghWndMain, "ChangeDest: alloc lpCjss failed!");
  207. dest_infos.isUsing =FALSE;
  208. lpDestTmp->isUsing =FALSE;
  209. return -1;
  210. }
  211. for(i =0; i<params[0]; i++)
  212. {
  213. lpDestTmp->lpCjss[i] =HqData[curJys].lpRefData[params[i+1]].cjss;
  214. }
  215. }
  216. else if(reqType ==REQ_GRA10)
  217. {
  218. /*if(lpDestTmp->lpCjss)
  219. {
  220. free(lpDestTmp->lpCjss);
  221. lpDestTmp->lpCjss =NULL;
  222. }*/
  223. if(IsZsRec(curJys, params[0]))
  224. {
  225. /*if(lpDestTmp->lpGraph)
  226. {
  227. free(lpDestTmp->lpGraph);
  228. lpDestTmp->lpGraph =NULL;
  229. }*/
  230. if(lpDestTmp->lpZsGraph ==NULL)
  231. {
  232. lpDestTmp->lpZsGraph =malloc(sizeof(ZS_GRAPH));
  233. if(lpDestTmp->lpZsGraph ==NULL)
  234. {
  235. ErrMsg(NULL, "alloc zsgraph failed!");
  236. return -1;
  237. }
  238. }
  239. memcpy(lpDestTmp->lpZsGraph->Maxmin, MaxMinData[curJys],
  240. sizeof(MAXMIN_DATA)*2);
  241. }
  242. else
  243. {
  244. /*if(lpDestTmp->lpZsGraph)
  245. {
  246. free(lpDestTmp->lpZsGraph);
  247. lpDestTmp->lpZsGraph =NULL;
  248. }*/
  249. if(lpDestTmp->lpGraph ==NULL)
  250. {
  251. lpDestTmp->lpGraph =(LPGRAPH)malloc(sizeof(GRAPH));
  252. if(lpDestTmp->lpGraph ==NULL)
  253. {
  254. ErrMsg(NULL, "alloc graph failed!");
  255. return -1;
  256. }
  257. }
  258. memcpy(&lpDestTmp->lpGraph->mmp, &MmpData[curJys].lpMmp[params[0]],
  259. sizeof(MMP));
  260. }
  261. lpDestTmp->cjss =HqData[curJys].lpRefData[params[0]].cjss;
  262. }
  263. else return -1;
  264. memcpy(lpDestTmp->params, params, sizeof(short)*paramsCount);
  265. FillDpMain(&lpDestTmp->DpData[0]);
  266. memcpy(&lpDestTmp->dest, dest, sizeof(struct sockaddr));
  267. lpDestTmp->paramsCount =paramsCount;
  268. dest_infos.isUsing =FALSE;
  269. lpDestTmp->isUsing =FALSE;
  270. lpDestTmp->isDead =FALSE;
  271. SetHqUsers(++dest_infos.aliveCount);
  272. return 0;
  273. }
  274. int CheckDest(int sd, struct sockaddr *dest, int curJys,
  275. int reqType, short *params, short paramsCount)
  276. {
  277. LPDEST_INFO lpDestTmp;
  278. lpDestTmp =GetDest(dest);
  279. if(lpDestTmp ==NULL)
  280. {
  281. lpDestTmp =GetFirstDeadDest();
  282. if(!lpDestTmp) goto add_dest;
  283. }
  284. if(lpDestTmp->isDead)
  285. dest_infos.aliveCount++;
  286. ChangeDest(sd, lpDestTmp, dest, curJys, reqType,
  287. params, paramsCount);
  288. SetHqUsers(dest_infos.aliveCount);
  289. return 0;
  290. add_dest:
  291. AddDest(sd, dest, curJys, reqType, params, paramsCount);
  292. SetHqUsers(dest_infos.aliveCount);
  293. return 0;
  294. }
  295. void HqDestSetDead(struct sockaddr *lpdest)
  296. {
  297. LPDEST_INFO lpDestTmp;
  298. lpDestTmp =GetDest(lpdest);
  299. if(lpDestTmp)
  300. {
  301. lpDestTmp->isDead =TRUE;
  302. if(--dest_infos.aliveCount <0) dest_infos.aliveCount =0;
  303. SetHqUsers(dest_infos.aliveCount);
  304. }
  305. }
  306. void CheckDestEcho(int sd, struct sockaddr *dest)
  307. {
  308. LPDEST_INFO lpDestTmp;
  309. lpDestTmp =GetDest(dest);
  310. if(lpDestTmp !=NULL)
  311. lpDestTmp->isEchoed =TRUE;
  312. }
  313. LPDEST_INFO GetDest(struct sockaddr *dest)
  314. {
  315. int i;
  316. LPDEST_INFO lpDestTmp;
  317. //while(dest_infos.isUsing ==TRUE);
  318. //dest_infos.isUsing =TRUE;
  319. lpDestTmp =dest_infos.lpDestHead;
  320. for(i =0; i<dest_infos.destCount; i++)
  321. {
  322. if(!lpDestTmp) break;
  323. if(((struct sockaddr_in *)&lpDestTmp->dest)->sin_addr.s_addr
  324. ==((struct sockaddr_in *)dest)->sin_addr.s_addr)
  325. break;
  326. lpDestTmp =lpDestTmp->lpNext;
  327. }
  328. ////////////
  329. //dest_infos.isUsing =FALSE;
  330. return lpDestTmp;
  331. }
  332. LPDEST_INFO GetDestByUser(LPSTR userID)
  333. {
  334. int i;
  335. LPDEST_INFO lpDestTmp;
  336. lpDestTmp =dest_infos.lpDestHead;
  337. for(i =0; i<dest_infos.destCount; i++)
  338. {
  339. if(!lpDestTmp) break;
  340. if(strcmp(lpDestTmp->userID, userID) ==0)
  341. break;
  342. lpDestTmp =lpDestTmp->lpNext;
  343. }
  344. ////////////
  345. return lpDestTmp;
  346. }
  347. LPDEST_INFO HqDestSendClose(int sd, struct sockaddr *dest)
  348. {
  349. int i;
  350. LPDEST_INFO lpDestTmp;
  351. lpDestTmp =dest_infos.lpDestHead;
  352. for(i =0; i<dest_infos.destCount; i++)
  353. {
  354. if(!lpDestTmp) break;
  355. lpDestTmp =lpDestTmp->lpNext;
  356. SendMsg(sd, "Server have closed!", &lpDestTmp->dest);
  357. }
  358. return lpDestTmp;
  359. }
  360. LPDEST_INFO GetFirstDeadDest(void)
  361. {
  362. int i;
  363. LPDEST_INFO lpDestTmp;
  364. while(dest_infos.isUsing ==TRUE);
  365. dest_infos.isUsing =TRUE;
  366. lpDestTmp =dest_infos.lpDestHead;
  367. for(i =0; i<dest_infos.destCount; i++)
  368. {
  369. if(!lpDestTmp) break;
  370. if(lpDestTmp->isDead ==TRUE)
  371. break;
  372. lpDestTmp =lpDestTmp->lpNext;
  373. }
  374. dest_infos.isUsing =FALSE;
  375. return lpDestTmp;
  376. }
  377. void DelDeads(void)
  378. {
  379. LPDEST_INFO lpDestPrev, lpDestNext, lpDestTmp;
  380. int i, count =0;
  381. if(dest_infos.aliveCount ==dest_infos.destCount)
  382. return;
  383. lpDestNext =lpDestTmp =dest_infos.lpDestHead;
  384. if(lpDestTmp ==NULL) return;
  385. while(dest_infos.isUsing ==TRUE);
  386. dest_infos.isUsing =TRUE;
  387. for(i =0; i<dest_infos.destCount; i++)
  388. {
  389. if(!lpDestTmp) break;
  390. lpDestNext =lpDestTmp->lpNext;
  391. if(!lpDestTmp->isEchoed || lpDestTmp->isDead)
  392. {
  393. lpDestTmp->isDead =TRUE;
  394. if(--dest_infos.aliveCount <0) dest_infos.aliveCount =0;
  395. SetHqUsers(dest_infos.aliveCount);
  396. if(lpDestTmp ==dest_infos.lpDestHead)
  397. dest_infos.lpDestHead =lpDestNext;
  398. else lpDestPrev->lpNext =lpDestNext;
  399. free(lpDestTmp->params);
  400. lpDestTmp->paramsCount =0;
  401. if(lpDestTmp->lpCjss) free(lpDestTmp->lpCjss);
  402. lpDestTmp->lpCjss =NULL;
  403. if(lpDestTmp->lpGraph) free(lpDestTmp->lpGraph);
  404. lpDestTmp->lpGraph =NULL;
  405. if(lpDestTmp->lpZsGraph) free(lpDestTmp->lpZsGraph);
  406. lpDestTmp->lpZsGraph =NULL;
  407. free(lpDestTmp);
  408. count++;
  409. }
  410. else
  411. lpDestPrev =lpDestTmp;
  412. lpDestTmp =lpDestNext;
  413. }
  414. dest_infos.destCount -=count;
  415. dest_infos.isUsing =FALSE;
  416. }
  417. void FreeDest(void)
  418. {
  419. LPDEST_INFO lpDestNext, lpDestTmp;
  420. int i;
  421. lpDestNext =lpDestTmp =dest_infos.lpDestHead;
  422. while(dest_infos.isUsing ==TRUE);
  423. dest_infos.isUsing =TRUE;
  424. for(i =0; i<dest_infos.destCount; i++)
  425. {
  426. if(lpDestTmp ==NULL) break;
  427. lpDestNext =lpDestTmp->lpNext;
  428. if(lpDestTmp->params)
  429. free(lpDestTmp->params);
  430. if(lpDestTmp->lpCjss) free(lpDestTmp->lpCjss);
  431. free(lpDestTmp);
  432. lpDestTmp =lpDestNext;
  433. }
  434. dest_infos.destCount =0;
  435. dest_infos.isUsing =FALSE;
  436. }
  437. // can use WM_TIMER to run this function
  438. long TF_ScanDest(void)
  439. {
  440. int i;
  441. LPDEST_INFO lpDestNext;
  442. DP_MAIN DpMain[2];
  443. while(1)
  444. {
  445. lpDestNext=dest_infos.lpDestHead;
  446. if(run_cancelled) return 0;
  447. for(i =0; i<dest_infos.destCount; i++)
  448. {
  449. if(run_cancelled) return 0;
  450. if(!lpDestNext) break;
  451. if(HqTime[lpDestNext->curJys].fRunning ==FALSE)
  452. goto do_next;
  453. if(lpDestNext->isDead) goto do_next;
  454. if(lpDestNext->isUsing) goto do_next;
  455. //lpDestNext->isUsing =TRUE;
  456. switch(lpDestNext->reqType)
  457. {
  458. case REQ_HQ10:
  459. if(UDP_Server_Send_Hq10(lpDestNext)<0)
  460. {
  461. lpDestNext->isDead =TRUE;
  462. if(--dest_infos.aliveCount <0) dest_infos.aliveCount =0;
  463. SetHqUsers(dest_infos.aliveCount);
  464. goto do_next;
  465. }
  466. break;
  467. case REQ_GRA10:
  468. if(UDP_Server_Send_Gra10(lpDestNext)<0)
  469. {
  470. lpDestNext->isDead =TRUE;
  471. if(--dest_infos.aliveCount <0) dest_infos.aliveCount =0;
  472. SetHqUsers(dest_infos.aliveCount);
  473. goto do_next;
  474. }
  475. break;
  476. default: goto do_next;
  477. }
  478. if(!lpDestNext->isDead)
  479. {
  480. FillDpMain(&DpMain[0]);
  481. if(memcmp(&lpDestNext->DpData, &DpMain, sizeof(DpMain)))
  482. {
  483. if(UDP_Server_Send_Dp(&lpDestNext->dest, FALSE) <0)
  484. {
  485. lpDestNext->isDead =TRUE;
  486. if(--dest_infos.aliveCount <0) dest_infos.aliveCount =0;
  487. SetHqUsers(dest_infos.aliveCount);
  488. }
  489. else memcpy(&lpDestNext->DpData, &DpMain, sizeof(DpMain));
  490. }
  491. }
  492. do_next:
  493. //lpDestNext->isUsing =FALSE;
  494. lpDestNext =lpDestNext->lpNext;
  495. }
  496. //HqResetChangedTimes();
  497. //DelDeads();
  498. Sleep(1000);
  499. }
  500. ExitThread(0);
  501. //CloseHandle(hThrdScanDest);
  502. //hThrdScanDest =0;
  503. return 0;
  504. }
  505. int CreateScanDestThread(void)
  506. {
  507. LONG lThreadId;
  508. hThrdScanDest =CreateThread(NULL, 0,
  509. (LPTHREAD_START_ROUTINE)TF_ScanDest,
  510. NULL, CREATE_SUSPENDED, (LPDWORD)&lThreadId);
  511. if(!hThrdScanDest) return -1;
  512. SetThreadPriority(hThrdScanDest, THREAD_PRIORITY_NORMAL);
  513. ResumeThread(hThrdScanDest);
  514. return 0;
  515. }
  516. int FillDpMain(LPDP_MAIN lpDpMain)
  517. {
  518. int jys;
  519. for(jys =0; jys<2; jys++)
  520. {
  521. lpDpMain[jys].zs =DpData[jys].zs[0];
  522. lpDpMain[jys].zd =DpData[jys].zd[0];
  523. lpDpMain[jys].cjzje =DpData[jys].cjzje;
  524. lpDpMain[jys].npbl =DpData[jys].npbl;
  525. lpDpMain[jys].cjss =DpData[jys].cjss;
  526. lpDpMain[jys].upCount =DpData[jys].upCount;
  527. lpDpMain[jys].downCount =DpData[jys].downCount;
  528. lpDpMain[jys].equalCount =DpData[jys].equalCount;
  529. }
  530. return 0;
  531. }