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

金融证券系统

开发平台:

Visual C++

  1. /* sv_comm:数据通讯机。将变化数据主动发送到每个client端。多线程
  2. *  by lgd/Paladin.InetSoft guangzhou,1996.9
  3. *  modify by lym(修改后作者里却不愿写上原作者的一个人) guangzhou,1997.4-1998
  4. */
  5. #include <windows.h>
  6. #include <stdio.h>
  7. #include <string.h>
  8. #include <time.h>
  9. #include <stdlib.h>
  10. #include "resource.h"
  11. #include "main.h"
  12. #include "pctcp.h"
  13. #include "hq.h"
  14. #include "hqdest.h"
  15. #include "jydest.h"
  16. #include "sv_hq.h"
  17. #include "sv_jy.h"
  18. #include "sv_tcp.h"
  19. #include "zx.h"
  20. #include "data.h"
  21. #include "monitor.h"
  22. #include "rsa.h"
  23. #include "cl_hq.h"
  24. #include "cl_main.h"
  25. #include "cl_data.h"
  26. #define WND_CAPTION (LPSTR)"数据通讯服务"
  27.  
  28. extern CRITICAL_SECTION hqCriticalSection;
  29. LRESULT CALLBACK MainDlgProc(HWND, UINT, WPARAM, LPARAM);
  30. HWND ghWndMain =NULL;
  31. HINSTANCE ghInstance =NULL;
  32. extern MONITOR Monitor;
  33. extern BOOL HqIsRun;
  34. extern long TF_AnaRecvData(int sd);
  35. extern long TF_ScanJyDest(void);
  36. extern DEST_INFO dest_info[];
  37. extern int dest_info_count;
  38. extern int DesInit(void);
  39. extern HINSTANCE hDesDll;
  40. void SetHqUsers(int count);
  41. void SetJyUsers(int count);
  42. extern BOOL fUseJy,fTestJy,fRsa;
  43. extern LPSTR GetError(LPSTR err_prefix);
  44. extern char szNewsPath[128],szNewsSrc[128];
  45. extern int CreateNewsManagerThread(void);
  46. //LONG g_lNumReaders =-1;
  47. //HANDLE g_hEventDataReady;
  48. //HANDLE g_hSemReaders;
  49. HANDLE g_hEventDataWrite;
  50. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hInstPre,
  51. LPSTR lpszCmdLine, int nCmdShow)
  52.  {
  53. HWND hwnd;
  54. FARPROC lpDlgProc;
  55. if(hInstPre)
  56. {
  57. hwnd =FindWindow(NULL, WND_CAPTION);
  58. if(hwnd)
  59. SetFocus(hwnd);
  60. return FALSE;
  61. }
  62.     
  63. ghInstance =hInstance;
  64. InitializeCriticalSection(&hqCriticalSection);
  65. if(!AppInit())
  66. {
  67. ErrMsg(NULL, "应用初始化失败!");
  68. goto appexit;
  69. }
  70. lpDlgProc =(FARPROC)MakeProcInstance((FARPROC)MainDlgProc, hInstance);
  71. if(lpDlgProc ==NULL)
  72. {
  73. ErrMsg(NULL, "不能建立对话框!");
  74. goto appexit;
  75. }
  76. DialogBox(hInstance, MAKEINTRESOURCE(IDD_MAIN), NULL, lpDlgProc);
  77. FreeProcInstance(lpDlgProc);
  78. appexit:
  79. AppExit();
  80. DeleteCriticalSection(&hqCriticalSection);
  81. return 0;
  82. }
  83. FILE *fpMsg =NULL;
  84. BOOL AppInit(void)
  85. {
  86. SetHandleCount(110);
  87. GlobalVaryInit();
  88. if(!DestInit())
  89. {
  90. ErrMsg(NULL, "行情目标地址表初始化失败!");
  91. return FALSE;
  92. }
  93. if(!JyDestInit())
  94. {
  95. ErrMsg(NULL, "交易目标地址表初始化失败!");
  96. return FALSE;
  97. }
  98. if(IsClectRun)
  99. {
  100. if(clHqInit() <0)
  101. {
  102. ErrMsg(NULL, "数据采集初始化失败!");
  103. return FALSE;
  104. }
  105. }
  106. else
  107. {
  108. if(HqInit() <0)
  109. {
  110. ErrMsg(NULL, "行情初始化失败!");
  111. return FALSE;
  112. }
  113. }
  114. if(JyInit() <0)
  115. {
  116. ErrMsg(NULL, "交易初始化失败!");
  117. //return FALSE;
  118. }
  119. if(MonitorInit()<0)
  120.     {
  121. ErrMsg(NULL,"用户监视初始化失败!");
  122. }
  123. if(PCTCPInit() !=0)
  124. {
  125. ErrMsg(NULL, "通讯初始化失败!");
  126. return FALSE;
  127. }
  128. return TRUE;
  129. }
  130. void AppExit(void)
  131. {
  132. static BOOL fExit =FALSE;
  133. if(fExit) return;
  134. fExit =TRUE;
  135. if(IsClectRun)
  136. clHqExit();
  137. else
  138. HqExit();
  139. JyExit();
  140. MonitorExit();
  141. DestExit();
  142. JyDestExit();
  143. PCTCPExit();
  144. }
  145. short total_times =0;
  146. extern int sdHq, sdJy;
  147. extern int BindSocket(HWND);
  148. extern void HqDestSendClose(void);
  149. LRESULT CALLBACK MainDlgProc(HWND hDlg, UINT message,
  150. WPARAM wParam, LPARAM lParam)
  151. {
  152. char dt[40];
  153. DWORD dw;
  154. char temp[400];
  155. int sdTmp =-1,sdTmp1;
  156. int i;
  157. // static int j=0;
  158. // static time_t ScanTim=0;
  159. //HANDLE hThrd;
  160. //LONG lThreadId;
  161. switch(message)
  162. {
  163. case WM_INITDIALOG:
  164. remove("\sv_com32.log");
  165. SetWindowText(hDlg, WND_CAPTION);
  166. ghWndMain =hDlg;
  167. g_hEventDataWrite =CreateEvent(NULL,TRUE,FALSE,NULL);
  168. _strdate(dt);
  169. strcat(dt, " ");
  170. _strtime(&dt[strlen(dt)]);
  171. SetDlgItemText(hDlg, IDC_STARTTIME, dt);
  172. SetDlgItemText(hDlg, IDC_STATIC1,"启动时间");
  173. SetDlgItemText(hDlg, IDC_STATIC2,"本地状态");
  174. SetDlgItemText(hDlg, IDC_STATIC3,"接收信息");
  175. SetDlgItemText(hDlg, IDC_STATIC4,"发送信息");
  176. SetDlgItemText(hDlg, IDC_STATIC5,"行情用户");
  177. SetDlgItemText(hDlg, IDC_STATIC6,"交易用户");
  178. SetDlgItemText(hDlg, IDC_STATIC7,"错误信息");
  179. if(BindSocket(hDlg) <0)
  180. {
  181. ErrMsg(hDlg, "BindSocket失败!");
  182. EndDialog(hDlg, 0);
  183. return FALSE;
  184. }
  185. ReadySysFile();
  186. PostMessage(hDlg, WM_HQ_INIT, 0, 0L);
  187. //if(Monitor.IsRun)
  188. // SetTimer(hDlg,1,Monitor.CheckPoint*60*1000,NULL);
  189. if(fUseJy||fTestJy)
  190. SetTimer(hDlg,4,9000,NULL);
  191. return TRUE;
  192. case WM_TIMER:
  193. /*
  194. if(wParam==1)
  195. {
  196. for(j =0; j<dest_info_count; j++)
  197. {
  198. lpDestTmp=&dest_info[j];
  199. if(!lpDestTmp) break;
  200. if(lpDestTmp->isDead)
  201. continue;
  202. if(strlen(lpDestTmp->userID)==0||lpDestTmp->recNum==0)
  203. continue;
  204. rtime=WriteUserStatus(lpDestTmp->recNum,
  205. (int)(difftime(time(NULL),lpDestTmp->startTime)/60),'F',"CHECKPOINT");
  206. lpDestTmp->startTime=time(NULL);
  207. if(rtime<=0)
  208. {
  209. SendMsg(lpDestTmp->sd,"你的时间用完!");
  210. HqDestSetDeadByPrt(lpDestTmp);
  211. }
  212. }
  213. }
  214. */
  215. if(wParam ==4)
  216. {
  217. //MsgLocal("扫描交易用户...");
  218. KillTimer(hDlg,4);
  219. TF_ScanJyDest();
  220. SetTimer(hDlg,4,500,NULL);
  221. //MsgLocal("扫描成功");
  222. }
  223. break;
  224. case WM_HQ_INIT:
  225. MsgLocal("初始化行情...");
  226. if(fUseJy) DesInit();
  227. ReadHq(0);
  228. ReadHq(1);
  229. CreateLzwMemData(0);
  230. CreateLzwMemData(1);
  231. if(IsClectRun)
  232. {
  233. if(CreateClectThread()<0)
  234. ErrMsg(ghWndMain, "CreateClectThread失败!");
  235. }
  236. else
  237. SetEvent(g_hEventDataWrite);
  238. //CheckTime();
  239. if(HqIsRun)
  240. {
  241. if(CreateScanDestThread() <0)
  242. ErrMsg(ghWndMain, "CreateScanDestThread失败!");
  243. }
  244. if(fUseJy)
  245. {
  246. if(CreateScanJyDestThread() <0)
  247. ErrMsg(ghWndMain, "CreateScanJyDestThread失败!");
  248. }
  249. if(szNewsPath[0]!=0 &&szNewsSrc[0]!=0)
  250. {
  251. if(CreateNewsManagerThread()<0)
  252. ErrMsg(ghWndMain, "Failed to CreateNewsManagerThread!");
  253. }
  254. if(fRsa)
  255. EnableWindow(GetDlgItem(hDlg,IDC_RSA_INIT),TRUE);
  256. MsgLocal("初始化行情成功");
  257. if(HqIsRun)
  258. {
  259. sdTmp1 =listen(sdHq,SOMAXCONN);
  260. if(sdTmp1 ==SOCKET_ERROR)
  261. {
  262. ErrMsg(NULL, GetError("来自BindSocket:listen()"));
  263. return -1;
  264. }
  265. }
  266. if(fUseJy)
  267. {
  268. sdTmp1=listen(sdJy,SOMAXCONN); //SOMAXCONN);
  269. if(sdTmp1==SOCKET_ERROR)
  270. ErrMsg(ghWndMain,GetError("来自Main:JY/listen()"));
  271. }
  272. break;
  273. case WM_UDP_HQ:
  274. sdTmp =(int)wParam;
  275. if(!HqIsRun) break;
  276. switch(lParam)
  277. {
  278. case FD_ACCEPT:
  279. sdTmp1=accept(sdHq, NULL, NULL);
  280. if(sdTmp1==INVALID_SOCKET)
  281. {
  282. ErrMsg(ghWndMain,GetError("来自Main:HQ/accept()"));
  283. break;
  284. }
  285. else
  286. {
  287. i =WSAAsyncSelect(sdTmp1, hDlg, WM_UDP_HQ, FD_READ);
  288. }
  289. //sdTmp1=listen(sdHq, 0);
  290. //if(sdTmp1==SOCKET_ERROR)
  291. // ErrMsg(ghWndMain,GetError("来自Main:HQ/listen()"));
  292. break;
  293. case FD_READ:
  294. AnaRecvData(sdTmp,0);
  295. break;
  296. }
  297. break;
  298. case WM_UDP_JY:
  299. sdTmp =(int)wParam;
  300. switch(lParam)
  301. {
  302. case FD_ACCEPT:
  303. sdTmp1=accept(sdJy, NULL, NULL);
  304. if(sdTmp1==INVALID_SOCKET)
  305. {
  306. ErrMsg(ghWndMain,GetError("来自Main:JY/accept()"));
  307. break;
  308. }
  309. //else
  310. //{
  311. // i =WSAAsyncSelect(sdTmp1, hDlg, WM_UDP_JY, FD_READ);
  312. //}
  313. //sdTmp1=listen(sdJy,SOMAXCONN);
  314. //if(sdTmp1==SOCKET_ERROR)
  315. // ErrMsg(ghWndMain,GetError("来自Main:JY/listen()"));
  316. break;
  317. case FD_READ:
  318. AnaRecvData(sdTmp,1);
  319. break;
  320. }
  321. break;
  322. case WM_COMMAND:
  323. switch(wParam)
  324. {
  325. case IDOK:
  326. if(GetFocus() ==GetDlgItem(hDlg, IDL_MSG))
  327. {
  328. dw =SendDlgItemMessage(hDlg, IDL_MSG, LB_GETCURSEL, 0, 0L);
  329. if(dw !=LB_ERR)
  330. {
  331. SendDlgItemMessage(hDlg, IDL_MSG, LB_GETTEXT, (int)dw, (LPARAM)(LPSTR)temp);
  332. MessageBox(hDlg, temp, "请您注意", MB_OK);
  333. }
  334. }
  335. break;
  336. case IDC_RSA_INIT:
  337. if(fRsa)
  338. {
  339. if(MessageBox(hDlg, "需要运行很长时间,您要继续吗?", WND_CAPTION,
  340. MB_YESNO|MB_ICONQUESTION|MB_DEFBUTTON2) ==IDNO)
  341. break;
  342. MsgLocal("初始化RSA加密参数");
  343. EnableWindow(GetDlgItem(hDlg,IDC_RSA_INIT),FALSE);
  344. if(RsaPrepare(SK,PK,R))
  345. {
  346. WriteRsaFile(R,PK,SK);
  347. }
  348. EnableWindow(GetDlgItem(hDlg,IDC_RSA_INIT),TRUE);
  349. }
  350. break;
  351. case IDCANCEL:
  352. if(MessageBox(hDlg, "您要退出吗?", WND_CAPTION,
  353. MB_YESNO|MB_ICONQUESTION|MB_DEFBUTTON2) ==IDNO)
  354. run_cancelled =FALSE;
  355. else
  356. {
  357. run_cancelled =TRUE;
  358. HqDestSendClose();
  359. if(fUseJy || fTestJy)
  360. KillTimer(hDlg,4);
  361. Sleep(2000);
  362. // WaitForSingleObject(g_hEventDataWrite,INFINITE);
  363. CloseHandle(g_hEventDataWrite);
  364. EndDialog(hDlg, 0);
  365. if(fUseJy) FreeLibrary(hDesDll);
  366. ghWndMain =NULL;
  367. PostQuitMessage(0);   // not used
  368. }
  369. break;
  370. }
  371. break;
  372. }
  373. return FALSE;
  374. }
  375. extern void WriteMsg(LPSTR msg);
  376. BOOL ErrMsg(HWND hWnd, LPSTR msg)
  377. {
  378. // char tmp[256];
  379. static BOOL msgbox_exist =FALSE;
  380. DWORD dw;
  381. //WriteMsg(msg);
  382. //if(ghWndMain)
  383. //{
  384. if((dw =SendDlgItemMessage(ghWndMain, IDL_MSG,
  385. LB_ADDSTRING, 0, (LPARAM)(LPSTR)msg))>1000)
  386. SendDlgItemMessage(ghWndMain, IDL_MSG,
  387. LB_RESETCONTENT, 0, (LPARAM)(LPSTR)msg);
  388. else SendDlgItemMessage(ghWndMain, IDL_MSG,
  389. LB_SETCURSEL, (int)dw, 0L);
  390. //}
  391. //else
  392. //if(!msgbox_exist)
  393. //{
  394. // msgbox_exist =TRUE;
  395. // if(strlen(msg)>=250) *(msg+250) =0;
  396. // wsprintf(tmp, "错误: %s", msg);
  397. // MessageBox(hWnd, tmp, WND_CAPTION, MB_OK|MB_ICONSTOP);
  398. // msgbox_exist =FALSE;
  399. //}
  400. return FALSE;
  401. }
  402. void ErrPrint(char *msg)
  403. {
  404. ErrMsg(ghWndMain, msg);
  405. }
  406. void DelSpaces(LPSTR lpstr)
  407. {
  408. return;
  409. }
  410. BOOL GetInitString(char *Entry, char *Item, char *buf)
  411. {
  412. GetPrivateProfileString(Entry, Item, "", buf, 256, "sv_com32.ini");
  413. if(*buf ==0) return FALSE;
  414. return TRUE;
  415. }
  416. BOOL PutInitString(char *Entry, char *Item, char *buf)
  417. {
  418. return WritePrivateProfileString(Entry, Item, buf, "sv_com32.ini");
  419. }
  420. void MsgSend(char far *msg)
  421. {
  422. SetDlgItemText(ghWndMain, IDC_STATUS_SEND, msg);
  423. }
  424. void MsgRecv(char far *msg)
  425. {
  426. SetDlgItemText(ghWndMain, IDC_STATUS_RECV, msg);
  427. }
  428. void MsgLocal(LPSTR msg)
  429. {
  430. SetDlgItemText(ghWndMain, IDC_STATE_LOCAL, msg);
  431. }
  432. short date_num =-1, tim =-1;
  433. short CheckTime(void)
  434. {
  435. char tmp[40];
  436. LPSTR tok;
  437. short jys;
  438. if(date_num <0)
  439. {
  440. _strdate(tmp);
  441. strtok(tmp, "/");
  442. tok =strtok(NULL, "/");
  443. date_num =atoi(tok);
  444. }
  445. _strtime(tmp);
  446. MsgLocal(tmp);
  447. tok =strtok(tmp, ":");
  448. tim =atoi(tok)*60;
  449. tim +=atoi(strtok(NULL, ":"));
  450. if(tim <5 && tim >0) date_num =-1;
  451. for(jys =0; jys <2; jys++)
  452. {
  453. if(tim-1 <HqTime[jys].am_min_start
  454. || tim >HqTime[jys].pm_min_end
  455. || (tim <HqTime[jys].pm_min_start 
  456. && tim >HqTime[jys].am_min_end))
  457. {
  458. if(HqTime[jys].fRunning ==TRUE)
  459. {
  460. HqTime[jys].fRunning =FALSE;
  461. MsgLocal("Jy is closed");
  462. }
  463. }
  464. else if(HqTime[jys].fRunning ==FALSE)
  465. HqTime[jys].fRunning =TRUE;
  466. }
  467. return 0;
  468. }
  469. void SetHqUsers(int count)
  470. {
  471. char tmp[20];
  472. wsprintf(tmp, "%d", count);
  473. SetDlgItemText(ghWndMain, IDC_HQUSERS, tmp);
  474. }
  475. void SetJyUsers(int count)
  476. {
  477. char tmp[20];
  478. wsprintf(tmp, "%d", count);
  479. SetDlgItemText(ghWndMain, IDC_JYUSERS, tmp);
  480. }
  481. void GlobalVaryInit(void)
  482. {
  483. char temp[50];
  484.     if(GetInitString("GLOBAL", "READDATA", temp))
  485. {
  486. if(temp[0] =='Y' || temp[0] =='y')
  487. gfReadData =TRUE;
  488. else
  489. gfReadData =FALSE;
  490. }
  491. else PutInitString("GLOBAL", "READDATA", "No");
  492.     if(GetInitString("GLOBAL", "CLRUN", temp))
  493. {
  494. if(temp[0] =='Y' || temp[0] =='y')
  495. IsClectRun =TRUE;
  496. else
  497. IsClectRun =FALSE;
  498. }
  499. else PutInitString("GLOBAL", "CLRUN", "No");
  500. }