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

金融证券系统

开发平台:

Visual C++

  1. #include <windows.h>
  2. #include <time.h>
  3. #include "main.h"
  4. #include "hq.h"
  5. #include "pctcp.h"
  6. #include "hqdest.h"
  7. #include "monitor.h"
  8. #include "cl_hq.h"
  9. #include "cl_data.h"
  10. #include "cl_main.h"
  11. CRITICAL_SECTION hqCriticalSection;
  12. DEST_INFOS dest_infos;
  13. DEST_INFO dest_info[MAX_USER_COUNT];
  14. int  dest_info_count=0;
  15. BOOL fDestInited =FALSE;
  16. BOOL gfIsNewsSrcDel=FALSE;
  17. HANDLE hThrdScanDest =NULL;
  18. HANDLE hNewsManager =NULL;      
  19. void FreeDest(void);
  20. LPDEST_INFO GetDestByUser(LPSTR userID);
  21. LPDEST_INFO GetFirstDeadDest(void);
  22. int FillDpMain(LPDP_MAIN lpDpMain);
  23. extern BOOL run_cancelled,gfReadData;
  24. extern int Delay_Send_Hq01(LPDEST_INFO lpDest);
  25. extern int UDP_Server_Send_Hq10(LPDEST_INFO);
  26. extern int Send_Hq10(LPDEST_INFO lpDest);
  27. extern int UDP_Server_Send_Gra10(LPDEST_INFO);
  28. extern int Send_Gra10(LPDEST_INFO lpDest);
  29. extern int UDP_Server_Send_Dp(int sd, struct sockaddr *lpdest, BOOL fThrd, LPDEST_INFO lpDest);
  30. extern int UDP_ReadHq(int sd,char * RecvBuf,int len,struct sockaddr_in dest);
  31. extern void HqResetChangedTimes(void);
  32. extern void SetHqUsers(int);
  33. extern BOOL IsZsRec(int, short);
  34. extern int sdHq;
  35. extern MONITOR Monitor;
  36. extern int RefreshHq(int jys);
  37. extern char szDataPath[128],szNewsPath[128],szNewsSrc[128];
  38. extern char ZxDataFile[128];
  39. extern HFILE hfZx;
  40. extern int SendMsg(int sd, LPSTR);
  41. extern BOOL ZlibCompressFile(char *infile,char *outfile);
  42. BOOL DestInit(void)
  43. {
  44. fDestInited =TRUE;
  45. memset(&dest_infos, 0, sizeof(dest_infos));
  46. memset(&dest_info[0],0,sizeof(DEST_INFO)*MAX_USER_COUNT);
  47. dest_infos.lpDestHead =&dest_info[0];
  48. dest_info_count=0;
  49. return TRUE;
  50. }
  51. void DestExit(void)
  52. {
  53. if(!fDestInited) return;
  54. fDestInited =FALSE;
  55. if(hThrdScanDest) CloseHandle(hThrdScanDest);
  56. FreeDest();
  57. }
  58. long GetDestCount(void)
  59. {
  60. return MAKELONG(dest_infos.destCount, dest_infos.aliveCount);
  61. }
  62. int LockDest(LPDEST_INFO lpDestTmp,int num)
  63. {
  64. int i;
  65. i=0;
  66. lpDestTmp->isUsing = TRUE;
  67. return TRUE;
  68. /*
  69. EnterCriticalSection(&hqCriticalSection);
  70. do
  71. {
  72. if(!lpDestTmp->isUsing)
  73. {
  74. lpDestTmp->isUsing = TRUE;
  75. LeaveCriticalSection(&hqCriticalSection);
  76. return TRUE;
  77. }
  78. LeaveCriticalSection(&hqCriticalSection);
  79. ShoutBlockingHook();
  80. Sleep(40);
  81. EnterCriticalSection(&hqCriticalSection);
  82. i++;
  83. }while(lpDestTmp->isUsing&&i<num);
  84. LeaveCriticalSection(&hqCriticalSection);
  85. return FALSE;
  86. */
  87. }
  88. int xLockDest(LPDEST_INFO lpDestTmp,int num)
  89. {
  90. int i =0;
  91. do
  92. {
  93. if(!lpDestTmp->isUsing)
  94. {
  95. lpDestTmp->isUsing = TRUE;
  96. return TRUE;
  97. }
  98. i++;
  99. }while(lpDestTmp->isUsing&&i<num);
  100. return FALSE;
  101. }
  102. void UnlockDest(LPDEST_INFO lpDestTmp)
  103. {
  104. // EnterCriticalSection(&hqCriticalSection);
  105. lpDestTmp->isUsing=FALSE;
  106. // LeaveCriticalSection(&hqCriticalSection);
  107. }
  108. int HqDestActiveUsr(int sd, struct sockaddr *lpdest, LPSTR userID,int ret)
  109. {
  110. LPDEST_INFO lpDestTmp;  //lpDestTmp1;
  111. lpDestTmp =GetDestBySd(sd);
  112. if(lpDestTmp ==NULL) return -1;
  113. if(!LockDest(lpDestTmp,10))
  114. {
  115. ErrMsg(ghWndMain,"来自HqDestActiveUsr:加锁失败!");
  116. return -1;
  117. }
  118. strcpy(lpDestTmp->userID, userID);
  119. lpDestTmp->isDead =FALSE;
  120. lpDestTmp->recNum=ret;
  121. time(&lpDestTmp->startTime);
  122. lpDestTmp->inactive =0;
  123. dest_infos.aliveCount++;
  124. UnlockDest(lpDestTmp);
  125. return ((int)(lpDestTmp->version));
  126. }
  127. int AddDest(int sd, struct sockaddr *dest, int curJys,
  128. int reqType, short *params, short paramsCount,BYTE version)
  129. {
  130. int i;
  131. LPDEST_INFO lpDestNext, lpDestTmp;
  132. LPDEST_INFO *lpDestNew =NULL;
  133. lpDestNext =dest_infos.lpDestHead;
  134. lpDestNew =&dest_infos.lpDestHead;
  135.     if(paramsCount<0||paramsCount>MAX_PARA_COUNT)
  136. {
  137. ErrMsg(ghWndMain,"来自AddDest:错误的参数个数!");
  138. return -1;
  139. }
  140. if(dest_info_count>MAX_USER_COUNT)
  141. {
  142. ErrMsg(ghWndMain,"来自AddDest:无空闲的地址表项!");
  143. return -1;
  144. }
  145. lpDestTmp=&dest_info[dest_info_count];
  146. if(dest_info_count>0)
  147. dest_info[dest_info_count-1].lpNext=&dest_info[dest_info_count];
  148. dest_info_count++;
  149. lpDestTmp->isUsing=FALSE;
  150. if(!LockDest(lpDestTmp,10)) 
  151. {
  152. ErrMsg(ghWndMain,"来自AddDest:加锁失败!");
  153. return -1;
  154. }
  155. memset(lpDestTmp, 0, sizeof(DEST_INFO));
  156. lpDestTmp->sd =sd;
  157. lpDestTmp->curJys =curJys;
  158. lpDestTmp->reqType =reqType;
  159. lpDestTmp->isDead =FALSE;
  160. lpDestTmp->inactive =0;
  161. if(lpDestTmp->params==NULL)
  162. lpDestTmp->params =GlobalLock(GlobalAlloc(GHND,(MAX_PARA_COUNT+1)*sizeof(short)));
  163. if(lpDestTmp->params ==NULL)
  164. {
  165. ErrMsg(ghWndMain,"来自AddDest:不能分配参数内存区!");
  166. UnlockDest(lpDestTmp);
  167. return -1;
  168. }
  169. if(reqType ==REQ_GRA10)
  170. {
  171. lpDestTmp->graNo =params[0];
  172. lpDestTmp->graEnd =params[1];
  173. }
  174. else
  175. memcpy(lpDestTmp->params, params, sizeof(short)*paramsCount);
  176. if(lpDestTmp->lpCjss ==NULL)
  177. lpDestTmp->lpCjss =GlobalLock(GlobalAlloc(GHND,MAX_PARA_COUNT*sizeof(int)));
  178. if(lpDestTmp->lpCjss ==NULL)
  179. {
  180. GlobalUnlock(GlobalHandle(lpDestTmp->params));
  181. GlobalFree(GlobalHandle(lpDestTmp->params));
  182. lpDestTmp->params ==NULL;
  183. ErrMsg(ghWndMain,"来自AddDest:不能分配lpCjss参数内存区!");
  184. UnlockDest(lpDestTmp);
  185. return -1;
  186. }
  187. if(reqType ==REQ_HQ10||reqType ==REQ_HQ01)
  188. {
  189. for(i =0; i<params[0]; i++)
  190. {
  191. lpDestTmp->lpCjss[i] =HqData[curJys].lpRefData[params[i+1]].cjss;
  192. }
  193. }
  194. else if(reqType ==REQ_GRA10)
  195. {
  196. if(IsZsRec(curJys, params[0]))
  197. {
  198. lpDestTmp->lpZsGraph =GlobalLock(GlobalAlloc(GHND,sizeof(ZS_GRAPH)));   
  199. if(lpDestTmp->lpZsGraph ==NULL)
  200. {
  201. ErrMsg(ghWndMain,"来自AddDest:不能分配ZS_RGAPH内存区!");
  202. UnlockDest(lpDestTmp);
  203. return -1;
  204. }
  205. memcpy(lpDestTmp->lpZsGraph->Maxmin, MaxMinData[curJys],
  206. sizeof(MAXMIN_DATA)*2);
  207. }
  208. else
  209. {
  210. lpDestTmp->lpGraph =GlobalLock(GlobalAlloc(GHND,sizeof(GRAPH)));
  211. if(lpDestTmp->lpGraph ==NULL)
  212. {
  213. ErrMsg(ghWndMain,"来自AddDest:不能分配GRAPH内存区!");
  214. UnlockDest(lpDestTmp);
  215. return -1;
  216. }
  217. memcpy(&lpDestTmp->lpGraph->mmp, &MmpData[curJys].lpMmp[params[0]],
  218. sizeof(MMP));
  219. }
  220. lpDestTmp->cjss =HqData[curJys].lpRefData[params[0]].cjss;
  221. }
  222. else
  223. {
  224. ErrMsg(ghWndMain, "来自AddDest:错误的请求!");
  225. UnlockDest(lpDestTmp);
  226. return -1;
  227. }
  228. FillDpMain(&lpDestTmp->DpData[0]);
  229. if(version!=0)
  230. lpDestTmp->version =version;
  231. lpDestTmp->paramsCount =paramsCount;
  232. *lpDestNew =lpDestTmp;
  233. dest_infos.destCount ++;
  234. UnlockDest(lpDestTmp);
  235. return 0;
  236. }
  237. int ChangeDest(int sd, LPDEST_INFO lpDestTmp, struct sockaddr *dest, int curJys,
  238. int reqType, short *params, short paramsCount,BYTE version)
  239. {
  240. int i;
  241. if(lpDestTmp ==NULL) return 0;
  242. if(!LockDest(lpDestTmp,10)) return -1;     
  243. lpDestTmp->isDead =FALSE;
  244. lpDestTmp->sd =sd;
  245. lpDestTmp->curJys =curJys;
  246. lpDestTmp->reqType =reqType;
  247. lpDestTmp->inactive =0;
  248. if(version!=0)
  249. lpDestTmp->version=version;
  250. if(paramsCount<0||paramsCount>MAX_PARA_COUNT||lpDestTmp->params ==NULL)
  251. {
  252. ErrMsg(ghWndMain,"来自ChangeDest:错误的参数个数!");
  253. UnlockDest(lpDestTmp);
  254. return -1;
  255. }
  256. if(reqType ==REQ_HQ10||reqType ==REQ_HQ01)
  257. {
  258. if(params[0]+params[1]+1>HqData[curJys].recCount)
  259. {
  260. params[0]=HqData[curJys].recCount-params[1];
  261. }       
  262. for(i =0; i<params[0]; i++)
  263. {
  264. if(params[i+1]<0||params[i+1]>=HqData[curJys].recCount)
  265. {
  266. ErrMsg(NULL,"来自ChangeDest:错误的列表参数!");
  267. UnlockDest(lpDestTmp);
  268. return -1;
  269. }
  270. lpDestTmp->lpCjss[i] =HqData[curJys].lpRefData[params[i+1]].cjss;
  271. }
  272. }
  273. else if(reqType ==REQ_GRA10)
  274. {
  275. if(IsZsRec(curJys, params[0]))
  276. {
  277. if(lpDestTmp->lpZsGraph ==NULL)
  278. {
  279. lpDestTmp->lpZsGraph =GlobalLock(GlobalAlloc(GHND,sizeof(ZS_GRAPH)));
  280. if(lpDestTmp->lpZsGraph ==NULL)
  281. {
  282. ErrMsg(ghWndMain, "来自ChangeDest:分配ZS_GARPH内存失败!");
  283. UnlockDest(lpDestTmp);
  284. return -1;
  285. }
  286. }
  287. memcpy(lpDestTmp->lpZsGraph->Maxmin, MaxMinData[curJys],
  288. sizeof(MAXMIN_DATA)*2);
  289. }
  290. else
  291. {
  292. if(lpDestTmp->lpGraph ==NULL)
  293. {
  294. lpDestTmp->lpGraph =GlobalLock(GlobalAlloc(GHND,sizeof(GRAPH)));
  295. if(lpDestTmp->lpGraph ==NULL)
  296. {
  297. ErrMsg(ghWndMain, "来自ChangeDest:分配GARPH内存失败!");
  298. UnlockDest(lpDestTmp);      
  299. return -1;
  300. }
  301. }
  302. memcpy(&lpDestTmp->lpGraph->mmp, &MmpData[curJys].lpMmp[params[0]],
  303. sizeof(MMP));
  304. }
  305. lpDestTmp->cjss =HqData[curJys].lpRefData[params[0]].cjss;
  306. }
  307. else
  308. {
  309. UnlockDest(lpDestTmp);
  310. ErrMsg(ghWndMain, "来自ChangeDest:错误的请求!");
  311. return -1;
  312. }
  313. if(reqType ==REQ_GRA10)
  314. {
  315. lpDestTmp->graNo =params[0];
  316. lpDestTmp->graEnd =params[1];
  317. }
  318. else
  319. memcpy(lpDestTmp->params, params, sizeof(short)*paramsCount);
  320. FillDpMain(&lpDestTmp->DpData[0]);
  321. lpDestTmp->paramsCount =paramsCount;
  322. UnlockDest(lpDestTmp);
  323. return 0;
  324. }
  325. int CheckDest(int sd, struct sockaddr *dest, int curJys,
  326. int reqType, short *params, short paramsCount,BYTE version)
  327. {
  328. int ret;
  329. LPDEST_INFO lpDestTmp;
  330. lpDestTmp=GetDestBySd(sd);
  331. if(lpDestTmp ==NULL)
  332. {
  333. lpDestTmp =GetFirstDeadDest();
  334. if(!lpDestTmp) goto add_dest;
  335. }
  336. ret=ChangeDest(sd, lpDestTmp, dest, curJys, reqType,
  337. params, paramsCount,version);
  338. return ret;
  339. add_dest:
  340. ret=AddDest(sd, dest, curJys, reqType, params, paramsCount,version);
  341. return ret;
  342. }
  343. int HqDestSetDeadByPrt(LPDEST_INFO lpDestTmp)
  344. {
  345. if(lpDestTmp->isDead ==FALSE)
  346. {
  347. if(--dest_infos.aliveCount <0) dest_infos.aliveCount =0;
  348. }
  349. shutdown(lpDestTmp->sd,2);
  350. closesocket(lpDestTmp->sd);
  351. lpDestTmp->sd=0;
  352. strcpy(lpDestTmp->userID,"");
  353. lpDestTmp->recNum=0;
  354. lpDestTmp->isDead =TRUE;
  355. lpDestTmp->isUsing=FALSE;
  356. lpDestTmp->inactive =0;
  357. return 0;
  358. }
  359. int HqDestSetDeadBySd(int sd)
  360. {
  361. LPDEST_INFO lpDestTmp;
  362. // int i;
  363. lpDestTmp=GetDestBySd(sd);
  364. if(lpDestTmp!=NULL)
  365. {
  366. //if(!LockDest(lpDestTmp))
  367. //{
  368. //      ErrMsg(ghWndMain,"来自HqDestSetDeadBySd:加锁失败!");
  369. //      return -1;
  370. //}
  371. if(lpDestTmp->isDead ==FALSE)
  372. {
  373. if(--dest_infos.aliveCount <0) dest_infos.aliveCount =0;
  374. }
  375. shutdown(lpDestTmp->sd,2);
  376. //for(i=0;i<10;i++)
  377. //{
  378. // if(closesocket(lpDestTmp->sd)==0)
  379. // break;
  380. // Sleep(100);
  381. //}
  382. closesocket(lpDestTmp->sd);
  383. lpDestTmp->sd=0;
  384. strcpy(lpDestTmp->userID,"");
  385. lpDestTmp->recNum=0;
  386. lpDestTmp->isDead =TRUE;
  387. lpDestTmp->isUsing=FALSE;
  388. lpDestTmp->inactive =0;
  389. //UnlockDest(lpDestTmp);
  390. }
  391. return 0;
  392. }
  393. int HqDestStopBySd(sd)
  394. {
  395. LPDEST_INFO lpDestTmp;
  396. // int i;
  397. lpDestTmp=GetDestBySd(sd);
  398. if(lpDestTmp!=NULL)
  399. {
  400. if(lpDestTmp->isDead ==FALSE)
  401. {
  402. if(--dest_infos.aliveCount <0) dest_infos.aliveCount =0;
  403. }
  404. shutdown(lpDestTmp->sd,2);
  405. //for(i=0;i<10;i++)
  406. //{
  407. // if(closesocket(lpDestTmp->sd)==0)
  408. // break;
  409. // Sleep(100);
  410. //}
  411. closesocket(lpDestTmp->sd);
  412. lpDestTmp->isDead =TRUE;
  413. lpDestTmp->sd=0;
  414. strcpy(lpDestTmp->userID,"");
  415. lpDestTmp->recNum=0;
  416. lpDestTmp->isUsing=FALSE;
  417. lpDestTmp->inactive =0;
  418. }
  419. return 0;
  420. }
  421. LPDEST_INFO GetDestByUser(LPSTR userID)
  422. {
  423. int i;
  424. LPDEST_INFO lpDestTmp;
  425. lpDestTmp =dest_infos.lpDestHead;
  426. for(i =0; i<dest_infos.destCount; i++)
  427. {
  428. if(!lpDestTmp) break;
  429. if(strcmp(lpDestTmp->userID, userID) ==0)
  430. {
  431. return lpDestTmp; 
  432. }
  433. lpDestTmp =lpDestTmp->lpNext;
  434. }
  435. return NULL;
  436. }
  437. LPDEST_INFO GetDestBySd(int sd)
  438. {
  439. int i;
  440. LPDEST_INFO lpDestTmp;
  441. for(i =0; i<dest_info_count; i++)
  442. {
  443. lpDestTmp=&dest_info[i];
  444. if(!lpDestTmp) break;
  445. if(lpDestTmp->sd==sd)
  446. {
  447. return lpDestTmp;
  448. }
  449. }
  450. return NULL;
  451. }
  452. LPDEST_INFO GetAnotherUserById(char *Id,int sd)
  453. {
  454. int i;
  455. LPDEST_INFO lpDestTmp;
  456. for(i =0; i<dest_info_count; i++)
  457. {
  458. lpDestTmp=&dest_info[i];
  459. if(!lpDestTmp) break;
  460. if(lpDestTmp->sd!=sd&&strncmp(Id,lpDestTmp->userID,6)==0)
  461. {
  462. return lpDestTmp;
  463. }
  464. }
  465. return NULL;
  466. }
  467. LPDEST_INFO HqDestSendClose()
  468. {
  469. int i;
  470. LPDEST_INFO lpDestTmp;
  471. for(i =0; i<dest_infos.destCount; i++)
  472. {
  473. lpDestTmp=&dest_info[i];
  474. if(lpDestTmp)
  475. {
  476. if(!lpDestTmp->isDead)
  477. SendMsg(lpDestTmp->sd, "服务器开始关闭!");
  478. }
  479. }
  480. for(i =0; i<dest_infos.destCount; i++)
  481. {
  482. lpDestTmp=&dest_info[i];
  483. if(lpDestTmp)
  484. HqDestSetDeadByPrt(lpDestTmp);
  485. }
  486. return lpDestTmp;
  487. }
  488. LPDEST_INFO GetFirstDeadDest(void)
  489. {
  490. int i;
  491. LPDEST_INFO lpDestTmp;
  492. for(i =0; i<dest_info_count; i++)
  493. {
  494. lpDestTmp=&dest_info[i];
  495. if(!lpDestTmp) break;
  496. if(lpDestTmp->isDead ==TRUE && lpDestTmp-> isUsing==FALSE)
  497. {
  498. lpDestTmp->recNum =0;
  499. strcpy(lpDestTmp->userID,"");
  500. return lpDestTmp;
  501. }
  502. }
  503. return NULL;
  504. }
  505. void DelDeads(void)
  506. {
  507. LPDEST_INFO lpDestPrev, lpDestNext, lpDestTmp;
  508. int i, count =0;
  509. if(dest_infos.aliveCount ==dest_infos.destCount)
  510. return;
  511. lpDestNext =lpDestTmp =dest_infos.lpDestHead;
  512. if(lpDestTmp ==NULL) return;
  513. for(i =0; i<dest_infos.destCount; i++)
  514. {
  515. if(!lpDestTmp) break;
  516. if(!LockDest(lpDestTmp,10)) return ;
  517. lpDestNext =lpDestTmp->lpNext;
  518. if(!LockDest(lpDestNext,10)) return ;
  519. if(lpDestTmp->isDead)
  520. {
  521. lpDestTmp->isDead =TRUE;
  522. if(lpDestTmp ==dest_infos.lpDestHead)
  523. dest_infos.lpDestHead =lpDestNext;
  524. else lpDestPrev->lpNext =lpDestNext;
  525. GlobalUnlock(GlobalHandle(lpDestTmp->params));
  526. GlobalFree(GlobalHandle(lpDestTmp->params));
  527. lpDestTmp->paramsCount =0;
  528. if(lpDestTmp->lpCjss)
  529. {                               
  530. GlobalUnlock(GlobalHandle(lpDestTmp->lpCjss));
  531. GlobalFree(GlobalHandle(lpDestTmp->lpCjss));
  532. }
  533. lpDestTmp->lpCjss =NULL;
  534. if(lpDestTmp->lpGraph)
  535. {
  536. GlobalUnlock(GlobalHandle(lpDestTmp->lpGraph));
  537. GlobalFree(GlobalHandle(lpDestTmp->lpGraph));
  538. }
  539. lpDestTmp->lpGraph =NULL;
  540. if(lpDestTmp->lpZsGraph)
  541. {
  542. GlobalUnlock(GlobalHandle(lpDestTmp->lpZsGraph));
  543. GlobalFree(GlobalHandle(lpDestTmp->lpZsGraph));
  544. }
  545. lpDestTmp->lpZsGraph =NULL;
  546. count++;
  547. }
  548. else
  549. lpDestPrev =lpDestTmp;
  550. UnlockDest(lpDestTmp);
  551. UnlockDest(lpDestNext);
  552. lpDestTmp =lpDestNext;
  553. }
  554. dest_infos.destCount -=count;
  555. }
  556. void FreeDest(void)
  557. {
  558. LPDEST_INFO lpDestTmp;
  559. int i;
  560. for(i =0; i<MAX_USER_COUNT; i++)
  561. {
  562. lpDestTmp =&dest_info[i];       
  563. if(lpDestTmp ==NULL) 
  564. continue;
  565. if(lpDestTmp->params)
  566. {
  567. GlobalUnlock(GlobalHandle(lpDestTmp->params));
  568. GlobalFree(GlobalHandle(lpDestTmp->params));
  569. }
  570. if(lpDestTmp->lpCjss) 
  571. {
  572. GlobalUnlock(GlobalHandle(lpDestTmp->lpCjss));
  573. GlobalFree(GlobalHandle(lpDestTmp->lpCjss));
  574. }
  575. if(lpDestTmp->lpGraph)
  576. {
  577. GlobalUnlock(GlobalHandle(lpDestTmp->lpGraph));
  578. GlobalFree(GlobalHandle(lpDestTmp->lpGraph));
  579. }
  580. if(lpDestTmp->lpZsGraph)
  581. {
  582. GlobalUnlock(GlobalHandle(lpDestTmp->lpZsGraph));
  583. GlobalFree(GlobalHandle(lpDestTmp->lpZsGraph));
  584. }
  585. }
  586. dest_info_count =0;
  587. }
  588. int check_socket_status(int sd)
  589. {
  590. struct timeval wait;
  591. fd_set send_ready,except;
  592. wait.tv_sec =wait.tv_usec=0;
  593. FD_ZERO(&send_ready);
  594. FD_ZERO(&except);
  595. FD_SET(sd,&send_ready);
  596. FD_SET(sd,&except);
  597. if(select(FD_SETSIZE,(fd_set *)0,&send_ready,
  598. &except,&wait)<0)
  599. return(-1);
  600. if(FD_ISSET(sd,&send_ready))
  601. return(0);
  602. else if(FD_ISSET(sd,&except))
  603. return(-2);
  604. else
  605. return(-3);
  606. }
  607. long TF_ScanDest(void)
  608. {
  609. int i,j,ret,jys;
  610. LPDEST_INFO lpDestNext;
  611. DP_MAIN DpMain[2];
  612. while(1)
  613. {
  614. if(run_cancelled) break;
  615. if(IsClectRun)
  616. {
  617. if(clCheckTime(TRUE) >=0)
  618. {
  619. if(HqTime[0].fRunning)
  620. {
  621. if(!RefreshHqData(0))
  622. {
  623. MsgLocal("深圳行情刷新失败,重新启动");
  624. HqTime[0].fRunning =FALSE;
  625. CloseDbfFile(0);
  626. }
  627. CreateLzwMemData(0);
  628. }
  629. if(HqTime[1].fRunning)  
  630. {
  631. if(!RefreshHqData(1))
  632. {
  633. MsgLocal("上海行情刷新失败,重新启动");
  634. HqTime[1].fRunning =FALSE;
  635. CloseDbfFile(1);                                
  636. }
  637. CreateLzwMemData(1);
  638. }
  639. }       
  640. }
  641. else
  642. {
  643. RefreshHq(0);
  644. RefreshHq(1);
  645. }
  646. MsgLocal("扫描行情用户...");
  647. for(i =0,j=0; i<dest_info_count; i++)
  648. {
  649. if(run_cancelled) break;
  650. lpDestNext=&dest_info[i];
  651. if(!lpDestNext) 
  652. break;
  653. if(lpDestNext->isDead)
  654. continue;
  655. lpDestNext->inactive++;
  656. ret =check_socket_status(lpDestNext->sd);
  657. if(ret ==0)
  658. {
  659. if(!xLockDest(lpDestNext,3))
  660. continue;
  661. switch(lpDestNext->reqType)
  662. {
  663. case REQ_HQ01:
  664. Delay_Send_Hq01(lpDestNext);
  665. UnlockDest(lpDestNext);
  666. break;
  667. case REQ_HQ10:
  668. if(lpDestNext->version <12)
  669. {
  670. ret =UDP_Server_Send_Hq10(lpDestNext);
  671. UnlockDest(lpDestNext);
  672. }
  673. if(lpDestNext->version ==12)
  674. ret =Send_Hq10(lpDestNext);
  675. if(ret<0) continue;
  676. break;
  677. case REQ_GRA10:
  678. if(lpDestNext->version <12)
  679. {
  680. ret =UDP_Server_Send_Gra10(lpDestNext);
  681. UnlockDest(lpDestNext);
  682. }
  683. if(lpDestNext->version ==12)
  684. ret =Send_Gra10(lpDestNext);
  685. if(ret<0) continue;
  686. break;
  687. default:
  688. UnlockDest(lpDestNext);
  689. break;
  690. }       
  691. //}
  692.     FillDpMain(&DpMain[0]);
  693. //if(ret ==0)
  694. //{
  695. if(memcmp(&lpDestNext->DpData, &DpMain, sizeof(DpMain))||
  696. lpDestNext->inactive>10)
  697. {
  698. if(UDP_Server_Send_Dp(lpDestNext->sd,NULL, FALSE,lpDestNext) >0)
  699. memcpy(&lpDestNext->DpData, &DpMain, sizeof(DpMain));                   
  700. if(lpDestNext->inactive>10)
  701. lpDestNext->inactive =0;
  702. }
  703. }
  704. else
  705. {
  706. if(ret == -2) HqDestStopBySd(lpDestNext->sd);
  707. }
  708. j++;
  709. }
  710. SetHqUsers(j);
  711. Sleep(2000);
  712. }
  713. if(IsClectRun)
  714. {
  715. for(jys =0;jys<2;jys++)
  716. {
  717. WriteHqData(jys);
  718. WriteMmpData(jys);
  719. WriteMaxMinData(jys);
  720. WriteDpData(jys);
  721. }
  722. SetEvent(g_hEventDataWrite);
  723. }
  724. ExitThread(0);
  725. return 0;
  726. }
  727. int CreateScanDestThread(void)
  728. {
  729.       LONG lThreadId;
  730. hThrdScanDest =CreateThread(NULL, 0,
  731.       (LPTHREAD_START_ROUTINE)TF_ScanDest,
  732.       NULL, CREATE_SUSPENDED, (LPDWORD)&lThreadId);
  733. if(!hThrdScanDest) return -1;
  734. //SetThreadPriority(hThrdScanDest, THREAD_PRIORITY_NORMAL);
  735. SetThreadPriority(hThrdScanDest, THREAD_PRIORITY_ABOVE_NORMAL);
  736. ResumeThread(hThrdScanDest);
  737. return 0;
  738. }
  739. int FillDpMain(LPDP_MAIN lpDpMain)
  740. {
  741. int jys;
  742. for(jys =0; jys<2; jys++)
  743. {
  744. lpDpMain[jys].zs =DpData[jys].zs[0];
  745. lpDpMain[jys].zd =DpData[jys].zd[0];
  746. lpDpMain[jys].cjzje =DpData[jys].cjzje;
  747. lpDpMain[jys].npbl =DpData[jys].npbl;
  748. lpDpMain[jys].cjss =DpData[jys].cjss;
  749. lpDpMain[jys].upCount =DpData[jys].upCount;
  750. lpDpMain[jys].downCount =DpData[jys].downCount;
  751. lpDpMain[jys].equalCount =DpData[jys].equalCount;
  752. }
  753. return 0;
  754. }
  755. extern BOOL FileTranLock;
  756. BOOL GetNewsIndex(char * szNewsDir)
  757. {
  758. HFILE hFile;
  759. OFSTRUCT os;
  760. char file[80],search[128],content[200];
  761.     WIN32_FIND_DATA FindData;
  762.     HANDLE hFindFile;
  763. BOOL fFind;
  764. SYSTEMTIME SysTime;
  765. BOOL ret =FALSE;
  766. sprintf(file,"%s\news.idx",szDataPath);
  767. hFile =OpenFile(file, &os, OF_SHARE_DENY_READ|OF_WRITE|OF_CREATE);
  768. if(hFile ==HFILE_ERROR) 
  769. return ret;
  770. sprintf(search,"%s\*.*",szNewsDir);
  771. hFindFile =FindFirstFile(search,&FindData);
  772. if(hFindFile!=INVALID_HANDLE_VALUE)
  773. {
  774. FileTimeToSystemTime((FILETIME *)&FindData.ftLastWriteTime,
  775. (SYSTEMTIME*)&SysTime);
  776. sprintf(content,"%12s %ld.%02ld.%02ld %02ld.%02ld:%02ld %ldn",
  777. FindData.cFileName,
  778. SysTime.wYear,
  779. SysTime.wMonth,
  780. SysTime.wDay,
  781. SysTime.wHour,
  782. SysTime.wMinute,
  783. SysTime.wSecond,
  784. FindData.nFileSizeLow +FindData.nFileSizeHigh *256);
  785. if(FindData.dwFileAttributes!=FILE_ATTRIBUTE_DIRECTORY) 
  786. {
  787. _lwrite(hFile,content,strlen(content));
  788. ret =TRUE;
  789. }
  790. do
  791. {
  792. fFind =FindNextFile(hFindFile,&FindData);
  793. if(fFind)
  794. {
  795. FileTimeToSystemTime((FILETIME *)&FindData.ftLastWriteTime,
  796. (SYSTEMTIME*)&SysTime);
  797. sprintf(content,"%12s %ld.%02ld.%02ld %02ld.%02ld:%02ld %ldn",
  798. FindData.cFileName,
  799. SysTime.wYear,
  800. SysTime.wMonth,
  801. SysTime.wDay,
  802. SysTime.wHour,
  803. SysTime.wMinute,
  804. SysTime.wSecond,
  805. FindData.nFileSizeLow +FindData.nFileSizeHigh *256);                    
  806. if(FindData.dwFileAttributes!=FILE_ATTRIBUTE_DIRECTORY) 
  807. {
  808. _lwrite(hFile,content,strlen(content));
  809. ret =TRUE;
  810. }
  811. }
  812. }while(fFind);
  813. FindClose(hFindFile);
  814. }
  815. _lclose(hFile);
  816. return ret;
  817. }
  818. void DelNews(LPSTR szNewsDir)
  819. {
  820. char file[128],search[128];
  821.     WIN32_FIND_DATA FindData;
  822.     HANDLE hFindFile;
  823. BOOL fFind;
  824. sprintf(search,"%s\*.*",szNewsDir);
  825. hFindFile =FindFirstFile(search,&FindData);
  826. if(hFindFile!=INVALID_HANDLE_VALUE)
  827. {
  828. sprintf(file,"%s\%s",szNewsDir,FindData.cFileName);
  829. if(FindData.dwFileAttributes!=FILE_ATTRIBUTE_DIRECTORY) 
  830. DeleteFile(file);
  831. do
  832. {
  833. fFind =FindNextFile(hFindFile,&FindData);
  834. if(fFind)
  835. {
  836. sprintf(file,"%s\%s",szNewsDir,FindData.cFileName);
  837. if(FindData.dwFileAttributes!=FILE_ATTRIBUTE_DIRECTORY) 
  838. DeleteFile(file);
  839. }
  840. }while(fFind);
  841. FindClose(hFindFile);
  842. }
  843. }
  844. void MoveNews(LPSTR szNewsTo,LPSTR szNewsFrom)
  845. {
  846. char to[128],search[128],from[128],temp[128];
  847.     WIN32_FIND_DATA FindData;
  848.     HANDLE hFindFile;
  849. BOOL fFind;
  850. OFSTRUCT os;
  851. SYSTEMTIME CurDate,FileDate;
  852. if(szNewsTo[0]==0||szNewsFrom[0]==0) 
  853. return;
  854. GetSystemTime(&CurDate);
  855. sprintf(search,"%s\*.*",szNewsFrom);
  856. hFindFile =FindFirstFile(search,&FindData);
  857. if(hFindFile!=INVALID_HANDLE_VALUE)
  858. {
  859. sprintf(to,"%s\%s",szNewsTo,FindData.cFileName);
  860. sprintf(from,"%s\%s",szNewsFrom,FindData.cFileName);
  861. FileTimeToSystemTime((FILETIME *)&FindData.ftLastWriteTime,
  862. (SYSTEMTIME*)&FileDate);
  863. if(FindData.dwFileAttributes!=FILE_ATTRIBUTE_DIRECTORY &&
  864. FileDate.wMonth ==CurDate.wMonth &&
  865. FileDate.wDay ==CurDate.wDay) 
  866. {
  867. strcpy(temp,FindData.cFileName);
  868. strupr(temp);
  869. if(strstr(temp,".DBF")==NULL&&strstr(temp,".EXE")==NULL)
  870. {
  871. if(strstr(ZxDataFile,temp)==NULL)
  872. {
  873. CopyFile(from,to,TRUE);                 
  874. if(gfIsNewsSrcDel) DeleteFile(from);
  875. }
  876. else
  877. {
  878. _lclose(hfZx);
  879. CopyFile(from,ZxDataFile,TRUE);
  880. DeleteFile(from);
  881. hfZx =OpenFile(ZxDataFile, &os, OF_SHARE_DENY_NONE|OF_READ);
  882. }
  883. }
  884. }
  885. do
  886. {
  887. fFind =FindNextFile(hFindFile,&FindData);
  888. if(fFind)
  889. {
  890. sprintf(to,"%s\%s",szNewsTo,FindData.cFileName);
  891. sprintf(from,"%s\%s",szNewsFrom,FindData.cFileName);
  892. FileTimeToSystemTime((FILETIME *)&FindData.ftLastWriteTime,
  893. (SYSTEMTIME*)&FileDate);
  894. if(FindData.dwFileAttributes!=FILE_ATTRIBUTE_DIRECTORY &&
  895. FileDate.wMonth==CurDate.wMonth &&
  896. FileDate.wDay ==CurDate.wDay) 
  897. {
  898. strcpy(temp,FindData.cFileName);
  899. strupr(temp);
  900. if(strstr(temp,".DBF")==NULL&&strstr(temp,".EXE")==NULL)
  901. {
  902. if(strstr(ZxDataFile,temp)==NULL)
  903. {
  904. CopyFile(from,to,TRUE);
  905. if(gfIsNewsSrcDel) DeleteFile(from);
  906. }
  907. else
  908. {
  909. _lclose(hfZx);
  910. CopyFile(from,ZxDataFile,TRUE);
  911. DeleteFile(from);
  912. hfZx =OpenFile(ZxDataFile, &os, OF_SHARE_DENY_NONE|OF_READ);
  913. }
  914. }
  915. }
  916. }
  917. }while(fFind);
  918. FindClose(hFindFile);
  919. }
  920. }
  921. void RefreshNews(LPSTR szNewsTo,LPSTR szNewsFrom)
  922. {
  923. char to[128],search[128],from[128],temp[200];
  924.     WIN32_FIND_DATA FindData;
  925.     HANDLE hFindFile ;
  926. HFILE hFile;
  927. BOOL fFind;
  928. OFSTRUCT os;
  929. SYSTEMTIME CurDate,FileDate;
  930. if(szNewsTo[0]==0||szNewsFrom[0]==0) 
  931. return;
  932. sprintf(temp,"%s\news.idx",szDataPath);
  933. hFile =OpenFile(temp, &os, OF_SHARE_DENY_NONE|OF_WRITE);
  934. if(hFile ==HFILE_ERROR)
  935. return;
  936. if(_llseek(hFile, 0, SEEK_END)==HFILE_ERROR)
  937. {
  938. _lclose(hFile);
  939. return;
  940. }
  941. GetSystemTime(&CurDate);
  942. sprintf(search,"%s\*.*",szNewsFrom);
  943. hFindFile =FindFirstFile(search,&FindData);
  944. if(hFindFile!=INVALID_HANDLE_VALUE)
  945. {
  946. sprintf(to,"%s\%s",szNewsTo,FindData.cFileName);
  947. sprintf(from,"%s\%s",szNewsFrom,FindData.cFileName);
  948. FileTimeToSystemTime((FILETIME *)&FindData.ftLastWriteTime,
  949. (SYSTEMTIME*)&FileDate);
  950. if(FileDate.wMonth ==CurDate.wMonth &&
  951. FileDate.wDay ==CurDate.wDay) 
  952. {
  953. strcpy(temp,FindData.cFileName);
  954. strupr(temp);                   
  955. if(strstr(ZxDataFile,temp)==NULL&&strstr(temp,".DBF")==NULL
  956. &&strstr(temp,".EXE")==NULL)
  957. {
  958. if(CopyFile(from,to,TRUE))
  959. {
  960. sprintf(temp,"%12s %ld.%02ld.%02ld %02ld.%02ld:%02ld %ldn",
  961. FindData.cFileName,
  962. FileDate.wYear,
  963. FileDate.wMonth,
  964. FileDate.wDay,
  965. FileDate.wHour,
  966. FileDate.wMinute,
  967. FileDate.wSecond,
  968. FindData.nFileSizeLow +FindData.nFileSizeHigh *256);
  969. _lwrite(hFile,temp,strlen(temp));
  970. }
  971. if(gfIsNewsSrcDel) DeleteFile(from);
  972. }
  973. }
  974. do
  975. {
  976. fFind =FindNextFile(hFindFile,&FindData);
  977. if(fFind)
  978. {
  979. sprintf(to,"%s\%s",szNewsTo,FindData.cFileName);
  980. sprintf(from,"%s\%s",szNewsFrom,FindData.cFileName);
  981. FileTimeToSystemTime((FILETIME *)&FindData.ftLastWriteTime,
  982. (SYSTEMTIME*)&FileDate);
  983. if(FileDate.wMonth==CurDate.wMonth &&
  984. FileDate.wDay ==CurDate.wDay) 
  985. {
  986. strcpy(temp,FindData.cFileName);
  987. strupr(temp);
  988. if(strstr(ZxDataFile,temp)==NULL&&strstr(temp,".DBF")==NULL
  989. &&strstr(temp,".EXE")==NULL)
  990. {
  991. if(CopyFile(from,to,TRUE))
  992. {
  993. sprintf(temp,"%12s %ld.%02ld.%02ld %02ld.%02ld:%02ld %ldn",
  994. FindData.cFileName,
  995. FileDate.wYear,
  996. FileDate.wMonth,
  997. FileDate.wDay,
  998. FileDate.wHour,
  999. FileDate.wMinute,
  1000. FileDate.wSecond,
  1001. FindData.nFileSizeLow +FindData.nFileSizeHigh *256);
  1002. _lwrite(hFile,temp,strlen(temp));
  1003. }
  1004. if(gfIsNewsSrcDel) DeleteFile(from);
  1005. }
  1006. }
  1007. }
  1008. }while(fFind);
  1009. FindClose(hFindFile);           
  1010. }       
  1011. _lclose(hFile);
  1012. }
  1013. long TF_NewsManager(void)
  1014. {
  1015. SYSTEMTIME SysTime;
  1016. static BOOL IsInit =FALSE;
  1017. int minute ;
  1018. while(1)
  1019. {
  1020. if(run_cancelled) break;
  1021. GetLocalTime(&SysTime);
  1022. minute = SysTime.wHour*60+SysTime.wMinute;
  1023. if(minute<HqTime[0].am_min_start)
  1024. IsInit =FALSE;
  1025. else
  1026. {
  1027. if(!IsInit)
  1028. {
  1029. if(!FileTranLock)
  1030. {
  1031. FileTranLock =TRUE;
  1032. Sleep(3000);
  1033. DelNews(szNewsPath);
  1034. }
  1035. MoveNews(szNewsPath,szNewsSrc);
  1036. if(GetNewsIndex(szNewsPath))
  1037. {
  1038. IsInit =TRUE;   
  1039. FileTranLock =FALSE;
  1040. }
  1041. }
  1042. else
  1043. {
  1044. RefreshNews(szNewsPath,szNewsSrc);
  1045. }
  1046. }
  1047. Sleep(1000*60);
  1048. }
  1049. CloseHandle(hNewsManager);
  1050. ExitThread(0);
  1051. return 0;
  1052. }
  1053. int CreateNewsManagerThread(void)
  1054. {
  1055.       LONG lThreadId;
  1056. hNewsManager =CreateThread(NULL, 0,
  1057.       (LPTHREAD_START_ROUTINE)TF_NewsManager,
  1058.       NULL, CREATE_SUSPENDED, (LPDWORD)&lThreadId);
  1059. if(!hNewsManager) return -1;
  1060. SetThreadPriority(hNewsManager, THREAD_PRIORITY_NORMAL);
  1061. ResumeThread(hNewsManager);
  1062. return 0;
  1063. }