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

金融证券系统

开发平台:

Visual C++

  1. #include <windows.h>
  2. #include <windowsx.h>
  3. #include <stdio.h>
  4. #include <string.h>
  5. #include <time.h>
  6. #include "resource.h"
  7. #include "main.h"
  8. #include "pctcp.h"
  9. #include "hq.h"
  10. #include "sv_hq.h"
  11. #include "hqdest.h"
  12. #include "jydest.h"
  13. #include "sv_jy.h"
  14. #include "sv_tcp.h"
  15. #include "monitor.h"
  16. #include "lzw.h"
  17. #include "rsa.h"
  18. #include "zlib.h"
  19. extern BOOL fUseJy, gfUseThrd;
  20. int sdHq =-1, sdJy =-1;
  21. extern HFILE hfZx;
  22. #define WSA_MAKEWORD(x,y)       ((y) * 256 + (x))
  23. int PROTO_USE =PROTO_TCP;
  24. BOOL gfReadData =FALSE;
  25. BOOL running =FALSE, run_cancelled =FALSE;
  26. BOOL FileTranLock=FALSE;
  27. extern MONITOR Monitor;
  28. extern char ZxDataFile[128], szDataPath[128],HqDataPath[128];
  29. extern char szNewsPath[128],szNewsSrc[128];
  30. extern int check_socket_status(int sd);
  31. FILE *fp;
  32. int gnDestCount =0;
  33. long TF_SendBuff(HANDLE phMem);
  34. BOOL IsZsRec(int, short);
  35. extern int Jy_SendRet(int sd, char, char, int);
  36. extern void JyDest_Exit(int sd);
  37. JUNK_PACK JunkPack[MAX_JUNK_PACK_COUNT];
  38. typedef unsigned char uchar;
  39. typedef int (CALLBACK* lpfnDES_INIT)(uchar *);
  40. typedef int (CALLBACK* lpfnDES_ECB3)(uchar *,uchar *);
  41. HINSTANCE hDesDll;
  42. lpfnDES_INIT desinit;
  43. lpfnDES_ECB3 ecbdecode;
  44. void WriteMsg(LPSTR msg)
  45. {                
  46. if(fp) fputs(msg, fp);
  47. }
  48. BOOL fPctcpInited =FALSE;
  49. int PCTCPInit(void)
  50. {
  51. int ret;
  52. WSADATA WSAData;
  53. fPctcpInited =TRUE;
  54. ret = WSAStartup(0x0101, &WSAData);
  55. sdHq =sdJy =-1;
  56. if (ret != 0)
  57. {
  58. ErrMsg(ghWndMain, GetError("来自WSAStartup()")); 
  59. return -1;
  60. }        
  61. return 0;
  62. }
  63. int PCTCPClose(void)
  64. {
  65. static BOOL fClosed =FALSE;
  66. int ret;
  67. if(!fPctcpInited) return 0;
  68. if(fClosed ==TRUE) return 0;
  69. fClosed =TRUE;
  70. WSACancelBlockingCall();
  71. if(sdHq !=-1)
  72. {
  73. closesocket(sdHq);
  74. sdHq =-1;
  75.     }
  76. if(sdJy !=-1)
  77. {
  78. closesocket(sdJy);
  79. sdJy =-1;
  80.     }
  81. ret = WSACleanup();
  82. if (ret == SOCKET_ERROR && h_errno == WSAEINPROGRESS)
  83. {
  84. return -1;
  85. }
  86. return 0;
  87. }
  88. int PCTCPExit(void)
  89. {
  90. static BOOL fExit =FALSE;
  91. if(fExit ==TRUE) return 0;
  92. fExit =TRUE;    
  93. PCTCPClose();
  94. if(fp) fclose(fp);
  95. return 0;
  96. }
  97. BOOL can_read =TRUE;
  98. int PCTCPStop(void)
  99. {
  100. run_cancelled =TRUE;
  101. can_read =FALSE;
  102. return 0;
  103. }
  104. void PCTCPPause(BOOL fPause)
  105. {
  106. can_read =!fPause;
  107. }                  
  108. //// used for server or broadcast client
  109. int BindSocket(HWND hWnd)
  110. {
  111. struct sockaddr_in local;
  112. int iSockType;
  113.     int ret;
  114. //    long lret;       
  115.     int hSock;
  116.     
  117. memset(&local, '', sizeof (local));
  118. iSockType = SOCK_STREAM;
  119. local.sin_family = PF_INET;
  120. local.sin_port = htons((u_short)PORT_HQ);
  121. //local.sin_addr.s_addr =INADDR_ANY;//BROADCAST;
  122.     
  123. hSock = socket(PF_INET, iSockType, 0); 
  124. if (hSock == INVALID_SOCKET) 
  125. {
  126. ErrMsg (hWnd, GetError("来自BindSocket:socket()"));
  127. return -1;
  128. }
  129.     
  130. ret = bind(hSock, (struct sockaddr FAR *) &local, sizeof(local));
  131. if (ret == SOCKET_ERROR)
  132. {
  133. ErrMsg(hWnd, GetError("来自BindSocket:bind()")); 
  134. return -1;
  135. }
  136.     
  137. /*if(PROTO_USE ==PROTO_TCP)
  138. {
  139. lret = 1L;
  140. ioctlsocket(hSock, FIONBIO, (u_long FAR *) &lret); 
  141. }
  142. */
  143. sdHq =hSock;
  144. ret =WSAAsyncSelect(sdHq, hWnd, WM_UDP_HQ, FD_ACCEPT); //FD_READ|
  145. if(ret <0)
  146. {
  147. ErrMsg(hWnd, GetError("来自BindSocket:asyncselect"));
  148. return -1;
  149. }
  150. // ret =listen(sdHq, SOMAXCONN);
  151. // if(ret ==SOCKET_ERROR)
  152. // {
  153. // ErrMsg(NULL, GetError("来自BindSocket:listen()"));
  154. // return -1;
  155. // }
  156. local.sin_port = htons((u_short)PORT_JY);
  157. hSock = socket(PF_INET, iSockType, 0); 
  158. if (hSock == INVALID_SOCKET) 
  159. {
  160. ErrMsg (hWnd, GetError("来自BindSocket:socket()1"));
  161. return -1;
  162. }
  163.     
  164. ret = bind(hSock, (struct sockaddr FAR *) &local, sizeof(local));
  165. if (ret == SOCKET_ERROR)
  166. {
  167. ErrMsg(hWnd, GetError("来自BindSocket:bind()1")); 
  168. return -1;
  169. }
  170. //if(PROTO_USE ==PROTO_TCP)
  171. //{
  172. // lret = 1L;
  173. // ioctlsocket(hSock, FIONBIO, (u_long FAR *) &lret); 
  174. //}
  175. sdJy =hSock;
  176. ret =WSAAsyncSelect(sdJy, hWnd, WM_UDP_JY, FD_ACCEPT|FD_READ); //FD_READ|
  177. if(ret <0)
  178. {
  179. ErrMsg(hWnd, GetError("来自BindSocket:asyncselect1"));
  180. return -1;
  181. }
  182. // ret =listen(sdJy, 0);
  183. // if(ret ==SOCKET_ERROR)
  184. // {
  185. // ErrMsg(NULL, GetError("来自BindSocket:listen()"));
  186. // return -1;
  187. // }
  188. return 0;
  189. }
  190. int DesInit(void)
  191. {
  192. hDesDll = LoadLibrary("DES3W32.DLL");
  193. if(hDesDll==NULL)
  194. {
  195. ErrMsg(ghWndMain, "can not load DES dll"); 
  196. return -1;
  197. }
  198. desinit= (lpfnDES_INIT)GetProcAddress(hDesDll,"desinit");
  199. ecbdecode =(lpfnDES_ECB3)GetProcAddress(hDesDll,"ecbdecode");
  200. if(!desinit||!ecbdecode)
  201. {
  202. ErrMsg(ghWndMain, "can not load DES FUNC"); 
  203. FreeLibrary(hDesDll);
  204. return -1;
  205. }
  206. return 0;
  207. }
  208. #define         DATA_START_SIGN         -16
  209.  
  210. typedef struct tag_RECV_PARA
  211. {
  212. int sd;
  213. int len;
  214. char *para;
  215. HANDLE hThread;
  216. }RECV_PARA, *LPRECV_PARA;
  217. long TF_ReadHq(HANDLE hMem)
  218. {
  219. int sd,len;
  220.     char *RecvBuf;
  221. struct sockaddr_in dest;
  222.     DEST_INFO *lpDest;
  223. int len1,ret;
  224. BYTE FAR *lpTmp;
  225. HANDLE hThrd =NULL;
  226. LPRECV_PARA lpRecvPara =NULL;
  227. lpRecvPara =GlobalLock(hMem);
  228. if(lpRecvPara ==NULL)
  229. {
  230. ErrMsg(ghWndMain, "来自TF_ReadHq:目标信息指针为空!");
  231. goto thread_exit;
  232. }
  233. len1 = sizeof(dest);
  234. sd =lpRecvPara->sd;
  235. len =lpRecvPara->len;
  236. RecvBuf =lpRecvPara->para;
  237. if(len <=0)
  238. {
  239. ErrMsg(ghWndMain,"数据长度错1");
  240. goto thread_exit;
  241. }
  242. lpTmp =&RecvBuf[0];
  243. if(strncmp(HQ00_HEAD, RecvBuf, strlen(HQ00_HEAD)) ==0)
  244. {
  245. MsgRecv("行情00");
  246. if(UDP_Server_Send_Hq01(sd, &RecvBuf[strlen(HQ00_HEAD)],
  247. (struct sockaddr* )&dest)<0)
  248. {
  249. SendMsg(sd,"处理行情00错");
  250. }
  251. }       
  252. else if(strncmp(GRA00_HEAD, lpTmp, strlen(GRA00_HEAD)) ==0)
  253. {
  254. MsgRecv("分时图00");
  255. UDP_Server_Send_Gra01(sd, &RecvBuf[strlen(GRA00_HEAD)],
  256. (struct sockaddr *)&dest);
  257. }
  258. else if(strncmp(HQREF_HEAD, lpTmp, strlen(HQREF_HEAD)) ==0)
  259. {
  260. MsgRecv("数据采集机信息");
  261. //Data_RefHq(lpTmp+strlen(HQREF_HEAD));
  262. }
  263. else if(strncmp(CLNT_EXIT, lpTmp, strlen(CLNT_EXIT)) ==0)
  264. {
  265. MsgRecv("退出");
  266. HqDestStopBySd(sd);
  267. }
  268. else if(!strncmp(ZX_HEAD, lpTmp, strlen(ZX_HEAD)))
  269. {
  270. MsgRecv("资讯");
  271. UDP_Server_Send_Zx(sd, lpTmp+strlen(ZX_HEAD), (struct sockaddr *)&dest);
  272. }
  273. else if(!strncmp(DATA_DAY_HEAD, lpTmp, strlen(DATA_DAY_HEAD)))
  274. {
  275. MsgRecv("日线");
  276. SendDataDay(sd, lpTmp+strlen(DATA_DAY_HEAD), (struct sockaddr *)&dest);
  277. }
  278. else if(!strncmp(GETZQMC_HEAD, lpTmp, strlen(GETZQMC_HEAD)))
  279. {
  280. MsgRecv("股票名称");
  281. UDP_Server_Send_GetZqmc(sd, lpTmp+strlen(GETZQMC_HEAD), (struct sockaddr *)&dest);
  282. }
  283. else if(!strncmp(HQ_CHKUSR_HEAD, lpTmp, strlen(HQ_CHKUSR_HEAD)))
  284. {
  285. MsgRecv("效验行情用户");
  286. UDP_Server_Send_HqChkUsr(sd, lpTmp+strlen(HQ_CHKUSR_HEAD), (struct sockaddr *)&dest);
  287. }
  288. else if(!strncmp(STOCK_INFO_HEAD,lpTmp, strlen(STOCK_INFO_HEAD)))
  289. {
  290. MsgRecv("个股资料");
  291.         UDP_Send_File(sd,(FILE_INFO_FRAME *)(lpTmp+strlen(STOCK_INFO_HEAD)));
  292. }
  293. else if(!strncmp("SETENV",lpTmp,6))
  294. {
  295. if(Monitor.IsRun)
  296. {
  297.             lpDest =GetDestBySd(sd);
  298. if(lpDest!=NULL)
  299. {
  300. MsgRecv("环境设置");
  301. ret =SetUserEnv(lpDest->recNum,(TCP_FRAME_HQ_ENV *)lpTmp,len);
  302. if(ret ==SET_SUCC)
  303. SendMsg(sd,"修改行情用户密码成功");
  304. if(ret ==SET_PWD_ERROR)
  305. SendMsg(sd,"输入的原密码错,不能修改行情用户密码");
  306. if(ret ==SET_DATA_ERROR)
  307. SendMsg(sd,"输入的数据有误,不能修改行情用户密码");
  308. if(ret ==SET_SYS_ERROR)
  309. SendMsg(sd,"主机系统有误,不能修改行情用户密码");
  310. }
  311. else
  312. {
  313. SendMsg(sd,"用户登录有误,不能修改行情用户密码");
  314. }
  315. }
  316. }
  317. else
  318. {
  319. SendMsg(sd,"未识行情数据包");
  320.     }
  321. thread_exit:
  322. if(lpRecvPara!=NULL)
  323. {
  324. hThrd =lpRecvPara->hThread;
  325. GlobalFreePtr(lpRecvPara->para);
  326. GlobalFreePtr(lpRecvPara);
  327. }
  328. if(hThrd!=NULL)
  329. CloseHandle(hThrd);
  330. ExitThread(0);
  331. return 0;
  332. }
  333. int AnaRecvData(int sd,int type)
  334. {
  335. short prt,len,try_times,dataNum;
  336. char temp[MAX_RECV_BUF_SIZE+1];  
  337. char ReadBuf[MAX_RECV_BUF_SIZE+1];
  338. struct sockaddr_in dest;
  339. int len1,i;
  340.     prt=len=try_times=dataNum=0;
  341. memset((char *)&temp[0],0,MAX_RECV_BUF_SIZE*sizeof(char));
  342. len = recvfrom(sd,(char *) temp,sizeof(temp),
  343. 0, (struct sockaddr *) &dest, (int FAR *) &len1);
  344. if (len == SOCKET_ERROR) 
  345. {
  346. MessageBeep(0);
  347. return -1;
  348. }
  349. if(len <=0)
  350. {
  351.         ErrMsg(ghWndMain,"接收数据长度小于零");
  352. return -1;
  353. }
  354.     while(prt<len)
  355.     {
  356. if(temp[prt]!=DATA_START_SIGN)
  357. {
  358. for(i=0;i<MAX_JUNK_PACK_COUNT;i++)
  359. {
  360. if(JunkPack[i].sd==sd)
  361. break;
  362. }
  363. if(JunkPack[i].sd==sd&&JunkPack[i].junk[0]==DATA_START_SIGN)
  364. {
  365. while(JunkPack[i].len<1+sizeof(short))
  366. {
  367. JunkPack[i].junk[JunkPack[i].len]=temp[prt];
  368. JunkPack[i].len++;
  369. prt++;
  370. if(prt>=len)
  371. return 0;
  372. }
  373. if(JunkPack[i].len+(len-prt)>=*(short*)&JunkPack[i].junk[1]+3)
  374. {
  375. memcpy(&JunkPack[i].junk[JunkPack[i].len],&temp[prt],
  376. *(short*)&JunkPack[i].junk[1]-(JunkPack[i].len-3));
  377. prt+=*(short*)&JunkPack[i].junk[1]-(JunkPack[i].len-3);
  378. memset(&ReadBuf[0],0,MAX_RECV_BUF_SIZE);
  379. memcpy(&ReadBuf[0],&JunkPack[i].junk[1+sizeof(short)],
  380. *(short*)&JunkPack[i].junk[1]);
  381. dataNum=*(short*)&JunkPack[i].junk[1];
  382. memset(&JunkPack[i],0,sizeof(JUNK_PACK));
  383. }
  384. else
  385. {
  386. memcpy(&JunkPack[i].junk[JunkPack[i].len],&temp[prt],
  387. len-prt);
  388. JunkPack[i].len+=len-prt;
  389. return 0;
  390. }
  391. }
  392. else
  393. {
  394. // ErrMsg(ghWndMain,"丢弃该数据包");
  395. return -1;
  396. }
  397. }                       
  398. else
  399. {
  400. if(prt+1+2>=len)
  401. {
  402. do
  403. {
  404. for(i=0;i<MAX_JUNK_PACK_COUNT;i++)
  405. {
  406. if(JunkPack[i].sd==0||
  407. difftime(time(NULL),JunkPack[i].ltime)>MAX_JUNK_VALID_TIME)
  408. break;
  409. }
  410. ShoutBlockingHook();
  411. }while(i>=MAX_JUNK_PACK_COUNT);
  412. JunkPack[i].sd=sd;
  413. JunkPack[i].ltime=time(NULL);
  414. memcpy(&JunkPack[i].junk[JunkPack[i].len],
  415. &temp[prt],len-prt);
  416. JunkPack[i].len=len-prt;
  417. return 0;
  418. }
  419. dataNum=*(short *)&temp[prt+1];
  420. if(dataNum<=0)
  421. {
  422. ErrMsg(ghWndMain,"数据长度错");
  423. return -1;
  424. }
  425. if(prt+1+2+dataNum>len)
  426. {
  427. do
  428. {
  429. for(i=0;i<MAX_JUNK_PACK_COUNT;i++)
  430. {
  431. if(JunkPack[i].sd==0||
  432. difftime(time(NULL),JunkPack[i].ltime)>MAX_JUNK_VALID_TIME)
  433. break;
  434. }
  435. if(i>=MAX_JUNK_PACK_COUNT)
  436. ShoutBlockingHook();
  437. }while(i>=MAX_JUNK_PACK_COUNT);
  438. JunkPack[i].sd=sd;
  439. JunkPack[i].ltime=time(NULL);
  440. memcpy(&JunkPack[i].junk[JunkPack[i].len],
  441. &temp[prt],len-prt);
  442. JunkPack[i].len=len-prt;
  443. return 0;
  444. }
  445. else
  446. {
  447. memset(&ReadBuf[0],0,MAX_RECV_BUF_SIZE);
  448. memcpy(&ReadBuf[0],&temp[prt+1+sizeof(short)],dataNum);
  449. prt+=1+sizeof(short)+dataNum;
  450. }
  451. }       
  452. if(type==0)
  453. UDP_ReadHq(sd,&ReadBuf[0],(int )dataNum,dest);
  454. else
  455. UDP_ReadJy(sd,&ReadBuf[0],(int )dataNum,dest);
  456. dataNum=0;
  457. if(prt>=len)
  458. {
  459. dataNum=0;
  460. return 0;               
  461. }       
  462.     }
  463.     return 0;        
  464. }
  465. long TF_AnaRecvData(int sd)
  466. {
  467. short prt,len,try_times,dataNum;
  468. char temp[MAX_RECV_BUF_SIZE+1];  
  469. char ReadBuf[MAX_RECV_BUF_SIZE+1];
  470. struct sockaddr_in dest;
  471. int len1,i;
  472. int type =0;
  473.     prt=len=try_times=dataNum=0;
  474. memset((char *)&temp[0],0,MAX_RECV_BUF_SIZE*sizeof(char));
  475. len = recvfrom(sd,(char *) temp,sizeof(temp),
  476. 0, (struct sockaddr *) &dest, (int FAR *) &len1);
  477. if (len == SOCKET_ERROR) 
  478. {
  479. MessageBeep(0);
  480. return -1;
  481. }
  482. if(len <=0)
  483. {
  484.         ErrMsg(ghWndMain,"接收数据长度小于零");
  485. return -1;
  486. }
  487.     while(prt<len)
  488.     {
  489. if(temp[prt]!=DATA_START_SIGN)
  490. {
  491. for(i=0;i<MAX_JUNK_PACK_COUNT;i++)
  492. {
  493. if(JunkPack[i].sd==sd)
  494. break;
  495. }
  496. if(JunkPack[i].sd==sd&&JunkPack[i].junk[0]==DATA_START_SIGN)
  497. {
  498. while(JunkPack[i].len<1+sizeof(short))
  499. {
  500. JunkPack[i].junk[JunkPack[i].len]=temp[prt];
  501. JunkPack[i].len++;
  502. prt++;
  503. if(prt>=len)
  504. return 0;
  505. }
  506. if(JunkPack[i].len+(len-prt)>=*(short*)&JunkPack[i].junk[1]+3)
  507. {
  508. memcpy(&JunkPack[i].junk[JunkPack[i].len],&temp[prt],
  509. *(short*)&JunkPack[i].junk[1]-(JunkPack[i].len-3));
  510. prt+=*(short*)&JunkPack[i].junk[1]-(JunkPack[i].len-3);
  511. memset(&ReadBuf[0],0,MAX_RECV_BUF_SIZE);
  512. memcpy(&ReadBuf[0],&JunkPack[i].junk[1+sizeof(short)],
  513. *(short*)&JunkPack[i].junk[1]);
  514. dataNum=*(short*)&JunkPack[i].junk[1];
  515. memset(&JunkPack[i],0,sizeof(JUNK_PACK));
  516. }
  517. else
  518. {
  519. memcpy(&JunkPack[i].junk[JunkPack[i].len],&temp[prt],
  520. len-prt);
  521. JunkPack[i].len+=len-prt;
  522. return 0;
  523. }
  524. }
  525. else
  526. {
  527. ErrMsg(ghWndMain,"丢弃该数据包");
  528. return -1;
  529. }
  530. }                       
  531. else
  532. {
  533. if(prt+1+2>=len)
  534. {
  535. do
  536. {
  537. for(i=0;i<MAX_JUNK_PACK_COUNT;i++)
  538. {
  539. if(JunkPack[i].sd==0||
  540. difftime(time(NULL),JunkPack[i].ltime)>MAX_JUNK_VALID_TIME)
  541. break;
  542. }
  543. if(i>=MAX_JUNK_PACK_COUNT)
  544. ShoutBlockingHook();
  545. }while(i>=MAX_JUNK_PACK_COUNT);
  546. JunkPack[i].sd=sd;
  547. JunkPack[i].ltime=time(NULL);
  548. memcpy(&JunkPack[i].junk[JunkPack[i].len],
  549. &temp[prt],len-prt);
  550. JunkPack[i].len=len-prt;
  551. return 0;
  552. }
  553. dataNum=*(short *)&temp[prt+1];
  554. if(dataNum<=0)
  555. {
  556. ErrMsg(ghWndMain,"数据长度错");
  557. return -1;
  558. }
  559. if(prt+1+2+dataNum>len)
  560. {
  561. do
  562. {
  563. for(i=0;i<MAX_JUNK_PACK_COUNT;i++)
  564. {
  565. if(JunkPack[i].sd==0||
  566. difftime(time(NULL),JunkPack[i].ltime)>MAX_JUNK_VALID_TIME)
  567. break;
  568. }
  569. if(i>=MAX_JUNK_PACK_COUNT)
  570. ShoutBlockingHook();
  571. }while(i>=MAX_JUNK_PACK_COUNT);
  572. JunkPack[i].sd=sd;
  573. JunkPack[i].ltime=time(NULL);
  574. memcpy(&JunkPack[i].junk[JunkPack[i].len],
  575. &temp[prt],len-prt);
  576. JunkPack[i].len=len-prt;
  577. return 0;
  578. }
  579. else
  580. {
  581. memset(&ReadBuf[0],0,MAX_RECV_BUF_SIZE);
  582. memcpy(&ReadBuf[0],&temp[prt+1+sizeof(short)],dataNum);
  583. prt+=1+sizeof(short)+dataNum;
  584. }
  585. }       
  586. UDP_ReadHq(sd,&ReadBuf[0],(int )dataNum,dest);
  587. dataNum=0;
  588. if(prt>=len)
  589. {
  590. dataNum=0;
  591. return 0;               
  592. }       
  593.     }
  594.     return 0;        
  595. }
  596. int UDP_ReadHq(int sd,char * RecvBuf,int len,struct sockaddr_in dest)
  597. {
  598. int len1,ret;
  599. BYTE FAR *lpTmp;
  600.     DEST_INFO *lpDest;
  601. len1 = sizeof(dest);
  602. if(len <=0)
  603. {
  604. ErrMsg(ghWndMain,"数据长度错1");
  605. return -1;
  606. }
  607. lpTmp =&RecvBuf[0];
  608. if(strncmp(HQ00_HEAD, RecvBuf, strlen(HQ00_HEAD)) ==0)
  609. {
  610. MsgRecv("行情00");
  611. ret =UDP_Server_Send_Hq01(sd, &RecvBuf[strlen(HQ00_HEAD)],
  612. (struct sockaddr* )&dest);
  613. //if(ret <0)
  614. //{
  615. // SendMsg(sd,"处理行情00错");
  616. // return -1;
  617. //}
  618. }       
  619. else if(strncmp(XHQ00_HEAD, RecvBuf, strlen(XHQ00_HEAD)) ==0)
  620. {
  621. MsgRecv("行情00");
  622. ret =Send_Hq01(sd, &RecvBuf[strlen(XHQ00_HEAD)],
  623. (struct sockaddr* )&dest);
  624. if(ret <0)
  625. {
  626. SendMsg(sd,"处理行情00错");
  627. return -1;
  628. }
  629. }       
  630. else if(strncmp(GRA00_HEAD, lpTmp, strlen(GRA00_HEAD)) ==0)
  631. {
  632. MsgRecv("分时图00");
  633. ret =UDP_Server_Send_Gra01(sd, &RecvBuf[strlen(GRA00_HEAD)],
  634. (struct sockaddr *)&dest);
  635.         if(ret <0)
  636. SendMsg(sd,"处理分时图00错");
  637. }
  638. else if(strncmp(XGRA00_HEAD, lpTmp, strlen(GRA00_HEAD)) ==0)
  639. {
  640. Send_Gra01(sd, &RecvBuf[strlen(XGRA00_HEAD)],
  641. (struct sockaddr *)&dest);
  642. }
  643. else if(strncmp(HQREF_HEAD, lpTmp, strlen(HQREF_HEAD)) ==0)
  644. {
  645. MsgRecv("数据采集机信息");
  646. //Data_RefHq(lpTmp+strlen(HQREF_HEAD));
  647. }
  648. else if(strncmp(CLNT_EXIT, lpTmp, strlen(CLNT_EXIT)) ==0)
  649. {
  650. MsgRecv("退出");
  651. HqDestStopBySd(sd);
  652. }
  653. else if(!strncmp(ZX_HEAD, lpTmp, strlen(ZX_HEAD)))
  654. {
  655. MsgRecv("资讯");
  656. UDP_Server_Send_Zx(sd, lpTmp+strlen(ZX_HEAD), (struct sockaddr *)&dest);
  657. }
  658. else if(!strncmp(DATA_DAY_HEAD, lpTmp, strlen(DATA_DAY_HEAD)))
  659. {
  660. SendDataDay(sd, lpTmp+strlen(DATA_DAY_HEAD), (struct sockaddr *)&dest);
  661. }
  662. else if(!strncmp(DAY_DATA_HEAD, lpTmp, strlen(DAY_DATA_HEAD)))
  663. {
  664. SendDayData(sd, lpTmp+strlen(DAY_DATA_HEAD), (struct sockaddr *)&dest);
  665. }
  666. else if(!strncmp(GETZQMC_HEAD, lpTmp, strlen(GETZQMC_HEAD)))
  667. {
  668. UDP_Server_Send_GetZqmc(sd, lpTmp+strlen(GETZQMC_HEAD), (struct sockaddr *)&dest);
  669. }
  670. else if(!strncmp(HQ_CHKUSR_HEAD, lpTmp, strlen(HQ_CHKUSR_HEAD)))
  671. {
  672. MsgRecv("效验行情用户");
  673. UDP_Server_Send_HqChkUsr(sd, lpTmp+strlen(HQ_CHKUSR_HEAD), (struct sockaddr *)&dest);
  674. }
  675. else if(!strncmp(STOCK_INFO_HEAD,lpTmp, strlen(STOCK_INFO_HEAD)))
  676. {
  677. MsgRecv("个股资料");
  678.         UDP_Send_File(sd,(FILE_INFO_FRAME *)(lpTmp+strlen(STOCK_INFO_HEAD)));
  679. }
  680. else if(!strncmp("SETENV",lpTmp,6))
  681. {
  682. if(Monitor.IsRun)
  683. {
  684.             lpDest =GetDestBySd(sd);
  685. if(lpDest!=NULL)
  686. {
  687. MsgRecv("环境设置");
  688. ret =SetUserEnv(lpDest->recNum,(TCP_FRAME_HQ_ENV *)lpTmp,len);
  689. if(ret ==SET_SUCC)
  690. SendMsg(sd,"修改行情用户密码成功");
  691. if(ret ==SET_PWD_ERROR)
  692. SendMsg(sd,"输入的原密码错,不能修改行情用户密码");
  693. if(ret ==SET_DATA_ERROR)
  694. SendMsg(sd,"输入的数据有误,不能修改行情用户密码");
  695. if(ret ==SET_SYS_ERROR)
  696. SendMsg(sd,"主机系统有误,不能修改行情用户密码");
  697. }
  698. else
  699. {
  700. SendMsg(sd,"用户登录有误,不能修改行情用户密码");
  701. }
  702. }
  703. }
  704. else
  705. {
  706. SendMsg(sd,"未识行情数据包");
  707.     }
  708. return 0;
  709. }
  710. extern short date_num;
  711. int UDP_Server_Send_Hq00(int sd, int jys, struct sockaddr *lpdest)
  712. {
  713. BYTE SendBuff[MAX_SEND_BUF_SIZE+1];
  714. int len;
  715. time_t ltime;
  716. memset(&SendBuff[0],0, sizeof(SendBuff));
  717. strcpy(SendBuff, HQ00_HEAD);
  718. len =strlen(HQ00_HEAD)+sizeof(short);
  719. SendBuff[len++] =(BYTE)jys;
  720. *(short *)&SendBuff[len] =HqData[jys].recCount;
  721. len +=sizeof(short);
  722. memcpy(&SendBuff[len], &HqTime[jys], sizeof(HqTime[jys])-sizeof(BOOL));
  723. len +=sizeof(HqTime[jys])-sizeof(BOOL);
  724. time(&ltime);
  725. memcpy(&SendBuff[len], &ltime, sizeof(ltime));
  726. len +=sizeof(ltime);
  727. SendBuff[len++] =(BYTE)date_num;
  728. *(short *)&SendBuff[strlen(HQ00_HEAD)] =len;
  729. return UDP_SendBuff("行情00", sd, SendBuff, len, NULL);
  730. }
  731. int UDP_Server_Send_Hq01(int sd, LPSTR lpTmp, struct sockaddr *lpdest)
  732. {
  733. BYTE SendBuff[MAX_SEND_BUF_SIZE+1];
  734. short jys, recCount, recNum, sendCount, sendCount1, sendNum;
  735. short recList[MAX_PARA_COUNT+1];
  736. short i, j, len, len1;
  737. BYTE client_version;
  738. BOOL fRefresh, fSel, fFirstTime;
  739. memset(&SendBuff[0],0, sizeof(SendBuff));
  740. client_version =*lpTmp++;
  741. if(client_version <SERVER_VERSION)
  742. {
  743. SendMsg(sd, "版本错!");
  744. return 0;
  745. }
  746. jys =*lpTmp++;
  747. fFirstTime =(BOOL)*lpTmp++;
  748. if(fFirstTime)
  749. {
  750. if(UDP_Server_Send_Hq00(sd, jys, lpdest)<0)
  751. return 0;
  752. }
  753. fRefresh =*lpTmp++;
  754. fSel =*lpTmp++;
  755. strcpy(SendBuff, HQ01_HEAD); 
  756. len =strlen(HQ01_HEAD)+sizeof(short);
  757. SendBuff[len++] =(BYTE)jys;
  758. SendBuff[len++] =(BYTE)fRefresh;
  759. SendBuff[len++] =(BYTE)fSel;
  760. len1 =len;
  761. recCount =*(short *)lpTmp;
  762. if(recCount <=0 || recCount >MAX_PARA_COUNT) return -1;
  763. lpTmp +=2;
  764. *(short *)&SendBuff[len] =0;
  765. len +=sizeof(short);
  766. memset(recList, 0, sizeof(short)*MAX_PARA_COUNT);
  767. recList[0] =recCount;
  768. if(!fSel)
  769. {
  770. recNum =*(short *)lpTmp;
  771. if(recNum >=HqData[jys].recCount)
  772. {
  773. ErrMsg(ghWndMain,"来自Send_Hq01:记录编号大于行情总数");
  774. return -1;
  775. }
  776. if(recNum <0)
  777. {
  778. ErrMsg(ghWndMain,"来自Send_Hq01:记录编号小于零");
  779. return -1;
  780. }
  781. lpTmp+=2;
  782. //最大编号错
  783. if(recNum +recCount-1 >=HqData[jys].recCount)
  784. {
  785. recCount =HqData[jys].recCount -recNum;
  786. recList[0] =recCount;
  787. }
  788. for(i =0; i<recCount; i++)
  789. recList[i+1] =recNum+i;
  790. }
  791. else            
  792. {
  793. memcpy(&recList[1], lpTmp, sizeof(short)*recCount);
  794. lpTmp +=sizeof(short)*recCount;
  795. }
  796. ///////////////
  797. if(!fFirstTime) goto check_dest;
  798. sendCount1 =0;
  799. for(i =0; i <=recCount/MAX_HQ_SEND_COUNT; i++)
  800. {
  801. sendCount =MAX_HQ_SEND_COUNT;
  802. recNum =i*MAX_HQ_SEND_COUNT;
  803. if(recNum+sendCount >recCount)
  804. sendCount =recCount-recNum;
  805. for(j =0; j<sendCount; j++)
  806. {
  807. sendNum =recList[1+recNum+j];
  808. if(sendNum <0 || sendNum >=HqData[jys].recCount)
  809. {
  810. ErrMsg(ghWndMain,"来自Send_Hq01:列表参数错");
  811. return -1;
  812. }
  813. if(!fRefresh)
  814. {
  815. *(short *)&SendBuff[len] =sendNum;
  816. len+=2;
  817. memcpy(&SendBuff[len], &HqData[jys].lpPreData[sendNum],
  818. sizeof(HQ_PRE_DATA));
  819. len +=sizeof(HQ_PRE_DATA);
  820. memcpy(&SendBuff[len], &HqData[jys].lpRefData[sendNum],
  821. sizeof(HQ_REF_DATA));
  822. len +=sizeof(HQ_REF_DATA);
  823. sendCount1++;
  824. }
  825. else
  826. {
  827. if(HqData[jys].lpRefData[sendNum].cjss !=*(int *)lpTmp)
  828. {
  829. *(short *)&SendBuff[len] =sendNum;
  830. len+=2;
  831. memcpy(&SendBuff[len], &HqData[jys].lpRefData[sendNum],
  832. sizeof(HQ_REF_DATA));
  833. len +=sizeof(HQ_REF_DATA);
  834. sendCount1++;
  835. }
  836. lpTmp +=sizeof(int);
  837. }
  838. if(sendCount1 >=MAX_HQ_SEND_COUNT)
  839. {
  840. *(short *)&SendBuff[len1] =sendCount1;
  841. *(short *)&SendBuff[strlen(HQ01_HEAD)] =len;
  842. if(UDP_SendBuff("行情01", sd, SendBuff, len, NULL)<0)
  843. return -1;
  844. sendCount1 =0;
  845. len =len1+sizeof(short);
  846. }
  847. }
  848. if(sendCount1)
  849. {
  850. *(short *)&SendBuff[len1] =sendCount1;
  851. *(short *)&SendBuff[strlen(HQ01_HEAD)] =len;
  852. if(UDP_SendBuff("行情01", sd, SendBuff, len, NULL)<0)
  853. return -1;
  854. }
  855. }
  856. check_dest:
  857. if(fFirstTime)
  858. CheckDest(sd, lpdest, jys, REQ_HQ10, recList, (short)(recCount+1),client_version);
  859. else
  860. CheckDest(sd, lpdest, jys, REQ_HQ01, recList, (short)(recCount+1),client_version);
  861. if(fFirstTime)
  862. UDP_Server_Send_Dp(sd, lpdest, TRUE, NULL);
  863. return recCount;
  864. }
  865. int Delay_Send_Hq01(LPDEST_INFO lpDest)
  866. {
  867. BYTE SendBuff[MAX_SEND_BUF_SIZE+1];
  868. short jys, recCount, recNum, sendCount, sendCount1, sendNum;
  869. short recList[MAX_PARA_COUNT+1];
  870. short i, j, len, len1;
  871. BYTE client_version;
  872. BOOL fRefresh, fSel, fFirstTime;
  873. int sd;
  874. memset(&SendBuff[0],0, sizeof(SendBuff));
  875. sd =lpDest->sd;
  876. client_version =lpDest->version;
  877. if(client_version <SERVER_VERSION)
  878. {
  879. SendMsg(sd, "版本错!");
  880. return 0;
  881. }
  882. jys =lpDest->curJys;
  883. fFirstTime =FALSE;
  884. fRefresh =FALSE;
  885. fSel =TRUE; //*lpTmp++;
  886. strcpy(SendBuff, HQ01_HEAD); 
  887. len =strlen(HQ01_HEAD)+sizeof(short);
  888. SendBuff[len++] =(BYTE)jys;
  889. SendBuff[len++] =(BYTE)fRefresh;
  890. SendBuff[len++] =(BYTE)fSel;
  891. len1 =len;
  892. recCount =lpDest->params[0];
  893. if(recCount <=0 || recCount >MAX_PARA_COUNT) return -1;
  894. *(short *)&SendBuff[len] =0;
  895. len +=sizeof(short);
  896. memset(recList, 0, sizeof(short)*MAX_PARA_COUNT);
  897. recList[0] =recCount;
  898. if(!fSel)
  899. {
  900. recNum =lpDest->params[1];
  901. if(recNum >=HqData[jys].recCount)
  902. {
  903. ErrMsg(ghWndMain,"来自Send_Hq01:记录编号大于行情总数");
  904. return -1;
  905. }
  906. if(recNum <0)
  907. {
  908. ErrMsg(ghWndMain,"来自Send_Hq01:记录编号小于零");
  909. return -1;
  910. }
  911. //最大编号错
  912. if(recNum +recCount-1 >=HqData[jys].recCount)
  913. {
  914. recCount =HqData[jys].recCount -recNum;
  915. recList[0] =recCount;
  916. }
  917. for(i =0; i<recCount; i++)
  918. recList[i+1] =recNum+i;
  919. }
  920. else            
  921. {
  922. memcpy(&recList[1], &lpDest->params[1], sizeof(short)*recCount);
  923. // lpTmp +=sizeof(short)*recCount;
  924. }
  925. sendCount1 =0;
  926. for(i =0; i <=recCount/MAX_HQ_SEND_COUNT; i++)
  927. {
  928. sendCount =MAX_HQ_SEND_COUNT;
  929. recNum =i*MAX_HQ_SEND_COUNT;
  930. if(recNum+sendCount >recCount)
  931. sendCount =recCount-recNum;
  932. for(j =0; j<sendCount; j++)
  933. {
  934. sendNum =recList[1+recNum+j];
  935. if(sendNum <0 || sendNum >=HqData[jys].recCount)
  936. {
  937. ErrMsg(ghWndMain,"来自Send_Hq01:列表参数错");
  938. return -1;
  939. }
  940. //if(!fRefresh)
  941. //{
  942. *(short *)&SendBuff[len] =sendNum;
  943. len+=2;
  944. memcpy(&SendBuff[len], &HqData[jys].lpPreData[sendNum],
  945. sizeof(HQ_PRE_DATA));
  946. len +=sizeof(HQ_PRE_DATA);
  947. memcpy(&SendBuff[len], &HqData[jys].lpRefData[sendNum],
  948. sizeof(HQ_REF_DATA));
  949. len +=sizeof(HQ_REF_DATA);
  950. sendCount1++;
  951. //}
  952. //else
  953. //{
  954. // if(HqData[jys].lpRefData[sendNum].cjss !=*(int *)lpTmp)
  955. // {
  956. // *(short *)&SendBuff[len] =sendNum;
  957. // len+=2;
  958. // memcpy(&SendBuff[len], &HqData[jys].lpRefData[sendNum],
  959. // sizeof(HQ_REF_DATA));
  960. // len +=sizeof(HQ_REF_DATA);
  961. // sendCount1++;
  962. // }
  963. //}
  964. if(sendCount1 >=MAX_HQ_SEND_COUNT)
  965. {
  966. *(short *)&SendBuff[len1] =sendCount1;
  967. *(short *)&SendBuff[strlen(HQ01_HEAD)] =len;
  968. if(UDP_SendBuff("行情01", sd, SendBuff, len, NULL)<0)
  969. {
  970. lpDest->reqType =REQ_HQ10;
  971. return -1;
  972. }
  973. sendCount1 =0;
  974. len =len1+sizeof(short);
  975. }
  976. }
  977. if(sendCount1)
  978. {
  979. *(short *)&SendBuff[len1] =sendCount1;
  980. *(short *)&SendBuff[strlen(HQ01_HEAD)] =len;
  981. if(LOW_UDP_SendBuff("行情01", sd, SendBuff, len, NULL,lpDest)<0)
  982. {
  983. lpDest->reqType =REQ_HQ10;
  984. return -1;
  985. }
  986. }
  987. }
  988. lpDest->reqType =REQ_HQ10;
  989. return j;
  990. }
  991. int Send_Hq01(int sd, LPSTR lpTmp, struct sockaddr *lpdest)
  992. {
  993. char * SendBuff;
  994. short jys, recCount, recNum, sendCount, sendCount1, sendNum;
  995. short recList[MAX_PARA_COUNT+1];
  996. short i, j, len, len1;
  997. BYTE client_version;
  998. BOOL fRefresh, fSel, fFirstTime;
  999. client_version =*lpTmp++;
  1000. if(client_version <SERVER_VERSION)
  1001. {
  1002. SendMsg(sd, "版本错!");
  1003. return 0;
  1004. }
  1005. jys =*lpTmp++;
  1006. fFirstTime =(BOOL)*lpTmp++;
  1007. if(fFirstTime)
  1008. {
  1009. if(UDP_Server_Send_Hq00(sd, jys, lpdest)<0)
  1010. return 0;
  1011. }
  1012. fRefresh =*lpTmp++;
  1013. fSel =*lpTmp++;
  1014. recCount =*(short *)lpTmp;
  1015. if(recCount <=0 || recCount >MAX_PARA_COUNT) 
  1016. return -1;
  1017. lpTmp +=2;
  1018. SendBuff =GlobalAllocPtr(GHND,strlen(HQ01_HEAD)+7+
  1019. (2+sizeof(HQ_PRE_DATA)+sizeof(HQ_REF_DATA))*recCount);
  1020. if(SendBuff ==NULL)
  1021. return -1;
  1022. strcpy(SendBuff, HQ01_HEAD); 
  1023. len =strlen(HQ01_HEAD)+sizeof(short); //2
  1024. SendBuff[len++] =(BYTE)jys; //1
  1025. SendBuff[len++] =(BYTE)fRefresh; //1
  1026. SendBuff[len++] =(BYTE)fSel; //1
  1027. len1 =len;
  1028. *(short *)&SendBuff[len] =0;
  1029. len +=sizeof(short); //2
  1030. memset(recList, 0, sizeof(short)*MAX_PARA_COUNT);
  1031. recList[0] =recCount;
  1032. if(!fSel)
  1033. {
  1034. recNum =*(short *)lpTmp;
  1035. if(recNum >=HqData[jys].recCount)
  1036. {
  1037. ErrMsg(ghWndMain,"来自Send_Hq01:记录编号大于行情总数");
  1038. goto exit_send;
  1039. }
  1040. if(recNum <0)
  1041. {
  1042. ErrMsg(ghWndMain,"来自Send_Hq01:记录编号小于零");
  1043. goto exit_send;
  1044. }
  1045. lpTmp+=2;
  1046. //最大编号错
  1047. if(recNum +recCount-1 >=HqData[jys].recCount)
  1048. {
  1049. recCount =HqData[jys].recCount -recNum;
  1050. recList[0] =recCount;
  1051. }
  1052. for(i =0; i<recCount; i++)
  1053. recList[i+1] =recNum+i;
  1054. }
  1055. else            
  1056. {
  1057. memcpy(&recList[1], lpTmp, sizeof(short)*recCount);
  1058. lpTmp +=sizeof(short)*recCount;
  1059. }
  1060. sendCount1 =0;
  1061. sendCount =recCount;
  1062. recNum =0;
  1063. for(j =0; j<sendCount; j++)
  1064. {
  1065. sendNum =recList[1+j];
  1066. if(sendNum <0 || sendNum >=HqData[jys].recCount)
  1067. {
  1068. ErrMsg(ghWndMain,"来自Send_Hq01:列表参数错");
  1069. goto exit_send;
  1070. }
  1071. if(!fRefresh)
  1072. {
  1073. *(short *)&SendBuff[len] =sendNum;
  1074. len+=2;
  1075. memcpy(&SendBuff[len], &HqData[jys].lpPreData[sendNum],
  1076. sizeof(HQ_PRE_DATA));
  1077. len +=sizeof(HQ_PRE_DATA);
  1078. memcpy(&SendBuff[len], &HqData[jys].lpRefData[sendNum],
  1079. sizeof(HQ_REF_DATA));
  1080. len +=sizeof(HQ_REF_DATA);
  1081. sendCount1++;
  1082. }
  1083. else
  1084. {
  1085. if(HqData[jys].lpRefData[sendNum].cjss !=*(int *)lpTmp)
  1086. {
  1087. *(short *)&SendBuff[len] =sendNum;
  1088. len+=2;
  1089. memcpy(&SendBuff[len], &HqData[jys].lpRefData[sendNum],
  1090. sizeof(HQ_REF_DATA));
  1091. len +=sizeof(HQ_REF_DATA);
  1092. sendCount1++;
  1093. }
  1094. }
  1095. }
  1096. if(sendCount1>0)
  1097. {
  1098. *(short *)&SendBuff[len1] =sendCount1;
  1099. *(short *)&SendBuff[strlen(HQ01_HEAD)] =len;
  1100. if(SendMemData(sd,SendBuff,len)<0)
  1101. goto exit_send;
  1102. }
  1103. CheckDest(sd, lpdest, jys, REQ_HQ10, recList, (short)(recCount+1),client_version);
  1104. if(fFirstTime)
  1105. UDP_Server_Send_Dp(sd, lpdest, TRUE, NULL);
  1106. exit_send:
  1107. GlobalFreePtr(SendBuff);
  1108. return j;
  1109. }
  1110. int Send_Hq10(LPDEST_INFO lpDest)
  1111. {
  1112. char * SendBuff;
  1113. short recFirst =0, recCount =0,sendNum,sendCount1;
  1114. int j, len =0, len1;
  1115. int jys =lpDest->curJys;
  1116. if(lpDest->paramsCount <=1)
  1117. {
  1118. UnlockDest(lpDest);
  1119. return -1;
  1120. }
  1121. if(lpDest->params[0]+lpDest->params[1]-1>=HqData[lpDest->curJys].recCount)
  1122. {
  1123. UnlockDest(lpDest);
  1124. return 0;
  1125. }
  1126. if(lpDest->params[0]==0) 
  1127. {
  1128. UnlockDest(lpDest);
  1129. return 0;
  1130. }
  1131. recCount =lpDest->params[0];
  1132. SendBuff =GlobalAllocPtr(GHND,
  1133. strlen(HQ10_HEAD)+5+(2+sizeof(HQ_REF_DATA))*recCount);
  1134. strcpy(SendBuff, HQ10_HEAD);
  1135. len =strlen(HQ10_HEAD)+sizeof(short); //2
  1136. SendBuff[len++] =(char)lpDest->curJys; //1
  1137. *(short *)&SendBuff[len] =0;
  1138. len1 =len;
  1139. len +=sizeof(short); //2
  1140. sendCount1 =0;
  1141. for(j =0; j<recCount; j++)
  1142. {
  1143. sendNum =lpDest->params[1+j];
  1144. if(HqData[jys].lpRefData[sendNum].cjss
  1145. !=lpDest->lpCjss[j])
  1146. {
  1147. *(short *)&SendBuff[len] =sendNum;
  1148. len+=2; //2
  1149. memcpy(&SendBuff[len], &HqData[jys].lpRefData[sendNum],
  1150. sizeof(HQ_REF_DATA));
  1151. len +=sizeof(HQ_REF_DATA); //sizeof(HQ_REF_DATA)
  1152. lpDest->lpCjss[j] =HqData[jys].lpRefData[sendNum].cjss;
  1153. sendCount1++;
  1154. }
  1155. }
  1156. UnlockDest(lpDest);
  1157. if(sendCount1)
  1158. {
  1159. *(short *)&SendBuff[len1] =sendCount1;
  1160. *(short *)&SendBuff[strlen(HQ10_HEAD)] =len;
  1161. SendMemData(lpDest->sd, SendBuff, len);
  1162. }
  1163. GlobalFreePtr(SendBuff);
  1164. return 0;
  1165. }
  1166. int UDP_Server_Send_Hq10(LPDEST_INFO lpDest)
  1167. {
  1168. BYTE SendBuff[MAX_SEND_BUF_SIZE+1];
  1169. short recFirst =0, recCount =0, recNum, sendNum, sendCount, sendCount1;
  1170. int i, j, len =0, len1;
  1171. int jys =lpDest->curJys;
  1172. memset(&SendBuff[0],0, sizeof(SendBuff));
  1173. if(lpDest->paramsCount <=1) return -1;
  1174. recCount =lpDest->params[0];
  1175. if(lpDest->params[0]+lpDest->params[1]-1>=HqData[lpDest->curJys].recCount)
  1176. return  0;
  1177. strcpy(SendBuff, HQ10_HEAD);
  1178. len =strlen(HQ10_HEAD)+sizeof(short);
  1179. SendBuff[len++] =(char)lpDest->curJys;
  1180. *(short *)&SendBuff[len] =0;
  1181. len1 =len;
  1182. len +=sizeof(short);
  1183. sendCount =MAX_HQ_SEND_COUNT;
  1184. sendCount1 =0;
  1185. if(recCount==0) return 0;
  1186. if(recCount<MAX_HQ_SEND_COUNT)
  1187. {
  1188. for(i=0;i<recCount;i++)
  1189. {
  1190. sendNum=lpDest->params[1+i];
  1191. if(sendNum<0||sendNum>=HqData[lpDest->curJys].recCount)
  1192. {
  1193. ErrMsg(ghWndMain,"来自Send_Hq10:列表参数错");
  1194. return 0;
  1195. }
  1196. if(recCount>MAX_PARA_COUNT)
  1197. {
  1198. ErrMsg(ghWndMain,"来自Send_Hq10:发送记录数错");
  1199. return 0;
  1200. }
  1201. if(HqData[jys].lpRefData[sendNum].cjss
  1202. !=lpDest->lpCjss[i])
  1203. {
  1204. *(short *)&SendBuff[len] =sendNum;
  1205. len+=2;
  1206. memcpy(&SendBuff[len], &HqData[jys].lpRefData[sendNum],
  1207. sizeof(HQ_REF_DATA));
  1208. len +=sizeof(HQ_REF_DATA);
  1209. lpDest->lpCjss[i] =HqData[jys].lpRefData[sendNum].cjss;
  1210. sendCount1++;
  1211. }
  1212. }
  1213. if(sendCount1>0)
  1214. {
  1215. *(short *)&SendBuff[len1] =sendCount1;
  1216. *(short *)&SendBuff[strlen(HQ10_HEAD)] =len;
  1217. if(LOW_UDP_SendBuff("行情10", lpDest->sd, SendBuff, len,NULL,NULL)<0)
  1218. {
  1219. return -1;
  1220. }
  1221. }
  1222. return 0;
  1223. }
  1224. sendCount =MAX_HQ_SEND_COUNT;
  1225. sendCount1 =0;
  1226. for(i =0; i<recCount/MAX_HQ_SEND_COUNT ; i++)
  1227. {
  1228. recNum =i*MAX_HQ_SEND_COUNT;
  1229. if(recNum+sendCount >recCount)
  1230. sendCount =recCount-recNum;
  1231. for(j =0; j<sendCount; j++)
  1232. {
  1233. sendNum =lpDest->params[1+recNum+j];
  1234. if(HqData[jys].lpRefData[sendNum].cjss
  1235. !=lpDest->lpCjss[recNum+j])
  1236. {
  1237. *(short *)&SendBuff[len] =sendNum;
  1238. len+=2;
  1239. memcpy(&SendBuff[len], &HqData[jys].lpRefData[sendNum],
  1240. sizeof(HQ_REF_DATA));
  1241. len +=sizeof(HQ_REF_DATA);
  1242. lpDest->lpCjss[recNum+j] =HqData[jys].lpRefData[sendNum].cjss;
  1243. sendCount1++;
  1244. }
  1245. if(sendCount1 >=MAX_HQ_SEND_COUNT)
  1246. {
  1247. *(short *)&SendBuff[len1] =sendCount1;
  1248. *(short *)&SendBuff[strlen(HQ10_HEAD)] =len;
  1249. if(LOW_UDP_SendBuff("行情10", lpDest->sd, SendBuff, len, NULL, lpDest)<0)
  1250. {
  1251. return -1;
  1252. }
  1253. sendCount1 =0;
  1254. len =len1+sizeof(short);
  1255. }
  1256. }
  1257. if(sendCount1)
  1258. {
  1259. *(short *)&SendBuff[len1] =sendCount1;
  1260. *(short *)&SendBuff[strlen(HQ10_HEAD)] =len;
  1261. if(LOW_UDP_SendBuff("行情10", lpDest->sd, SendBuff, len, NULL, lpDest)<0)
  1262. {
  1263. return -1;
  1264. }
  1265. sendCount1 =0;
  1266. len =len1+sizeof(short);
  1267. break;
  1268. }
  1269. else
  1270. {
  1271. if(recCount<MAX_HQ_SEND_COUNT)
  1272. break;
  1273. }
  1274. }
  1275. return 0;
  1276. }
  1277. int UDP_Server_Send_LitHq(int sd, int jys, short rec_num, int cjss, struct sockaddr *lpdest, BOOL fThrd, LPDEST_INFO lpDestInfo)
  1278. {
  1279. char SendBuff[200];
  1280. int len;
  1281. memset(&SendBuff[0],0, sizeof(SendBuff));
  1282. strcpy(SendBuff, HQ10_HEAD);
  1283. len =strlen(HQ10_HEAD)+sizeof(short);
  1284. SendBuff[len ++] =jys;
  1285. *(short *)&SendBuff[len] =1;
  1286. len +=sizeof(short);
  1287. *(short *)&SendBuff[len] =rec_num;
  1288. len +=sizeof(short);
  1289. memcpy(&SendBuff[len], &HqData[jys].lpRefData[rec_num],
  1290. sizeof(HQ_REF_DATA));
  1291. len +=sizeof(HQ_REF_DATA);
  1292. *(short *)&SendBuff[strlen(HQ10_HEAD)] =len;
  1293. if(UDP_SendBuff("行情成交明细", sd, SendBuff, len, lpDestInfo)<0)
  1294. return -1;
  1295. return 0;
  1296. }
  1297. int UDP_Server_Send_Gra00(int sd, int jys, short gp_rec_num,GRA_HEAD *GraHead)
  1298. {                                                     
  1299. BYTE SendBuff[MAX_SEND_BUF_SIZE+1];
  1300. int len;
  1301. memset(&SendBuff[0],0, sizeof(SendBuff));
  1302. strcpy(SendBuff, GRA00_HEAD);
  1303. len =strlen(GRA00_HEAD)+sizeof(short);
  1304. SendBuff[len++] =(BYTE)jys;
  1305. memcpy(&SendBuff[len] ,GraHead, sizeof(GRA_HEAD));
  1306. len +=sizeof(GRA_HEAD);
  1307. *(short *)&SendBuff[strlen(GRA00_HEAD)] =len;
  1308. return UDP_SendBuff("分时图00", sd, SendBuff, len, NULL);
  1309. }
  1310. typedef struct tag_INIT_TEMP_INFO
  1311. char head[7];
  1312. unsigned short id; //数据对象的名称
  1313. unsigned short total; //数据对象的总长
  1314. unsigned short expand; //解压后的数据长度
  1315. }INIT_TEMP_INFO,MEM_HEAD_INFO;
  1316. int SendMemData(int sd,char *mem,int memlen)
  1317. {
  1318. int j =0, //一次发送的结果
  1319. e,      //SOCKET 错误码
  1320. x=0,    //已发送数据包长
  1321. k,
  1322. complen, //压缩后的包总长
  1323. sended, //已传字节数 
  1324. len,    //从lpBuf分断后的数据长
  1325. tlen;   //发送数据包打包后总长
  1326. char SendBuf[1+sizeof(short)+sizeof(INIT_TEMP_INFO)+MAX_SEND_BUF_SIZE];
  1327. char *lpBuf;
  1328. INIT_TEMP_INFO InitTempInfo;
  1329. static unsigned short id=1;
  1330. lpBuf =GlobalAllocPtr(GHND,memlen);
  1331. if(lpBuf ==NULL) return -1;
  1332. if(memlen>512)
  1333. {
  1334. complen =memlen;
  1335. e=compress(lpBuf,&complen,mem,memlen);
  1336. if(e!=Z_OK)
  1337. {
  1338. memcpy(lpBuf,mem,memlen);
  1339. complen =memlen;
  1340. }
  1341. }
  1342. else
  1343. {
  1344. memcpy(lpBuf,mem,memlen);
  1345. complen =memlen;
  1346. }
  1347. strncpy(InitTempInfo.head,"MOVEMEM",7);
  1348. InitTempInfo.id =id++; if(id>=65534) id=1;
  1349. InitTempInfo.total =complen;
  1350. InitTempInfo.expand =memlen;
  1351. for(sended =0;sended<complen;)
  1352. {
  1353. if(complen-sended>MAX_SEND_BUF_SIZE)
  1354. len =MAX_SEND_BUF_SIZE;
  1355. else
  1356. len =complen-sended;
  1357. memset(SendBuf,0,1+sizeof(short)+sizeof(INIT_TEMP_INFO)+MAX_SEND_BUF_SIZE);
  1358. SendBuf[0]=START_SIGN;
  1359. *(short *)&SendBuf[1]=(short )len+sizeof(INIT_TEMP_INFO);
  1360. memcpy(&SendBuf[1+sizeof(short)],&InitTempInfo,sizeof(INIT_TEMP_INFO));
  1361. memcpy(&SendBuf[1+sizeof(short)+sizeof(INIT_TEMP_INFO)],&lpBuf[sended],len);
  1362. sended +=len;
  1363. tlen = len+1+sizeof(short)+sizeof(INIT_TEMP_INFO);
  1364. for(k=0,x=0;k<400;)
  1365. {
  1366. j =send(sd, &SendBuf[x], tlen -x, 0);
  1367. if (j == SOCKET_ERROR)
  1368. {
  1369. e =WSAGetLastError();
  1370. switch(e)
  1371. {
  1372. case WSANOTINITIALISED : 
  1373. //A successful WSAStartup must occur 
  1374. //before using this function. 
  1375. ErrMsg(ghWndMain,"WSANOTINITIALISED");
  1376. goto exit_send;
  1377. break;
  1378. case WSAENETDOWN :
  1379. //The network subsystem has failed. 
  1380. ErrMsg(ghWndMain,"WSAENETDOWN");
  1381. goto exit_send;
  1382. break;
  1383. case WSAEACCES:
  1384. //The requested address is a broadcast
  1385. //address, but the appropriate flag was not set. 
  1386. ErrMsg(ghWndMain,"WSAEACCES");
  1387. goto exit_send;
  1388. break;
  1389. case WSAEINTR:
  1390. //The (blocking) call was canceled through 
  1391. //WSACancelBlockingCall. 
  1392. goto exit_send;
  1393. break;
  1394. case WSAEINPROGRESS:
  1395. //A blocking Windows Sockets 1.1 call is
  1396. //in progress, or the service provider is still 
  1397. //processing a callback function. 
  1398. ShoutBlockingHook();
  1399. Sleep(10);
  1400. break;
  1401. case WSAEFAULT:
  1402. //The buf parameter is not totally contained in
  1403. //a valid part of the user address space.
  1404. goto exit_send;
  1405. break;
  1406. case WSAENETRESET:
  1407. //The connection has been broken due to the 
  1408. //remote host resetting. 
  1409. HqDestStopBySd(sd);
  1410. goto exit_send;
  1411. break;
  1412. case WSAENOBUFS:
  1413. //No buffer space is available. 
  1414. goto exit_send;
  1415. break;
  1416. case WSAENOTCONN:
  1417. //The socket is not connected.
  1418. HqDestStopBySd(sd);
  1419. goto exit_send;
  1420. break;
  1421. case WSAENOTSOCK:
  1422. //The descriptor is not a socket. 
  1423. goto exit_send;
  1424. break;
  1425. case WSAEOPNOTSUPP:
  1426. //MSG_OOB was specified, but the socket
  1427. //is not stream style such as type SOCK_STREAM, out-of-band data is not supported in the communication domain associated with this socket, or the socket is unidirectional and supports only receive operations. 
  1428. goto exit_send;
  1429. break;
  1430. case WSAESHUTDOWN:
  1431. //The socket has been shut down; it is not 
  1432. //possible to send on a socket after 
  1433. //shutdown has been invoked with how set 
  1434. //to SD_SEND or SD_BOTH. 
  1435. goto exit_send;
  1436. break;
  1437. case WSAEWOULDBLOCK:
  1438. //The socket is marked as nonblocking and 
  1439. //the requested operation would block. 
  1440. ShoutBlockingHook();
  1441. Sleep(10);
  1442. break;
  1443. case WSAEMSGSIZE:
  1444. //The socket is message oriented, and the 
  1445. //message is larger than the 
  1446. //maximum supported by the underlying transport. 
  1447. goto exit_send;
  1448. break;
  1449. case WSAEHOSTUNREACH:
  1450. //The remote host cannot be reached from this 
  1451. //host at this time. 
  1452. goto exit_send;
  1453. break;
  1454. case WSAEINVAL:
  1455. //The socket has not been bound with bind, or 
  1456. //an unknown flag was specified,
  1457. goto exit_send;
  1458. break;
  1459. case WSAECONNABORTED:
  1460. //The virtual circuit was terminated due to a 
  1461. //time-out or other failure. The application 
  1462. //should close the socket as it is no longer usable. 
  1463. HqDestStopBySd(sd);
  1464. goto exit_send;
  1465. break;
  1466. case WSAECONNRESET:
  1467. //The virtual circuit was reset by the remote 
  1468. //side executing a "hard" or "abortive" close. For 
  1469. //UPD sockets, the remote host was unable to deliver
  1470. //a previously sent UDP datagram and responded with 
  1471. //a "Port Unreachable" ICMP packet. The application 
  1472. //should close the socket as it is no longer usable. 
  1473. HqDestStopBySd(sd);
  1474. goto exit_send;
  1475. break;
  1476. case WSAETIMEDOUT:
  1477. //The connection has been dropped, because of a network
  1478. //failure or because the system on the other end went down 
  1479. //without notice. 
  1480. HqDestStopBySd(sd);
  1481. goto exit_send;
  1482. break;
  1483. default:
  1484. goto exit_send;
  1485. }
  1486. }
  1487. else
  1488. {
  1489. if(x+j !=tlen)
  1490. {
  1491. ShoutBlockingHook();
  1492. x+=j;
  1493. }
  1494. else
  1495. break;
  1496. }
  1497. }
  1498. }
  1499. exit_send:
  1500. GlobalFreePtr(lpBuf);
  1501. return sended;
  1502. }
  1503. int Send_Gra01(int sd, LPSTR lpTmp,struct sockaddr *lpdest)
  1504. {
  1505. int jys,len;
  1506. char fileName[128];
  1507. HANDLE hd;
  1508. char *lpGraData =NULL;
  1509. HFILE hFile;
  1510. OFSTRUCT os;
  1511. short recList[5];
  1512. short gp_rec_num, gra_rec_count, gra_rec_end;
  1513. short dateNum;
  1514.     GRA_HEAD tmpHead;
  1515. jys =*lpTmp++;
  1516. if(jys > 1) return -1;
  1517. dateNum =*lpTmp++;
  1518. gp_rec_num =*(short *)lpTmp;
  1519. if(gp_rec_num >=HqData[jys].recCount)
  1520. {
  1521. ErrMsg(ghWndMain,"来自Send_Gra01:记录尾大于记录几数");
  1522. return -1;
  1523. }
  1524. lpTmp +=sizeof(short);
  1525. gra_rec_end =*(short *)lpTmp;
  1526. lpTmp +=sizeof(short);
  1527. wsprintf(fileName, "%s\%s.dat", GraphData[jys].szGraPath,
  1528. HqData[jys].lpPreData[gp_rec_num].zqdm);
  1529. hFile =OpenFile(fileName, &os, OF_SHARE_DENY_NONE|OF_READ);
  1530. if(hFile ==HFILE_ERROR) return -1;
  1531. if(_lread(hFile, &tmpHead, sizeof(GRA_HEAD))
  1532. !=sizeof(GRA_HEAD))
  1533. {
  1534. _lclose(hFile);
  1535. return -1;
  1536. }
  1537. if(IsZsRec(jys, gp_rec_num))
  1538. {
  1539. UDP_Server_Send_MaxMin10(sd, jys, 0, NULL, TRUE, NULL);
  1540. UDP_Server_Send_MaxMin10(sd, jys, 1, NULL, TRUE, NULL);
  1541. }
  1542. else
  1543. {
  1544. UDP_Server_Send_Mmp(sd, jys, gp_rec_num, lpdest, TRUE, NULL);
  1545. if(gra_rec_end <tmpHead.recCount)
  1546. UDP_Server_Send_LitHq(sd, jys, gp_rec_num, 0, lpdest, TRUE, NULL);
  1547. }
  1548. if(gra_rec_end ==tmpHead.recCount)
  1549. {
  1550. _lclose(hFile);
  1551. goto check_dest;
  1552. }
  1553. if(gra_rec_end >tmpHead.recCount)
  1554. gra_rec_end =0;
  1555. UDP_Server_Send_Gra00(sd, jys, gp_rec_num, &tmpHead);
  1556. if(_llseek(hFile, sizeof(GRA_HEAD)+gra_rec_end*sizeof(GRA_DATA), FILE_BEGIN)
  1557. ==HFILE_ERROR)
  1558. {
  1559. _lclose(hFile);
  1560. return -1;
  1561. }
  1562. gra_rec_count =tmpHead.recCount-gra_rec_end;
  1563. hd =GlobalAlloc(GHND,strlen(GRA01_HEAD)+9+(int)sizeof(GRA_DATA)*gra_rec_count);
  1564. if(hd ==NULL)
  1565. {
  1566. ErrMsg(ghWndMain,"来自Send_Gra01:分配内存失败");
  1567. _lclose(hFile);
  1568. return(-1);
  1569. }
  1570. lpGraData=GlobalLock(hd);
  1571. if(lpGraData ==NULL)
  1572. {
  1573. ErrMsg(ghWndMain, "来自Send_Gra01:锁定内存失败");
  1574. _lclose(hFile);
  1575. return -1;
  1576. }
  1577. strcpy(lpGraData, GRA01_HEAD); 
  1578. len =strlen(GRA01_HEAD)+sizeof(short); //2
  1579. lpGraData[len++] =(char)jys; //1
  1580. *((short *)&lpGraData[len]) =gp_rec_num; //2
  1581. len +=sizeof(short);
  1582. *((short *)&lpGraData[len]) =gra_rec_count; //2
  1583. len +=sizeof(short);
  1584. *((short *)&lpGraData[len]) =0; //2
  1585. len +=sizeof(short);
  1586. if(_lread(hFile, &lpGraData[len], sizeof(GRA_DATA)*gra_rec_count)
  1587. !=gra_rec_count*sizeof(GRA_DATA))
  1588. {
  1589. GlobalUnlock(hd);
  1590. GlobalFree(hd);
  1591. _lclose(hFile);
  1592. return -1;
  1593. }
  1594. _lclose(hFile);
  1595. len +=gra_rec_count*sizeof(GRA_DATA);
  1596. *(short *)&lpGraData[strlen(GRA01_HEAD)] =len;
  1597. SendMemData(sd, lpGraData, len);
  1598. GlobalUnlock(GlobalHandle(lpGraData));
  1599. GlobalFree(GlobalHandle(lpGraData));
  1600. check_dest:
  1601. recList[0] =gp_rec_num;
  1602. recList[1] =gra_rec_end+gra_rec_count;
  1603. CheckDest(sd, lpdest, jys, REQ_GRA10, &recList[0], 2, 0);
  1604. return 0;
  1605. }
  1606. int UDP_Server_Send_Gra01(int sd, LPSTR lpTmp, struct sockaddr *lpdest)
  1607. {
  1608. BYTE SendBuff[MAX_SEND_BUF_SIZE+1];
  1609. int jys, i, len;
  1610. char fileName[128];
  1611. HANDLE hd;
  1612. LPGRA_DATA lpGraData =NULL;
  1613. HFILE hFile;
  1614. OFSTRUCT os;
  1615. short recList[5];
  1616. short gp_rec_num, gra_rec_count, gra_rec_end, sendCount, sendNum;
  1617. short dateNum;
  1618.     GRA_HEAD tmpHead;
  1619. memset(&SendBuff[0],0, sizeof(SendBuff));
  1620. jys =*lpTmp++;
  1621. if(jys > 1) return -1;
  1622. dateNum =*lpTmp++;
  1623. gp_rec_num =*(short *)lpTmp;
  1624. if(gp_rec_num >=HqData[jys].recCount)
  1625. {
  1626. ErrMsg(ghWndMain,"来自Send_Gra01:记录尾大于记录几数");
  1627. return -1;
  1628. }
  1629. lpTmp +=sizeof(short);
  1630. gra_rec_end =*(short *)lpTmp;
  1631. lpTmp +=sizeof(short);
  1632. wsprintf(fileName, "%s\%s.dat", GraphData[jys].szGraPath,
  1633. HqData[jys].lpPreData[gp_rec_num].zqdm);
  1634. hFile =OpenFile(fileName, &os, OF_SHARE_DENY_NONE|OF_READ);
  1635. if(hFile ==HFILE_ERROR) return -1;
  1636. if(_lread(hFile, &tmpHead, sizeof(GRA_HEAD))
  1637. !=sizeof(GRA_HEAD))
  1638. {
  1639. _lclose(hFile);
  1640. return -1;
  1641. }
  1642. if(IsZsRec(jys, gp_rec_num))
  1643. {
  1644. UDP_Server_Send_MaxMin10(sd, jys, 0, lpdest, TRUE, NULL);
  1645. UDP_Server_Send_MaxMin10(sd, jys, 1, lpdest, TRUE, NULL);
  1646. }
  1647. else
  1648. {
  1649. UDP_Server_Send_Mmp(sd, jys, gp_rec_num, lpdest, TRUE, NULL);
  1650. if(gra_rec_end <tmpHead.recCount)
  1651. UDP_Server_Send_LitHq(sd, jys, gp_rec_num, 0, lpdest, TRUE, NULL);
  1652. }
  1653. if(gra_rec_end ==tmpHead.recCount)
  1654. {
  1655. _lclose(hFile);
  1656. goto check_dest;
  1657. }
  1658. if(gra_rec_end >tmpHead.recCount)
  1659. gra_rec_end =0;
  1660. UDP_Server_Send_Gra00(sd, jys, gp_rec_num, &tmpHead);
  1661. if(_llseek(hFile, sizeof(GRA_HEAD)+gra_rec_end*sizeof(GRA_DATA), FILE_BEGIN)
  1662. ==HFILE_ERROR)
  1663. {
  1664. ErrMsg(ghWndMain, "来自Send_Gra01:定位数据文件错");
  1665. ErrMsg(ghWndMain, fileName);
  1666. _lclose(hFile);
  1667. return -1;
  1668. }
  1669. gra_rec_count =tmpHead.recCount-gra_rec_end;
  1670. hd =GlobalAlloc(GHND,(int)sizeof(GRA_DATA)*gra_rec_count);
  1671. if(hd ==NULL)
  1672. {
  1673. ErrMsg(ghWndMain,"来自Send_Gra01:分配内存失败");
  1674. _lclose(hFile);
  1675. return(-1);
  1676. }
  1677. lpGraData=GlobalLock(hd);
  1678. if(lpGraData ==NULL)
  1679. {
  1680. ErrMsg(ghWndMain, "来自Send_Gra01:锁定内存失败");
  1681. _lclose(hFile);
  1682. return -1;
  1683. }
  1684. if(_lread(hFile, lpGraData, sizeof(GRA_DATA)*gra_rec_count)
  1685. !=gra_rec_count*sizeof(GRA_DATA))
  1686. {
  1687. ErrMsg(ghWndMain, "来自Send_Gra01:读数据文件错1");
  1688. ErrMsg(ghWndMain, fileName);
  1689. GlobalUnlock(hd);
  1690. GlobalFree(hd);
  1691. _lclose(hFile);
  1692. return -1;
  1693. }
  1694. _lclose(hFile);
  1695. sendCount =MAX_GRA_SEND_COUNT;
  1696. for(i =0; i<=gra_rec_count/MAX_GRA_SEND_COUNT; i++)
  1697. {
  1698. sendNum =i*MAX_GRA_SEND_COUNT;
  1699. if(sendCount+sendNum >gra_rec_count)
  1700. sendCount =gra_rec_count-sendNum;
  1701. strcpy(SendBuff, GRA01_HEAD); 
  1702. len =strlen(GRA01_HEAD)+sizeof(short);
  1703. SendBuff[len++] =(char)jys;
  1704. *((short *)&SendBuff[len]) =gp_rec_num;
  1705. len +=sizeof(short);
  1706. *((short *)&SendBuff[len]) =sendCount;
  1707. len +=sizeof(short);
  1708. *((short *)&SendBuff[len]) =sendNum;
  1709. len +=sizeof(short);
  1710. memcpy(&SendBuff[len], &lpGraData[sendNum], sendCount*sizeof(GRA_DATA));
  1711. len +=sendCount*sizeof(GRA_DATA);
  1712. if(sendCount)
  1713. {
  1714. *(short *)&SendBuff[strlen(GRA01_HEAD)] =len;
  1715. if(UDP_SendBuff("分时图01", sd, SendBuff, len, NULL)<0)
  1716. {
  1717. GlobalUnlock(GlobalHandle(lpGraData));
  1718. GlobalFree(GlobalHandle(lpGraData));
  1719. return -1;
  1720. }
  1721. }
  1722. }
  1723. GlobalUnlock(GlobalHandle(lpGraData));
  1724. GlobalFree(GlobalHandle(lpGraData));
  1725. check_dest:
  1726. recList[0] =gp_rec_num;
  1727. recList[1] =gra_rec_end+gra_rec_count;
  1728. CheckDest(sd, lpdest, jys, REQ_GRA10, &recList[0], 2, 0);
  1729. return 0;
  1730. }
  1731. int Send_Gra10(LPDEST_INFO lpDest)
  1732. {
  1733. char * SendBuff =NULL;
  1734. int jys,len;
  1735. char fileName[128];
  1736. HFILE hFile;
  1737. OFSTRUCT os;
  1738. short gp_rec_num, gra_rec_count, gra_rec_end;
  1739. short j;
  1740.     GRA_HEAD tmpHead;
  1741. BOOL sdMax1 =FALSE,sdMax2 =FALSE,sdMmp=FALSE,
  1742.  sdLit=FALSE;
  1743. jys =lpDest->curJys;
  1744. if(lpDest->paramsCount<2)
  1745. {
  1746. UnlockDest(lpDest);
  1747. return -1;
  1748. }
  1749. gp_rec_num =lpDest->graNo; //lpDest->params[0];
  1750. if(gp_rec_num>=HqData[jys].recCount||
  1751. gp_rec_num<0)
  1752. {
  1753. UnlockDest(lpDest);
  1754. return 0;
  1755. }
  1756. gra_rec_end =lpDest->graEnd; //lpDest->params[1];
  1757. if(gra_rec_end<0)
  1758. {
  1759. UnlockDest(lpDest);
  1760. return 0;
  1761. }
  1762. if(IsZsRec(jys, gp_rec_num))
  1763. {
  1764. if(memcmp(&lpDest->lpZsGraph->Maxmin[0], &MaxMinData[lpDest->curJys][0],
  1765. sizeof(MAXMIN_DATA)))
  1766. {
  1767. memcpy(&lpDest->lpZsGraph->Maxmin[0], &MaxMinData[lpDest->curJys][0],
  1768. sizeof(MAXMIN_DATA));
  1769. sdMax1 =TRUE;
  1770. }
  1771. if(memcmp(&lpDest->lpZsGraph->Maxmin[1], &MaxMinData[lpDest->curJys][1],
  1772. sizeof(MAXMIN_DATA)))
  1773. {
  1774. memcpy(&lpDest->lpZsGraph->Maxmin[1], &MaxMinData[lpDest->curJys][1],
  1775. sizeof(MAXMIN_DATA));
  1776. sdMax2 =TRUE;
  1777. }
  1778. }
  1779. else
  1780. {
  1781. if(memcmp(&lpDest->lpGraph->mmp, &MmpData[lpDest->curJys].lpMmp[gp_rec_num],
  1782. sizeof(MMP)))
  1783. {
  1784. memcpy(&lpDest->lpGraph->mmp, &MmpData[lpDest->curJys].lpMmp[gp_rec_num],
  1785. sizeof(MMP));
  1786. sdMmp =TRUE;
  1787. }
  1788. }
  1789. if(lpDest->cjss !=HqData[lpDest->curJys].lpRefData[gp_rec_num].cjss)
  1790. {
  1791. lpDest->cjss =HqData[lpDest->curJys].lpRefData[gp_rec_num].cjss;
  1792. sdLit =TRUE;
  1793. }
  1794. wsprintf(fileName, "%s\%s.dat", GraphData[jys].szGraPath,
  1795. HqData[jys].lpPreData[gp_rec_num].zqdm);
  1796. hFile =OpenFile(fileName, &os, OF_SHARE_DENY_NONE|OF_READ);
  1797. if(hFile ==HFILE_ERROR)
  1798. {
  1799. UnlockDest(lpDest);
  1800. return 0;
  1801.     }
  1802. if(_lread(hFile,&tmpHead, sizeof(GRA_HEAD))
  1803. !=sizeof(GRA_HEAD))
  1804. {
  1805. UnlockDest(lpDest);
  1806. _lclose(hFile);
  1807. return 0;
  1808. }
  1809.     j=tmpHead.recCount;
  1810. gra_rec_count =j-gra_rec_end;
  1811.     if(gra_rec_count<=0)
  1812. {
  1813. UnlockDest(lpDest);
  1814. _lclose(hFile);
  1815. return 0;
  1816. }
  1817. if(_llseek(hFile, sizeof(GRA_HEAD)+gra_rec_end*sizeof(GRA_DATA), FILE_BEGIN)
  1818. ==HFILE_ERROR)
  1819. {
  1820. UnlockDest(lpDest);
  1821. _lclose(hFile);
  1822. return 0;
  1823. }
  1824. SendBuff =GlobalAllocPtr(GHND,
  1825. strlen(GRA10_HEAD)+9+sizeof(GRA_DATA)*gra_rec_count);
  1826. if(SendBuff ==NULL)
  1827. {
  1828. UnlockDest(lpDest);
  1829. _lclose(hFile);
  1830. return 0;
  1831. }
  1832. strcpy(SendBuff,GRA10_HEAD);
  1833. len =strlen(GRA01_HEAD)+sizeof(short); //2
  1834. SendBuff[len++] =(char)jys; //1
  1835. *((short *)&SendBuff[len]) =gp_rec_num;
  1836. len +=sizeof(short); //2
  1837. *((short *)&SendBuff[len]) =gra_rec_count;
  1838. len +=sizeof(short); //2
  1839. *((short *)&SendBuff[len]) =gra_rec_end;
  1840. len +=sizeof(short); //2
  1841. if(_lread(hFile,&SendBuff[len], sizeof(GRA_DATA)*gra_rec_count)
  1842. ==sizeof(GRA_DATA)*gra_rec_count)
  1843. {
  1844. len +=gra_rec_count*sizeof(GRA_DATA);
  1845. _lclose(hFile);
  1846. *(short *)&SendBuff[strlen(GRA10_HEAD)] =len;
  1847. if(SendMemData(lpDest->sd, SendBuff, len)>0)
  1848. {
  1849. //lpDest->params[1] +=gra_rec_count;
  1850. lpDest->graEnd +=gra_rec_count;
  1851. }
  1852. }
  1853. UnlockDest(lpDest);
  1854. _lclose(hFile);
  1855. GlobalFreePtr(SendBuff);
  1856. if(sdMax1)
  1857. UDP_Server_Send_MaxMin10(lpDest->sd, jys, 0, NULL, FALSE, lpDest);
  1858. if(sdMax2)
  1859. UDP_Server_Send_MaxMin10(lpDest->sd, jys, 1, NULL, FALSE, lpDest);
  1860. if(sdMmp)
  1861. UDP_Server_Send_Mmp(lpDest->sd, jys, gp_rec_num, NULL, FALSE, lpDest);
  1862. if(sdLit)
  1863. UDP_Server_Send_LitHq(lpDest->sd, jys, gp_rec_num, 0, NULL, FALSE, lpDest);
  1864. return 0;
  1865. }
  1866. int UDP_Server_Send_Gra10(LPDEST_INFO lpDest)
  1867. {
  1868. BYTE SendBuff[MAX_SEND_BUF_SIZE+1];
  1869. int jys, i, len;
  1870. char fileName[128];
  1871. LPGRA_DATA lpGraData =NULL;
  1872. HFILE hFile;
  1873. OFSTRUCT os;
  1874. short gp_rec_num, gra_rec_count, gra_rec_end, sendCount, sendNum;
  1875. short j;
  1876.     GRA_HEAD tmpHead;
  1877. HANDLE hd;
  1878. memset(&SendBuff[0],0, sizeof(SendBuff));
  1879. jys =lpDest->curJys;
  1880. if(lpDest->paramsCount<2)
  1881. {
  1882. ErrMsg(ghWndMain,"来自Send_Gra10:参数个数错");
  1883. return -1;
  1884. }
  1885. gp_rec_num =lpDest->graNo; //params[0];
  1886. if(gp_rec_num>=HqData[jys].recCount||
  1887. gp_rec_num<0)
  1888. {
  1889. return 0;
  1890. }
  1891. gra_rec_end =lpDest->graEnd; //params[1];
  1892. if(gra_rec_end<0)
  1893. return 0;
  1894. if(IsZsRec(jys, gp_rec_num))
  1895. {
  1896. if(memcmp(&lpDest->lpZsGraph->Maxmin[0], &MaxMinData[lpDest->curJys][0],
  1897. sizeof(MAXMIN_DATA)))
  1898. {
  1899. memcpy(&lpDest->lpZsGraph->Maxmin[0], &MaxMinData[lpDest->curJys][0],
  1900. sizeof(MAXMIN_DATA));
  1901. if(UDP_Server_Send_MaxMin10(lpDest->sd, jys, 0, NULL, FALSE, lpDest) <0)
  1902. {
  1903. ErrMsg(ghWndMain,"来自Send_Gra10:送MaxMin错");
  1904. return -1;
  1905. }
  1906. }
  1907. if(memcmp(&lpDest->lpZsGraph->Maxmin[1], &MaxMinData[lpDest->curJys][1],
  1908. sizeof(MAXMIN_DATA)))
  1909. {
  1910. memcpy(&lpDest->lpZsGraph->Maxmin[1], &MaxMinData[lpDest->curJys][1],
  1911. sizeof(MAXMIN_DATA));
  1912. if(UDP_Server_Send_MaxMin10(lpDest->sd, jys, 1, NULL, FALSE, lpDest) <0)
  1913. {
  1914. ErrMsg(ghWndMain,"来自Send_Gra10:送MaxMin错1");
  1915. return -1;
  1916. }
  1917. }
  1918. }
  1919. else
  1920. {
  1921. if(memcmp(&lpDest->lpGraph->mmp, &MmpData[lpDest->curJys].lpMmp[gp_rec_num],
  1922. sizeof(MMP)))
  1923. {
  1924. memcpy(&lpDest->lpGraph->mmp, &MmpData[lpDest->curJys].lpMmp[gp_rec_num],
  1925. sizeof(MMP));
  1926. if(UDP_Server_Send_Mmp(lpDest->sd, jys, gp_rec_num, NULL, FALSE, lpDest) <0)
  1927. {
  1928. ErrMsg(ghWndMain,"来自Send_Gra10:送Mmp错");
  1929. return -1;
  1930. }
  1931. }
  1932. }
  1933. if(lpDest->cjss !=HqData[lpDest->curJys].lpRefData[gp_rec_num].cjss)
  1934. {
  1935. lpDest->cjss =HqData[lpDest->curJys].lpRefData[gp_rec_num].cjss;
  1936. if(UDP_Server_Send_LitHq(lpDest->sd, jys, gp_rec_num, 0, NULL, FALSE, lpDest) <0)
  1937. {
  1938. ErrMsg(ghWndMain,"来自Send_Gra10:送LitHq错");
  1939. return -1;
  1940. }
  1941. }
  1942. wsprintf(fileName, "%s\%s.dat", GraphData[jys].szGraPath,
  1943. HqData[jys].lpPreData[gp_rec_num].zqdm);
  1944. hFile =OpenFile(fileName, &os, OF_SHARE_DENY_NONE|OF_READ);
  1945. if(hFile ==HFILE_ERROR)
  1946. return 0;
  1947.     
  1948. if(_lread(hFile,&tmpHead, sizeof(GRA_HEAD))
  1949. !=sizeof(GRA_HEAD))
  1950. {
  1951. ErrMsg(ghWndMain,"来自Send_Gra10:读数据文件错");
  1952. ErrMsg(ghWndMain, fileName);
  1953. _lclose(hFile);
  1954. return 0;
  1955. }
  1956.     j=tmpHead.recCount;
  1957. if(gra_rec_end >=j)
  1958. {
  1959. _lclose(hFile);
  1960. return 0;
  1961. }
  1962. gra_rec_count =j-gra_rec_end;
  1963.     
  1964. if(gra_rec_count<=0)
  1965. {
  1966. _lclose(hFile);
  1967. return 0;
  1968. }
  1969. if(_llseek(hFile, sizeof(GRA_HEAD)+gra_rec_end*sizeof(GRA_DATA), FILE_BEGIN)
  1970. ==HFILE_ERROR)
  1971. {
  1972. //ErrMsg(ghWndMain,"来自Send_Gra10:定位数据文件错");
  1973. //ErrMsg(ghWndMain, fileName);
  1974. _lclose(hFile);
  1975. return 0;
  1976. }
  1977. hd =GlobalAlloc(GHND,(int)sizeof(GRA_DATA)*gra_rec_count);
  1978. if(hd ==NULL)
  1979. {
  1980. ErrMsg(ghWndMain,"来自Send_Gra10:分配内存失败");
  1981. _lclose(hFile);
  1982. return 0;
  1983. }
  1984. lpGraData =GlobalLock(hd);
  1985. if(lpGraData ==NULL)
  1986. {
  1987. ErrMsg(ghWndMain,"来自Send_Gra10:锁定内存失败");
  1988. _lclose(hFile);
  1989. return 0;
  1990. }
  1991. if(_lread(hFile, lpGraData, sizeof(GRA_DATA)*gra_rec_count)
  1992. !=sizeof(GRA_DATA)*gra_rec_count)
  1993. {
  1994. ErrMsg(ghWndMain,"来自Send_Gra10:读数据文件错1");
  1995. GlobalUnlock(hd);
  1996. GlobalFree(hd);
  1997. _lclose(hFile);
  1998. return 0;
  1999. }
  2000. _lclose(hFile);
  2001. if(gra_rec_count<MAX_GRA_SEND_COUNT)
  2002. {
  2003. strcpy(SendBuff,GRA10_HEAD);
  2004. len =strlen(GRA01_HEAD)+sizeof(short);
  2005. SendBuff[len++] =(char)jys;
  2006. *((short *)&SendBuff[len]) =gp_rec_num;
  2007. len +=sizeof(short);
  2008. *((short *)&SendBuff[len]) =gra_rec_count;
  2009. len +=sizeof(short);
  2010. *((short *)&SendBuff[len]) =gra_rec_end;
  2011. len +=sizeof(short);
  2012. memcpy(&SendBuff[len], &lpGraData[0], gra_rec_count*sizeof(GRA_DATA));
  2013. len +=gra_rec_count*sizeof(GRA_DATA);
  2014. if(LOW_UDP_SendBuff("分时图10", lpDest->sd, SendBuff, len,NULL,lpDest)<0)
  2015. {
  2016. if(lpGraData!=NULL) 
  2017. {
  2018. GlobalUnlock(hd);
  2019. GlobalFree(hd);
  2020. }
  2021. return -1;
  2022. }
  2023. else
  2024. {
  2025. if(lpGraData!=NULL)
  2026. {
  2027. GlobalUnlock(hd);
  2028. GlobalFree(hd);
  2029. }
  2030. //lpDest->params[1] +=gra_rec_count;
  2031.   lpDest->graEnd+=gra_rec_count;
  2032. return 0;
  2033. }
  2034. }
  2035. sendCount =MAX_GRA_SEND_COUNT;
  2036. for(i =0; i<gra_rec_count/MAX_GRA_SEND_COUNT; i++)
  2037. {
  2038. sendNum =i*MAX_GRA_SEND_COUNT;
  2039. if(sendCount+sendNum >gra_rec_count)
  2040. sendCount =gra_rec_count-sendNum;
  2041. strcpy(SendBuff, GRA10_HEAD); 
  2042. len =strlen(GRA01_HEAD)+sizeof(short);
  2043. SendBuff[len++] =(char)jys;
  2044. *((short *)&SendBuff[len]) =gp_rec_num;
  2045. len +=sizeof(short);
  2046. *((short *)&SendBuff[len]) =sendCount;
  2047. len +=sizeof(short);
  2048. *((short *)&SendBuff[len]) =sendNum+gra_rec_end;
  2049. len +=sizeof(short);
  2050. memcpy(&SendBuff[len], &lpGraData[sendNum], sendCount*sizeof(GRA_DATA));
  2051. len +=sendCount*sizeof(GRA_DATA);
  2052. if(sendCount)
  2053. {
  2054. *(short *)&SendBuff[strlen(GRA10_HEAD)] =len;
  2055. if(LOW_UDP_SendBuff("分时图10", lpDest->sd, SendBuff, len, NULL,lpDest)<0)
  2056. {
  2057. if(lpGraData!=NULL) 
  2058. {
  2059. GlobalUnlock(hd);
  2060. GlobalFree(hd);
  2061. }
  2062. return -1;
  2063. }
  2064. }
  2065. }
  2066. if(lpGraData!=NULL)
  2067. {
  2068. GlobalUnlock(hd);
  2069. GlobalFree(hd);
  2070. }
  2071. //lpDest->params[1] +=gra_rec_count;
  2072. lpDest->graEnd+=gra_rec_count;
  2073. return 0;
  2074. }
  2075. int UDP_Server_Send_Dp(int sd, struct sockaddr *lpdest, BOOL fThrd, LPDEST_INFO lpDest)
  2076. {
  2077. BYTE SendBuff[MAX_SEND_BUF_SIZE+1];
  2078. int len;
  2079. memset(&SendBuff[0],0, sizeof(SendBuff));
  2080. strcpy(SendBuff, DP_HEAD);
  2081. len =strlen(DP_HEAD)+sizeof(short);
  2082. memcpy(&SendBuff[len], &DpData, sizeof(DpData));
  2083. len +=sizeof(DpData);
  2084. *(short *)&SendBuff[strlen(DP_HEAD)] =len;
  2085. return UDP_SendBuff("大盘数据", sd, SendBuff, len,lpDest);
  2086. }
  2087. int UDP_Server_Send_Mmp(int sd, int jys, short rec_num,
  2088. struct sockaddr *lpdest, BOOL fThrd, LPDEST_INFO lpDestInfo)
  2089. {
  2090. BYTE SendBuff[MAX_SEND_BUF_SIZE+1];
  2091. int len;
  2092. memset(&SendBuff[0],0, sizeof(SendBuff));
  2093. strcpy(SendBuff, MMP_HEAD); 
  2094. len =strlen(MMP_HEAD)+sizeof(short);
  2095. SendBuff[len++] =jys;
  2096. *((short *)&SendBuff[len]) =rec_num;
  2097. len +=sizeof(short);
  2098. memcpy(&SendBuff[len], &MmpData[jys].lpMmp[rec_num],
  2099. sizeof(MMP));
  2100. len +=sizeof(MMP);
  2101. *(short *)&SendBuff[strlen(MMP_HEAD)] =len;
  2102. return UDP_SendBuff("买卖盘数据", sd, SendBuff, len,lpDestInfo);
  2103. }
  2104. int UDP_Server_Send_MaxMin10(int sd, int jys, int maxmin,
  2105.  struct sockaddr *lpdest, BOOL fThrd, LPDEST_INFO lpDestInfo)
  2106. {
  2107. BYTE SendBuff[MAX_SEND_BUF_SIZE+1];
  2108. int len;
  2109. if(jys > 1 || maxmin >1) return -1;
  2110. memset(&SendBuff[0],0, sizeof(SendBuff));
  2111. MaxMinFillData(jys, maxmin);
  2112. strcpy(SendBuff, MAXMIN10_HEAD); 
  2113. len =strlen(MAXMIN10_HEAD)+sizeof(short);
  2114. SendBuff[len++] =jys;
  2115. SendBuff[len] =maxmin; 
  2116. len++;
  2117. memcpy(&SendBuff[len], &MaxMinData[jys][maxmin], sizeof(MAXMIN_DATA));
  2118. len +=sizeof(MAXMIN_DATA);
  2119. *(short *)&SendBuff[strlen(MAXMIN10_HEAD)] =len;
  2120. return UDP_SendBuff("排行榜", sd, SendBuff, len, lpDestInfo);
  2121. }
  2122. int UDP_Server_Send_GetZqmc(int sd, LPSTR lpTmp, struct sockaddr *lpdest)
  2123. {
  2124. int jys, len, i, recCount, recNum;
  2125. char SendBuff[2048];
  2126. memset(&SendBuff[0],0, sizeof(SendBuff));
  2127. jys =*lpTmp++;
  2128. recCount =*(short *)lpTmp;
  2129. lpTmp +=sizeof(short);
  2130. strcpy(SendBuff, GETZQMC_HEAD);
  2131. len =strlen(GETZQMC_HEAD)+sizeof(short);
  2132. SendBuff[len++] =jys;
  2133. *(short *)&SendBuff[len] =0;
  2134. len +=sizeof(short);
  2135. for(i =0; i<recCount; i++)
  2136. {
  2137. recNum =*(short *)lpTmp;
  2138. lpTmp +=sizeof(short);
  2139. if(recNum >=HqData[jys].recCount) 
  2140. break;
  2141. *(short *)&SendBuff[len] =recNum;
  2142. len +=sizeof(short);
  2143. memcpy(&SendBuff[len], HqData[jys].lpPreData[recNum].zqmc, MAX_ZQMC_SIZE);
  2144. len +=MAX_ZQMC_SIZE;
  2145. }
  2146. *(short *)&SendBuff[strlen(GETZQMC_HEAD)+sizeof(short)+1] =i;
  2147. *(short *)&SendBuff[strlen(GETZQMC_HEAD)] =len;
  2148. if(UDP_SendBuff("股票名称", sd, SendBuff, len, NULL)<0)
  2149. return -1;
  2150. return 0;
  2151. }
  2152. int UDP_Server_Send_Zx(int sd, LPSTR lpTmp, struct sockaddr *lpdest)
  2153. {
  2154. BYTE SendBuff[MAX_SEND_BUF_SIZE+1];
  2155. int len, file_len, read_len, read_total, start_pos;
  2156. //if(FileTranLock)
  2157. // return 0;
  2158. if(hfZx ==HFILE_ERROR)
  2159. return 0;
  2160. memset(&SendBuff[0],0, sizeof(SendBuff));
  2161. start_pos =*(int *)lpTmp;
  2162. _llseek(hfZx, 0, SEEK_SET);
  2163. file_len =(int)_llseek(hfZx, 0, SEEK_END)-start_pos;
  2164. if(file_len <=0)
  2165. return 0;
  2166. _llseek(hfZx, start_pos, SEEK_SET);
  2167. read_len =1024;
  2168. read_total =0;
  2169. while(read_total <file_len)
  2170. {
  2171. while(ShoutBlockingHook());
  2172. if(run_cancelled) break;
  2173. if(file_len-read_total <read_len)
  2174. read_len =file_len-read_total;
  2175. strcpy(SendBuff, ZX_HEAD);
  2176. len =strlen(ZX_HEAD)+sizeof(short);
  2177. if(_lread(hfZx, &SendBuff[len], read_len)!=(UINT)read_len)
  2178. return read_total;
  2179. len +=read_len;
  2180. *(short *)&SendBuff[strlen(ZX_HEAD)] =len;
  2181. if(UDP_SendBuff("资讯", sd, SendBuff, len,NULL)<0)
  2182. return -1;
  2183. read_total+=read_len;
  2184. }
  2185. return 0;
  2186. }
  2187. int SendDataDay(int sd, LPSTR lpTmp, struct sockaddr *lpdest)
  2188. {
  2189. BYTE SendBuff[MAX_SEND_BUF_SIZE+1];
  2190. int jys, i, len;
  2191. char fileName[128];
  2192. HFILE hFile;
  2193. OFSTRUCT os;
  2194. short gp_rec_num, data_rec_count, data_rec_end, sendCount, sendNum;
  2195. jys =*lpTmp++;
  2196. if(jys > 1) return -1;
  2197. memset(&SendBuff[0],0, sizeof(SendBuff));
  2198. gp_rec_num =*(short *)lpTmp;
  2199. if(gp_rec_num >=HqData[jys].recCount)
  2200. return -1;
  2201. lpTmp +=sizeof(short);
  2202. data_rec_end =*(int *)lpTmp;
  2203. lpTmp +=sizeof(int);
  2204. wsprintf(fileName, "%s\%s\%s.day", szDataPath, (jys ==0)?"SZDAY":"SHDAY",
  2205. HqData[jys].lpPreData[gp_rec_num].zqdm);
  2206. hFile =OpenFile(fileName, &os, OF_SHARE_DENY_NONE|OF_READ);
  2207. if(hFile ==HFILE_ERROR)
  2208. {
  2209. return -1;
  2210. }
  2211.     data_rec_count=(int) _llseek(hFile, 0l, FILE_END)/sizeof(DAY_DATA)-data_rec_end;
  2212. if(data_rec_count<=0)
  2213. {
  2214. _lclose(hFile);
  2215. return -1;
  2216. }
  2217. if(data_rec_count>500)
  2218. data_rec_count =500;
  2219. if(_llseek(hFile, data_rec_end*sizeof(DAY_DATA), FILE_BEGIN)
  2220. ==HFILE_ERROR)
  2221. {
  2222. ErrMsg(ghWndMain, "定位日线文件失败!");
  2223. ErrMsg(ghWndMain, fileName);
  2224. _lclose(hFile);
  2225. return -1;
  2226. }
  2227. sendCount =MAX_GRA_SEND_COUNT;
  2228. for(i =0; i<=data_rec_count/MAX_GRA_SEND_COUNT; i++)
  2229. {
  2230. sendNum =i*MAX_GRA_SEND_COUNT;
  2231. if(sendCount+sendNum >data_rec_count)
  2232. sendCount =data_rec_count-sendNum;
  2233. strcpy(SendBuff, DATA_DAY_HEAD); 
  2234. len =strlen(DATA_DAY_HEAD)+sizeof(short);
  2235. SendBuff[len++] =(char)jys;
  2236. *((short *)&SendBuff[len]) =gp_rec_num;
  2237. len +=sizeof(short);
  2238. *((short *)&SendBuff[len]) =sendCount;
  2239. len +=sizeof(short);
  2240. *((short *)&SendBuff[len]) =sendNum;
  2241. len +=sizeof(short);
  2242. if(_lread(hFile, &SendBuff[len], sizeof(DAY_DATA)*sendCount)
  2243. !=sizeof(DAY_DATA)*sendCount)
  2244. {
  2245. ErrMsg(ghWndMain, "读日线文件失败!");
  2246. _lclose(hFile);
  2247. return -1;
  2248. }
  2249. len +=sendCount*sizeof(DAY_DATA);
  2250. *(short *)&SendBuff[strlen(DATA_DAY_HEAD)] =len;
  2251. if(sendCount)
  2252. if(UDP_SendBuff("日线01", sd, SendBuff, len,NULL)<0)
  2253. break;
  2254. ShoutBlockingHook();
  2255. }
  2256. _lclose(hFile);
  2257. return 0;
  2258. }
  2259. int SendDayData(int sd, LPSTR lpTmp, struct sockaddr *lpdest)
  2260. {
  2261. char *SendBuff;
  2262. int jys,len,day;
  2263. char fileName[128];
  2264. HFILE hFile;
  2265. OFSTRUCT os;
  2266. short gp_rec_num, data_rec_count, data_rec_end, 
  2267.   send_rec_count,sendCount, sendNum;
  2268. char  IsAll =0,range=0; 
  2269. DAY_DATA DayData; 
  2270. jys =*lpTmp++;
  2271. if(jys > 1) return -1;
  2272. gp_rec_num =*(short *)lpTmp;
  2273. if(gp_rec_num >=HqData[jys].recCount)
  2274. return -1;
  2275. lpTmp +=sizeof(short);
  2276. data_rec_end =*(int *)lpTmp;
  2277. if(data_rec_end<0)
  2278. return -1;
  2279. lpTmp +=sizeof(int);
  2280. day =*(int *)lpTmp;
  2281. wsprintf(fileName, "%s\%s\%s.day", szDataPath, (jys ==0)?"SZDAY":"SHDAY",
  2282. HqData[jys].lpPreData[gp_rec_num].zqdm);
  2283. hFile =OpenFile(fileName, &os, OF_SHARE_DENY_NONE|OF_READ);
  2284. if(hFile ==HFILE_ERROR)
  2285. return -1;
  2286. data_rec_count=(int) _llseek(hFile, 0l, FILE_END)/sizeof(DAY_DATA);
  2287. if(data_rec_count <=0)
  2288. goto exit_send;
  2289. if(data_rec_end ==0)
  2290. IsAll =1;
  2291. else if(data_rec_end>0)
  2292. {
  2293. if(data_rec_end>data_rec_count)
  2294. IsAll =1;
  2295. else
  2296. {
  2297. _llseek(hFile, (data_rec_end-1)*sizeof(DAY_DATA), FILE_BEGIN);
  2298. if(_lread(hFile, &DayData, sizeof(DAY_DATA))==sizeof(DAY_DATA))
  2299. {
  2300. if(DayData.day!=day)
  2301. IsAll=1;
  2302. }
  2303. else
  2304. IsAll =1;
  2305. }
  2306. }
  2307. if(IsAll)
  2308. {
  2309. send_rec_count=data_rec_count;
  2310. _llseek(hFile, 0L, FILE_BEGIN);
  2311. }
  2312. else
  2313. {
  2314. send_rec_count=data_rec_count-data_rec_end;
  2315. _llseek(hFile, data_rec_end*sizeof(DAY_DATA), FILE_BEGIN);
  2316. }
  2317. if(send_rec_count>1500)
  2318. send_rec_count=1500;
  2319. SendBuff =GlobalAllocPtr(GHND,
  2320. strlen(DATA_DAY_HEAD)+11+sizeof(DAY_DATA)*send_rec_count);
  2321. if(SendBuff ==NULL)
  2322. {
  2323. _lclose(hFile);
  2324. return -1;
  2325. }
  2326. sendCount =send_rec_count;
  2327. sendNum =0;
  2328. strcpy(SendBuff, DATA_DAY_HEAD);   //7
  2329. len =strlen(DATA_DAY_HEAD)+sizeof(short); //2
  2330. SendBuff[len++] =(char)jys;   //1
  2331. *((short *)&SendBuff[len]) =gp_rec_num;    
  2332. len +=sizeof(short);                      //2 
  2333. *((short *)&SendBuff[len]) =sendCount;   
  2334. len +=sizeof(short);                      //2 
  2335. *((short *)&SendBuff[len]) =sendNum;      
  2336. len +=sizeof(short);                      //2  
  2337. SendBuff[len++] =IsAll;   //1
  2338.     SendBuff[len++] =range;   //1
  2339. if(sendCount)
  2340. if(_lread(hFile, &SendBuff[len], sizeof(DAY_DATA)*sendCount)
  2341. !=sizeof(DAY_DATA)*sendCount)
  2342. goto exit_send;
  2343. len +=sendCount*sizeof(DAY_DATA);
  2344. *(short *)&SendBuff[strlen(DATA_DAY_HEAD)] =len;
  2345. if(sendCount)
  2346. SendMemData(sd,SendBuff, len);
  2347. exit_send:
  2348. GlobalFreePtr(SendBuff);
  2349. _lclose(hFile);
  2350. return 0;
  2351. }
  2352. typedef struct tag_UDP_SEND_INFO
  2353. {
  2354. int sd;
  2355. int len;
  2356. BYTE version;
  2357. LPDEST_INFO lpDestInfo;
  2358. struct sockaddr dest;
  2359. char SendBuf[MAX_SEND_BUF_SIZE+1];
  2360. char filename[80];
  2361. HANDLE hThread;
  2362. }UDP_SEND_INFO, *LPUDP_SEND_INFO;
  2363. //////////////////////////////////////////////////////
  2364. //Function : send data pack to client
  2365. //Return   :
  2366. //         return value >0,return send data number
  2367. //         return value =0,no data send
  2368. //         return value <0,a net error come,we must
  2369. //         close the socket or stop commuate
  2370. //Modi date:
  2371. //         1998/03/23 
  2372. int UDP_SendBuff(LPSTR lpMsg, int sd, LPSTR lpBuf,
  2373. int len, LPDEST_INFO lpDestInfo)
  2374. {
  2375. int j =0, //一次发送的结果
  2376. e,      //SOCKET 错误码
  2377. x=0,    //已发送数据包长
  2378. k,
  2379. tlen;   //数据包总长
  2380. char SendBuf[MAX_SEND_BUF_SIZE+sizeof(short)+1];
  2381. MsgSend(lpMsg);
  2382. if(len+sizeof(short)+1>MAX_SEND_BUF_SIZE)
  2383. {
  2384. ErrMsg(ghWndMain, "来自UDP_SendBuff:发送记录太长");
  2385. return (-1);
  2386. }
  2387. memset(SendBuf,0,MAX_SEND_BUF_SIZE+1+sizeof(short));
  2388.     SendBuf[0]=START_SIGN;
  2389.     *(short *)&SendBuf[1]=(short )len;
  2390. memcpy(&SendBuf[1+sizeof(short)],lpBuf,len);
  2391. if(lpDestInfo!=NULL)
  2392. {
  2393. if(lpDestInfo->isDead) 
  2394. return 0;
  2395. }
  2396.     tlen = len+1+sizeof(short);
  2397. for(k=0;k<200;k++)
  2398. {
  2399. if(run_cancelled)
  2400. break;
  2401. j =send(sd, &SendBuf[x], tlen -x, 0);
  2402. if (j == SOCKET_ERROR)
  2403. {
  2404. e =WSAGetLastError();
  2405. switch(e)
  2406. {
  2407. case WSANOTINITIALISED : 
  2408. //A successful WSAStartup must occur 
  2409. //before using this function. 
  2410. ErrMsg(ghWndMain,"WSANOTINITIALISED");
  2411. return 0;
  2412. break;
  2413. case WSAENETDOWN :
  2414. //The network subsystem has failed. 
  2415. ErrMsg(ghWndMain,"WSAENETDOWN");
  2416. return x;
  2417. break;
  2418. case WSAEACCES:
  2419. //The requested address is a broadcast
  2420. //address, but the appropriate flag was not set. 
  2421. ErrMsg(ghWndMain,"WSAEACCES");
  2422. return 0;
  2423. break;
  2424. case WSAEINTR:
  2425. //The (blocking) call was canceled through 
  2426. //WSACancelBlockingCall. 
  2427. return x;
  2428. break;
  2429. case WSAEINPROGRESS:
  2430. //A blocking Windows Sockets 1.1 call is
  2431. //in progress, or the service provider is still 
  2432. //processing a callback function. 
  2433. ShoutBlockingHook();
  2434. Sleep(30);
  2435. break;
  2436. case WSAEFAULT:
  2437. //The buf parameter is not totally contained in
  2438. //a valid part of the user address space.
  2439. return x;
  2440. break;
  2441. case WSAENETRESET:
  2442. //The connection has been broken due to the 
  2443. //remote host resetting. 
  2444. HqDestStopBySd(sd);
  2445. return -1;
  2446. break;
  2447.                 case WSAENOBUFS:
  2448. //No buffer space is available. 
  2449. return x;
  2450. break;
  2451. case WSAENOTCONN:
  2452. //The socket is not connected.
  2453. HqDestStopBySd(sd);
  2454. return -1;
  2455. break;
  2456. case WSAENOTSOCK:
  2457. //The descriptor is not a socket. 
  2458. return -1;
  2459. break;
  2460. case WSAEOPNOTSUPP:
  2461. //MSG_OOB was specified, but the socket
  2462. //is not stream style such as type SOCK_STREAM, out-of-band data is not supported in the communication domain associated with this socket, or the socket is unidirectional and supports only receive operations. 
  2463. return x;
  2464. break;
  2465. case WSAESHUTDOWN:
  2466. //The socket has been shut down; it is not 
  2467. //possible to send on a socket after 
  2468. //shutdown has been invoked with how set 
  2469. //to SD_SEND or SD_BOTH. 
  2470. return -1;
  2471. break;
  2472. case WSAEWOULDBLOCK:
  2473. //The socket is marked as nonblocking and 
  2474. //the requested operation would block. 
  2475. ShoutBlockingHook();
  2476. if(lpDestInfo!=NULL)
  2477. {
  2478. if(lpDestInfo->isDead) return 0;
  2479. }
  2480. Sleep(30);
  2481. break;
  2482. case WSAEMSGSIZE:
  2483. //The socket is message oriented, and the 
  2484. //message is larger than the 
  2485. //maximum supported by the underlying transport. 
  2486. return x;
  2487. break;
  2488. case WSAEHOSTUNREACH:
  2489. //The remote host cannot be reached from this 
  2490. //host at this time. 
  2491. return x;
  2492. break;
  2493. case WSAEINVAL:
  2494. //The socket has not been bound with bind, or 
  2495. //an unknown flag was specified,
  2496. return -1;
  2497. break;
  2498. case WSAECONNABORTED:
  2499. //The virtual circuit was terminated due to a 
  2500. //time-out or other failure. The application 
  2501. //should close the socket as it is no longer usable. 
  2502. HqDestStopBySd(sd);
  2503. return -1;
  2504. break;
  2505. case WSAECONNRESET:
  2506. //The virtual circuit was reset by the remote 
  2507. //side executing a "hard" or "abortive" close. For 
  2508. //UPD sockets, the remote host was unable to deliver
  2509. //a previously sent UDP datagram and responded with 
  2510. //a "Port Unreachable" ICMP packet. The application 
  2511. //should close the socket as it is no longer usable. 
  2512. HqDestStopBySd(sd);
  2513. return -1;
  2514. break;
  2515. case WSAETIMEDOUT:
  2516. //The connection has been dropped, because of a network
  2517. //failure or because the system on the other end went down 
  2518. //without notice. 
  2519. HqDestStopBySd(sd);
  2520. return -1;
  2521. break;
  2522. default:
  2523. return -1;
  2524. }
  2525. }
  2526. else
  2527. {
  2528. x+=j;
  2529. if(x!=tlen)
  2530. ShoutBlockingHook();
  2531. else
  2532. break;
  2533. }
  2534. }
  2535. return x;
  2536. }
  2537. int LOW_UDP_SendBuff(LPSTR lpMsg, int sd, LPSTR lpBuf,
  2538. int len, struct sockaddr *lpdest, LPDEST_INFO lpDestInfo)
  2539. {
  2540. int j =0,e,x=0,tlen,k;
  2541. char SendBuf[sizeof(short)+1+MAX_SEND_BUF_SIZE];
  2542. MsgSend(lpMsg);
  2543. if(len+sizeof(short)+1>MAX_SEND_BUF_SIZE)
  2544. {
  2545. ErrMsg(ghWndMain, "来自UDP_SendBuff:发送记录太长");
  2546. return (-1);
  2547. }
  2548. memset(SendBuf,0,MAX_SEND_BUF_SIZE);
  2549.     SendBuf[0]=(char)0xf0;
  2550.     *(short *)&SendBuf[1]=(short )len;
  2551. memcpy(&SendBuf[1+sizeof(short)],lpBuf,len);
  2552. if(lpDestInfo!=NULL)
  2553. {
  2554. if(lpDestInfo->isDead) return 0;
  2555. }
  2556.     tlen = len+1+sizeof(short);
  2557. for(k=0;k<20;k++)
  2558. {
  2559. if(run_cancelled)
  2560. break;
  2561. j =send(sd, &SendBuf[x], tlen -x, 0);
  2562. if (j == SOCKET_ERROR)
  2563. {
  2564. e =WSAGetLastError();
  2565. switch(e)
  2566. {
  2567. case WSANOTINITIALISED : 
  2568. //A successful WSAStartup must occur 
  2569. //before using this function. 
  2570. return 0;
  2571. break;
  2572. case WSAENETDOWN :
  2573. //The network subsystem has failed. 
  2574. return x;
  2575. break;
  2576. case WSAEACCES:
  2577. //The requested address is a broadcast
  2578. //address, but the appropriate flag was not set. 
  2579. return 0;
  2580. break;
  2581. case WSAEINTR:
  2582. //The (blocking) call was canceled through 
  2583. //WSACancelBlockingCall. 
  2584. return x;
  2585. break;
  2586. case WSAEINPROGRESS:
  2587. //A blocking Windows Sockets 1.1 call is
  2588. //in progress, or the service provider is still 
  2589. //processing a callback function. 
  2590. ShoutBlockingHook();
  2591. Sleep(40);
  2592. break;
  2593. case WSAEFAULT:
  2594. //The buf parameter is not totally contained in
  2595. //a valid part of the user address space.
  2596. return x;
  2597. break;
  2598. case WSAENETRESET:
  2599. //The connection has been broken due to the 
  2600. //remote host resetting. 
  2601. HqDestStopBySd(sd);
  2602. return -1;
  2603. break;
  2604.                 case WSAENOBUFS:
  2605. //No buffer space is available. 
  2606. return x;
  2607. break;
  2608. case WSAENOTCONN:
  2609. //The socket is not connected.
  2610. HqDestStopBySd(sd);
  2611. return -1;
  2612. break;
  2613. case WSAENOTSOCK:
  2614. //The descriptor is not a socket. 
  2615. return -1;
  2616. break;
  2617. case WSAEOPNOTSUPP:
  2618. //MSG_OOB was specified, but the socket
  2619. //is not stream style such as type SOCK_STREAM, out-of-band data is not supported in the communication domain associated with this socket, or the socket is unidirectional and supports only receive operations. 
  2620. return x;
  2621. break;
  2622. case WSAESHUTDOWN:
  2623. //The socket has been shut down; it is not 
  2624. //possible to send on a socket after 
  2625. //shutdown has been invoked with how set 
  2626. //to SD_SEND or SD_BOTH. 
  2627. return -1;
  2628. break;
  2629. case WSAEWOULDBLOCK:
  2630. //The socket is marked as nonblocking and 
  2631. //the requested operation would block. 
  2632. ShoutBlockingHook();
  2633. if(lpDestInfo!=NULL)
  2634. {
  2635. if(lpDestInfo->isDead) return 0;
  2636. }
  2637. Sleep(40);
  2638. // k++;
  2639. break;
  2640. case WSAEMSGSIZE:
  2641. //The socket is message oriented, and the 
  2642. //message is larger than the 
  2643. //maximum supported by the underlying transport. 
  2644. return x;
  2645. break;
  2646. case WSAEHOSTUNREACH:
  2647. //The remote host cannot be reached from this 
  2648. //host at this time. 
  2649. return x;
  2650. break;
  2651. case WSAEINVAL:
  2652. //The socket has not been bound with bind, or 
  2653. //an unknown flag was specified,
  2654. return -1;
  2655. break;
  2656. case WSAECONNABORTED:
  2657. //The virtual circuit was terminated due to a 
  2658. //time-out or other failure. The application 
  2659. //should close the socket as it is no longer usable. 
  2660. HqDestStopBySd(sd);
  2661. return -1;
  2662. break;
  2663. case WSAECONNRESET:
  2664. //The virtual circuit was reset by the remote 
  2665. //side executing a "hard" or "abortive" close. For 
  2666. //UPD sockets, the remote host was unable to deliver
  2667. //a previously sent UDP datagram and responded with 
  2668. //a "Port Unreachable" ICMP packet. The application 
  2669. //should close the socket as it is no longer usable. 
  2670. HqDestStopBySd(sd);
  2671. return -1;
  2672. break;
  2673. case WSAETIMEDOUT:
  2674. //The connection has been dropped, because of a network
  2675. //failure or because the system on the other end went down 
  2676. //without notice. 
  2677. HqDestStopBySd(sd);
  2678. return -1;
  2679. break;
  2680. default:
  2681. HqDestStopBySd(sd);
  2682. return -1;
  2683. }
  2684. }
  2685. else
  2686. {
  2687. x+=j;
  2688. if(x !=tlen)
  2689. ShoutBlockingHook();
  2690. else
  2691. break;
  2692. }
  2693. }
  2694. return x;
  2695. }
  2696. int Thrd_SendBuff(LPSTR lpMsg, int sd, LPSTR lpBuf,
  2697.   int len, struct sockaddr *lpdest, LPDEST_INFO lpDestInfo)
  2698. {
  2699. HANDLE hThrd;
  2700. HANDLE hMem;
  2701. LPUDP_SEND_INFO lpSendInfo;
  2702. LONG lThreadId;
  2703. MsgSend(lpMsg);
  2704. if(lpDestInfo!=NULL)
  2705. {
  2706. if(lpDestInfo->isDead)
  2707. {
  2708. ErrMsg(ghWndMain, "来自Thrd_SendBuff:目标已不活动");
  2709. return 0;
  2710. }
  2711. }
  2712. hMem =GlobalAlloc(GHND, sizeof(UDP_SEND_INFO));
  2713. if(hMem ==NULL)
  2714. {
  2715. ErrMsg(ghWndMain, "来自Thrd_SendBuff:不能分配发送缓冲区!");
  2716. return -1;
  2717. }
  2718. lpSendInfo =(LPUDP_SEND_INFO)GlobalLock(hMem);
  2719. if(lpSendInfo ==NULL)
  2720. {
  2721. ErrMsg(ghWndMain, "来自Thrd_SendBuff:不能锁定发送缓冲区!");
  2722. GlobalFree(hMem);
  2723. return -1;
  2724. }
  2725. memcpy(&lpSendInfo->dest, lpdest, sizeof(struct sockaddr));
  2726. memset(&lpSendInfo->SendBuf[0],0,sizeof(lpSendInfo->SendBuf));
  2727.     lpSendInfo->SendBuf[0]=(char)0xf0;
  2728. *(short*)&lpSendInfo->SendBuf[1]=(short )len;
  2729. memcpy(&lpSendInfo->SendBuf[1+sizeof(short )], lpBuf, len);
  2730. lpSendInfo->len =len;
  2731. lpSendInfo->lpDestInfo =lpDestInfo;
  2732. lpSendInfo->sd =sd;
  2733. GlobalUnlock(hMem);
  2734. hThrd =CreateThread(NULL, 0,
  2735. (LPTHREAD_START_ROUTINE)TF_SendBuff,
  2736. hMem, CREATE_SUSPENDED, (LPDWORD)&lThreadId);
  2737. if(!hThrd)
  2738. {
  2739. GlobalUnlock(hMem);
  2740. GlobalFree(hMem);
  2741. ErrMsg(ghWndMain, "来自Thrd_SendBuff:不能建立线程!");
  2742. return -1;
  2743. }
  2744. lpSendInfo->hThread =hThrd;
  2745. SetThreadPriority(hThrd, THREAD_PRIORITY_NORMAL);
  2746. ResumeThread(hThrd);
  2747. return 0;
  2748. }
  2749. long TF_SendBuff(HANDLE phMem)
  2750. {
  2751. static BOOL fSending =FALSE;
  2752. int j =0,x=0,tlen;
  2753. HANDLE hThrd =NULL;
  2754. LPUDP_SEND_INFO lpSendInfo =NULL;
  2755. HANDLE hMem =phMem;
  2756. lpSendInfo =GlobalLock(hMem);
  2757. if(lpSendInfo ==NULL)
  2758. {
  2759. ErrMsg(ghWndMain, "来自TF_SendBuff:目标信息指针为空!");
  2760. goto thread_exit;
  2761. }
  2762. fSending =TRUE;
  2763. tlen =lpSendInfo->len+1+sizeof(short);
  2764. for(;;)
  2765. {
  2766. if(lpSendInfo->lpDestInfo!=NULL)
  2767. if(lpSendInfo->lpDestInfo->isDead) 
  2768. {
  2769. ErrMsg(ghWndMain, "来自TF_SendBuff:目标已不活动");
  2770. break;
  2771. }
  2772. if(PROTO_USE ==PROTO_UDP)
  2773. j =sendto(lpSendInfo->sd, &lpSendInfo->SendBuf[x],
  2774. tlen -x, 0, &lpSendInfo->dest,
  2775. sizeof(struct sockaddr));
  2776. else
  2777. j =send(lpSendInfo->sd, &lpSendInfo->SendBuf[x],tlen -x, 0);
  2778. if (j == SOCKET_ERROR)
  2779. {
  2780. if (h_errno == WSAEWOULDBLOCK)
  2781. {
  2782. Sleep(10);
  2783. continue;
  2784. }
  2785. else
  2786. {
  2787. ErrMsg(NULL, lpSendInfo->SendBuf);
  2788. ErrMsg(ghWndMain, GetError("来自TF_SendBuff():sendto(),错误信息"));
  2789. }
  2790. j =-1;
  2791. break;
  2792. }
  2793. if(x+j!=tlen)
  2794. x+=j;
  2795. else
  2796. break;
  2797. }
  2798. thread_exit:
  2799. fSending =FALSE;
  2800. if(lpSendInfo)
  2801. {
  2802. hThrd =lpSendInfo->hThread;
  2803. GlobalUnlock(hMem);
  2804. }
  2805. if(hMem) GlobalFree(hMem);
  2806. if(hThrd!=NULL)
  2807. CloseHandle(hThrd);
  2808. ExitThread(0);
  2809. return 0;
  2810. }
  2811. char de[43]={'E','A','W','S','8',':','J','>','Z','M','V','Q','@','1','P','D',
  2812.        'I','0','=','L','N','5','K','O','R','X','T','U','F','Y','G','?',
  2813.        '7','<','6',';','H','2','B','9','3','C','4'};
  2814. uchar key[9];
  2815. int UDP_ReadJy(int sd,char * RecvBuf,int len,struct sockaddr_in dest)
  2816. {               
  2817. int i,j=0,ret;
  2818. uchar *lpTmp;
  2819. static uchar *b; 
  2820. LPJY_DEST lpDestTmp;
  2821. signed char buf1[DATALENGTH];
  2822. //if(!fUseJy) return 0;
  2823. for(i=0;i<len;i++)
  2824. {
  2825. if(RecvBuf[i]>='0'&&RecvBuf[i]<='Z')
  2826. {
  2827. RecvBuf[i]=de[RecvBuf[i]-'0'];
  2828. }
  2829. }
  2830. if(len ==0) return 0;
  2831. lpTmp =&RecvBuf[0];
  2832. if(len>=6+100&&strncmp("RSAKEY", &lpTmp[len -6], 6) ==0)
  2833. {
  2834. lpTmp[len -6] =0;
  2835. StrToByt(&lpTmp[len -6 -100],buf1);
  2836. DecipherDesKey(buf1,R,SK,key);
  2837. lpTmp[len -6 -100]=0;
  2838. len -=(6+100);
  2839. }
  2840. else
  2841. strcpy(key,"98124325");
  2842. for(j=0;j<2;j++)
  2843. {
  2844. if(strncmp(JY_CHKUSR_HEAD, lpTmp, strlen(JY_CHKUSR_HEAD)) ==0)
  2845. {
  2846. MsgRecv("检查交易用户");
  2847. lpTmp +=strlen(JY_CHKUSR_HEAD);
  2848. len -=strlen(JY_CHKUSR_HEAD);
  2849. if(len <sizeof(JY_ASK_CHKUSR))
  2850. {
  2851. SendMsg(sd,"处理交易登录错");
  2852. return -1;
  2853. }
  2854. if((ret =Jy_ChkUsr(sd, *(short *)lpTmp,(LPJY_ASK_CHKUSR)(lpTmp+2))) <0)
  2855. {
  2856. Jy_SendRet(sd, REQ_CHKUSR, (char)ret, *(short *)lpTmp);
  2857. return -1;
  2858. }
  2859. break;
  2860. }
  2861. else if(strncmp(JY_ZQSXX_HEAD, lpTmp, strlen(JY_ZQSXX_HEAD)) ==0)
  2862. {
  2863. Jy_Zqsxx(sd);
  2864. break;
  2865. }
  2866. else if(strncmp(JY_CHGPWD_HEAD, lpTmp, strlen(JY_CHGPWD_HEAD)) ==0)
  2867. {
  2868. MsgRecv("改交易密码");
  2869. lpTmp +=strlen(JY_CHGPWD_HEAD);
  2870. len -=strlen(JY_CHGPWD_HEAD);
  2871. if(len <sizeof(JY_ASK_CHGPWD))
  2872. return -1;
  2873. if((ret =Jy_ChgPwd(sd, *(short *)lpTmp,(LPJY_ASK_CHGPWD)(lpTmp+2))) <0)
  2874. {
  2875. Jy_SendRet(sd, REQ_CHGPWD, (char)ret, *(short *)lpTmp);
  2876. return -1;
  2877. }
  2878. break;
  2879. }               
  2880. else if(strncmp(JY_BUYSELL_HEAD, lpTmp, strlen(JY_BUYSELL_HEAD)) ==0)
  2881. {
  2882. MsgRecv("股票买卖");
  2883. lpTmp +=strlen(JY_BUYSELL_HEAD);
  2884. len -=strlen(JY_BUYSELL_HEAD);
  2885. if(len <sizeof(JY_ASK_BUYSELL))
  2886. {
  2887. //SendError(sd, (struct sockaddr *)&dest);
  2888. return -1;
  2889. }
  2890. if((ret =Jy_BuySell(sd,*(short *)lpTmp,(LPJY_ASK_BUYSELL)(lpTmp+2))) <0)
  2891. {
  2892. Jy_SendRet(sd, REQ_BUYSEL, (char)ret, *(short *)lpTmp);
  2893. return -1;
  2894. }
  2895. break;
  2896. }       
  2897. else if(strncmp(JY_CANCEL_HEAD, lpTmp, strlen(JY_CANCEL_HEAD)) ==0)
  2898. {
  2899. MsgRecv("撤消委托");
  2900. lpTmp +=strlen(JY_CANCEL_HEAD);
  2901. len -=strlen(JY_CANCEL_HEAD);
  2902. if(len <sizeof(JY_ASK_CANCEL))
  2903. {
  2904. return -1;
  2905. }
  2906. if((ret =Jy_Cancel(sd, *(short *)lpTmp,(LPJY_ASK_CANCEL)(lpTmp+2))) <0)
  2907. {
  2908. Jy_SendRet(sd, REQ_CANCEL, (char)ret, *(short *)lpTmp);
  2909. return -1;
  2910. }
  2911. break;
  2912. }       
  2913. else if(strncmp(JY_YECX_HEAD, lpTmp, strlen(JY_YECX_HEAD)) ==0)
  2914. {
  2915. MsgRecv("余额查询");
  2916. lpTmp +=strlen(JY_YECX_HEAD);
  2917. len -=strlen(JY_YECX_HEAD);
  2918. if(len <sizeof(JY_ASK_YECX))
  2919. {
  2920. return -1;
  2921. }
  2922. if((ret =Jy_Yecx(sd, *(short *)lpTmp,(LPJY_ASK_YECX)(lpTmp+2))) !=0)
  2923. {
  2924. Jy_SendRet(sd, REQ_YECX, (char)ret, *(short *)lpTmp);
  2925. return -1;
  2926. }
  2927. break;
  2928. }
  2929. else if(strncmp(JY_CJCX_HEAD, lpTmp, strlen(JY_CJCX_HEAD)) ==0)
  2930. {
  2931. MsgRecv("成交查询");
  2932. lpTmp +=strlen(JY_CJCX_HEAD);
  2933. len -=strlen(JY_CJCX_HEAD);
  2934. if(len <sizeof(JY_ASK_CJCX))
  2935. {
  2936. return -1;
  2937. }
  2938. if((ret =Jy_Cjcx(sd, *(short *)lpTmp,(LPJY_ASK_CJCX)(lpTmp+2))) !=0)
  2939. {
  2940. Jy_SendRet(sd, REQ_CJCX, (char)ret, *(short *)lpTmp);
  2941. return -1;
  2942. }
  2943. break;
  2944. }                               
  2945. else if(strncmp(JY_WTCX_HEAD, lpTmp, strlen(JY_WTCX_HEAD)) ==0)
  2946. {
  2947. MsgRecv("委托查询");
  2948. lpTmp +=strlen(JY_WTCX_HEAD);
  2949. len -=strlen(JY_WTCX_HEAD);
  2950. if(len <sizeof(JY_ASK_WTCX))
  2951. {
  2952. return -1;
  2953. }
  2954. if((ret =Jy_Wtcx(sd, *(short *)lpTmp,(LPJY_ASK_WTCX)(lpTmp+2)))!=0)
  2955. {
  2956. Jy_SendRet(sd, REQ_WTCX, (char)ret, *(short *)lpTmp);
  2957. return -1;
  2958. }
  2959. break;
  2960. }
  2961. else if(strncmp(JY_EXIT, lpTmp, strlen(JY_EXIT)) ==0)
  2962. {
  2963. MsgRecv("交易用户退出");
  2964. JyDest_Exit(sd);
  2965. break;
  2966. }
  2967. else
  2968. {
  2969.   lpDestTmp =GetJyDestBySd(sd);
  2970.   if(lpDestTmp !=NULL)
  2971.   {
  2972.   if(lpDestTmp->DesKey[0]!=0)
  2973.   {
  2974. strncpy(key,lpDestTmp->DesKey,8);
  2975. key[8]=0;
  2976.   }
  2977.   }
  2978.      if(desinit(key)!=0) 
  2979.   {
  2980. ErrMsg(ghWndMain,"不能初始化KEY");
  2981. return(0);
  2982.   }
  2983.      for(b=lpTmp,i=len;i>0;i-=8,b+=8)
  2984.   {
  2985.    if(i<8) break;
  2986.    if(ecbdecode(b,b)!=0)
  2987. {
  2988. ErrMsg(ghWndMain,"ecbdecode()错");
  2989. return(0);
  2990. }
  2991.   }
  2992. }
  2993. }
  2994. return 0;
  2995. }
  2996. int ShoutBlockingHook(void)
  2997. {
  2998. MSG msg;
  2999. if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
  3000. {
  3001. if(!ghWndMain || !IsDialogMessage(ghWndMain, &msg))
  3002. {
  3003. TranslateMessage(&msg);
  3004. DispatchMessage(&msg);   
  3005. if(msg.message ==WM_QUIT)
  3006. {
  3007. PostQuitMessage(0);
  3008. run_cancelled =TRUE;               
  3009. return FALSE;
  3010. }
  3011. }            
  3012. return TRUE;
  3013. }
  3014. return FALSE;
  3015. }
  3016. int PASCAL FAR WSAsperror(int errorcode, char far * buf, int len)
  3017. {
  3018. int err_len;
  3019.     
  3020. if (errorcode == 0)
  3021. errorcode = WSABASEERR;
  3022. if (errorcode < WSABASEERR)
  3023. return 0;
  3024.     
  3025. err_len = LoadString(ghInstance,errorcode,buf,len);
  3026. return err_len;
  3027. }
  3028. LPSTR GetError(LPSTR err_prefix)
  3029. {
  3030. int wsa_err;
  3031. char errbuf[500];
  3032. static char prbuf[600];
  3033. wsa_err =WSAGetLastError(); 
  3034. WSAsperror(wsa_err, (LPSTR)errbuf, 500);
  3035.     
  3036. wsprintf((LPSTR)prbuf, "%s:%s", (LPSTR) err_prefix, (LPSTR)errbuf);
  3037. return &prbuf[0];  
  3038. }
  3039. void SendError(int sd, struct sockaddr * lpdest)
  3040. {
  3041. int len;
  3042. char SendBuff[20];
  3043. memset(SendBuff,0,sizeof(SendBuff));
  3044. strcpy(SendBuff, ERROR_HEAD);
  3045. len =strlen(ERROR_HEAD)+sizeof(short);
  3046. SendBuff[len++] =0;
  3047. *(short *)&SendBuff[strlen(ERROR_HEAD)] =len;
  3048. UDP_SendBuff("发送错误", sd, SendBuff, len, NULL);
  3049. }
  3050. int SendMsg(int sd, LPSTR lpMsg)
  3051. {
  3052. char SendBuff[400];
  3053. int len;
  3054. memset(SendBuff,0,sizeof(SendBuff));
  3055. strcpy(SendBuff, MSG_HEAD);
  3056. len =strlen(MSG_HEAD)+sizeof(short);
  3057. strcat(&SendBuff[len], lpMsg);
  3058. len +=strlen(lpMsg);
  3059. SendBuff[len++] =0;
  3060. *(short *)&SendBuff[strlen(MSG_HEAD)] =len;
  3061. return(UDP_SendBuff(lpMsg, sd, SendBuff, len, NULL));
  3062. }
  3063. int MaxMinFillData(int jys, int maxmin)
  3064. {
  3065. int i, j;
  3066. for(i =0; i<4; i++)
  3067. for(j =0; j<10; j++)
  3068. {
  3069. /////////////
  3070. if(MaxMinData[jys][maxmin].recNum[i][j] >=HqData[jys].recCount) return -1;
  3071. MaxMinData[jys][maxmin].MaxMin[i][j].zjcj
  3072. =HqData[jys].lpRefData[MaxMinData[jys][maxmin].recNum[i][j]].zjcj;
  3073. MaxMinData[jys][maxmin].MaxMin[i][j].zdf
  3074. =HqData[jys].lpRefData[MaxMinData[jys][maxmin].recNum[i][j]].zdf;
  3075. MaxMinData[jys][maxmin].MaxMin[i][j].cjss
  3076. =HqData[jys].lpRefData[MaxMinData[jys][maxmin].recNum[i][j]].cjss;
  3077. }
  3078. return 0;
  3079. }
  3080. BOOL IsZsRec(int jys, short rec_num)
  3081. {
  3082. if(jys ==0)
  3083. {
  3084. if(!strncmp(HqData[jys].lpPreData[rec_num].zqdm, "99", 2))
  3085. return TRUE;
  3086. }
  3087. else
  3088. if(!strncmp(HqData[jys].lpPreData[rec_num].zqdm, "0000", 4)
  3089. &&(HqData[jys].lpPreData[rec_num].zqdm[4] =='0'
  3090. ||HqData[jys].lpPreData[rec_num].zqdm[4] =='1'))
  3091. return TRUE;
  3092. return FALSE;
  3093. }
  3094. BOOL ZlibCompressFile(char *infile,char *outfile)
  3095. {
  3096. gzFile out;
  3097. char buf[4096];
  3098. int bytes;
  3099. HFILE hFile;
  3100. OFSTRUCT os;
  3101. hFile =OpenFile(infile, &os, OF_SHARE_DENY_NONE|OF_READ);
  3102. if(hFile==HFILE_ERROR)
  3103. return FALSE;
  3104. out = gzopen(outfile, "wb6 ");
  3105. for(;;)
  3106. {
  3107. bytes =_lread(hFile, buf, sizeof(buf));
  3108. if(bytes <=0) break;
  3109. if (gzwrite(out, buf, (unsigned)bytes) != bytes) 
  3110. {
  3111. ErrMsg(NULL,"ZLIB压缩文件失败!");
  3112. gzclose(out);
  3113. return FALSE;
  3114. }
  3115. if(bytes<sizeof(buf))
  3116. break;
  3117. }
  3118. _lclose(hFile);
  3119. if (gzclose(out) != Z_OK) 
  3120. ErrMsg(NULL,"failed gzclose");
  3121. return TRUE;
  3122. }
  3123. BOOL ZlibCompressMemFile(char *buf,int len,char *outfile)
  3124. {
  3125. gzFile out;
  3126.     out = gzopen(outfile, "wb6 ");
  3127.     if (out == NULL)
  3128. {
  3129.         ErrMsg(NULL,"zlib can not open out file");
  3130. return FALSE;
  3131.     }
  3132. if (gzwrite(out, buf, (unsigned)len) != len) 
  3133. {
  3134. ErrMsg(NULL,"ZLIB压缩文件失败!");
  3135. gzclose(out);
  3136. return FALSE;
  3137. }
  3138. if (gzclose(out) != Z_OK) 
  3139. ErrMsg(NULL,"failed gzclose");
  3140. return TRUE;
  3141. }
  3142. void ReadySysFile(void)
  3143. {
  3144. char src[128],tag[128];
  3145. sprintf(src,"%s\sys\sysinfo.dat",szDataPath);
  3146. sprintf(tag,"%s\sys\sysinfo.lzw",szDataPath);
  3147. if(!CompressFile(src,tag))
  3148. {
  3149. ErrMsg(NULL,"compress Config file Failed");
  3150. }
  3151. sprintf(tag,"%s\sys\sysinfo.gz",szDataPath);
  3152. if(!ZlibCompressFile(src,tag))
  3153. {
  3154. ErrMsg(NULL,"zlib compress Config file Failed");
  3155. }
  3156. sprintf(src,"%s\sys\help.txt",szDataPath);
  3157. sprintf(tag,"%s\sys\help.lzw",szDataPath);
  3158. if(!CompressFile(src,tag))
  3159. {
  3160. ErrMsg(NULL,"compress help file Failed");
  3161. }
  3162. sprintf(tag,"%s\sys\help.gz",szDataPath);
  3163. if(!ZlibCompressFile(src,tag))
  3164. {
  3165. ErrMsg(NULL,"compress help file Failed");
  3166. }
  3167. }
  3168. #define MPAK_BEGIN 'B'
  3169. #define SPAK_NOCOM 'e'
  3170. #define MPAK_NOCOM 'E'
  3171. #define SPAC_COMPE 'f'
  3172. #define MPAC_COMPE 'F'  
  3173. #define GZ_STAR 1
  3174. #define GZ_SING 2
  3175. #define GZ_CONT 3
  3176. #define GZ_OVER 4
  3177. long TF_Send_Clt_Init_Files(HANDLE hMem)
  3178. {
  3179. HANDLE hThrd =NULL;
  3180. LPUDP_SEND_INFO lpSendInfo =NULL;
  3181. SEND_FILE_FRAME SendFileFrame;
  3182. char sendBuff[2048],filename[80],temp[80];
  3183.     UINT tlen,  //数据包总长
  3184.  alen,  //一次送数据包长数量
  3185.  slen,  //已送数据包数
  3186.  len;   //数据包已打包数
  3187.     int i,status,mlen;
  3188. long j;
  3189. HFILE hFile;
  3190. OFSTRUCT os;
  3191. BOOL comp;
  3192. lpSendInfo =GlobalLock(hMem);
  3193. if(lpSendInfo ==NULL)
  3194. {
  3195. ErrMsg(ghWndMain, "来自TF_Send_Clt_Init_Files:目标信息指针为空!");
  3196. goto thread_exit;
  3197. }
  3198. for(i=0;i<4;i++)
  3199. {
  3200. if(i==0)
  3201. {
  3202. //送配置文件
  3203. if(lpSendInfo->version<11)
  3204. continue;
  3205. if(lpSendInfo->version==11)
  3206. sprintf(filename, "%s\sys\sysinfo.lzw",szDataPath);
  3207. if(lpSendInfo->version==12)
  3208. sprintf(filename, "%s\sys\sysinfo.gz",szDataPath);
  3209. if(access(filename,0)!=0)
  3210. continue;
  3211. }
  3212. if(i==1)
  3213. {
  3214. //送深圳行情
  3215. if(lpSendInfo->version==11)
  3216. {
  3217. sprintf(filename, "%s\%d.lzw.comp", szDataPath,lpSendInfo->sd);
  3218. sprintf(temp, "%s\szhq.202", HqDataPath);
  3219. if(access(temp,0)!=0)
  3220. sprintf(temp, "%s\szhq.dat", HqDataPath);
  3221. mlen =*LzwData202[0].recCount*sizeof(HQ_REF_DATA_V202)+sizeof(short);
  3222. comp =CompressMemFile((char *)LzwData202[0].recCount,mlen,filename);
  3223. if(!comp)
  3224. {
  3225. sprintf(filename, "%s\szhq.dat", HqDataPath);
  3226. lpSendInfo->version=10;
  3227. }
  3228. }
  3229. if(lpSendInfo->version>11)
  3230. {
  3231. sprintf(filename, "%s\%d.lzw.comp", szDataPath,lpSendInfo->sd);
  3232. sprintf(temp, "%s\szhq.202", HqDataPath);
  3233. if(access(temp,0)!=0)
  3234. sprintf(temp, "%s\szhq.dat", HqDataPath);
  3235. mlen =*LzwData202[0].recCount*sizeof(HQ_REF_DATA_V202)+sizeof(short);
  3236. comp =ZlibCompressMemFile((char *)LzwData202[0].recCount,mlen,filename);
  3237. if(!comp)
  3238. {
  3239. sprintf(filename, "%s\szhq.dat", HqDataPath);
  3240. lpSendInfo->version=10;
  3241. }
  3242. }
  3243. if(lpSendInfo->version<11)
  3244. {
  3245. sprintf(filename, "%s\szhq.dat", HqDataPath);
  3246. }
  3247. }
  3248. if(i==2)
  3249. {
  3250. //送上海行情
  3251. if(lpSendInfo->version==11)
  3252. {
  3253. sprintf(filename, "%s\%d.lzw.comp", szDataPath,lpSendInfo->sd);
  3254. sprintf(temp, "%s\shhq.202", HqDataPath);
  3255. if(access(temp,0)!=0)
  3256. sprintf(temp, "%s\shhq.dat", HqDataPath);
  3257. mlen =*LzwData202[1].recCount*sizeof(HQ_REF_DATA_V202)+sizeof(short);
  3258. comp =CompressMemFile((char *)LzwData202[1].recCount,mlen,filename);
  3259. if(!comp)
  3260. {
  3261. sprintf(filename, "%s\shhq.dat", HqDataPath);
  3262. lpSendInfo->version=10;
  3263. }
  3264. }
  3265. if(lpSendInfo->version>11)
  3266. {
  3267. sprintf(filename, "%s\%d.lzw.comp", szDataPath,lpSendInfo->sd);
  3268. sprintf(temp, "%s\shhq.202", HqDataPath);
  3269. if(access(temp,0)!=0)
  3270. sprintf(temp, "%s\shhq.dat", HqDataPath);
  3271. mlen =*LzwData202[1].recCount*sizeof(HQ_REF_DATA_V202)+sizeof(short);
  3272. comp =ZlibCompressMemFile((char *)LzwData202[1].recCount,mlen,filename); if(!comp)
  3273. {
  3274. sprintf(filename, "%s\shhq.dat", HqDataPath);
  3275. lpSendInfo->version=10;
  3276. }
  3277. }
  3278. if(lpSendInfo->version<11)
  3279. {
  3280. sprintf(filename, "%s\shhq.dat", HqDataPath);
  3281. }
  3282. }
  3283. if(i==3)
  3284. {
  3285. //送帮助文件
  3286. if(lpSendInfo->version==11)
  3287. sprintf(filename, "%s\sys\help.lzw",szDataPath);
  3288. if(lpSendInfo->version<11)
  3289. sprintf(filename, "%s\sys\help.txt",szDataPath);
  3290. if(lpSendInfo->version==12)
  3291. sprintf(filename, "%s\sys\help.gz",szDataPath);
  3292. }
  3293. hFile =OpenFile(filename, &os, OF_SHARE_DENY_NONE|OF_READ);
  3294. if(hFile==HFILE_ERROR)
  3295. continue;
  3296. if((tlen=(UINT)_llseek(hFile, 0, FILE_END))==HFILE_ERROR)
  3297. {
  3298. ErrMsg(ghWndMain, "来自TF_Send_Clt_Init_Files:不能定位到文件尾!");
  3299. _lclose(hFile);
  3300. goto thread_exit;
  3301. }
  3302. if(_llseek(hFile, 0, FILE_BEGIN)==HFILE_ERROR)
  3303. {
  3304. ErrMsg(ghWndMain, "来自TF_Send_Clt_Init_Files:不能定位到文件头!");
  3305. _lclose(hFile);
  3306. goto thread_exit;
  3307. }
  3308. if(i==0)
  3309. strcpy(SendFileFrame.filename,"sysinfo.dat");
  3310. if(i==1)
  3311. strcpy(SendFileFrame.filename,"szhq.dat");
  3312.         if(i==2)
  3313. strcpy(SendFileFrame.filename,"shhq.dat");
  3314. if(i==3)
  3315. strcpy(SendFileFrame.filename,"help.txt");
  3316. if(tlen<=2000)                 //小数据包 
  3317. {
  3318. SendFileFrame.filelen=tlen;
  3319. strcpy(sendBuff,SEND_FILE_HEAD);
  3320. len =strlen(SEND_FILE_HEAD);
  3321. if(lpSendInfo->version>10) //压缩
  3322. SendFileFrame.sign ='f';
  3323. else                       //非压缩  
  3324. SendFileFrame.sign ='e';
  3325. if(lpSendInfo->version==12)
  3326. SendFileFrame.sign =GZ_SING;
  3327. memcpy(&sendBuff[len],&SendFileFrame,sizeof(SEND_FILE_FRAME));
  3328. len+=sizeof(SEND_FILE_FRAME);
  3329. if(_lread(hFile, &sendBuff[len], tlen)
  3330. !=tlen)
  3331. {
  3332. ErrMsg(ghWndMain,"来自TF_Send_Clt_Init_Files:读文件错!");
  3333. _lclose(hFile);
  3334. goto thread_exit;
  3335. }
  3336. len+=tlen;
  3337.             if(UDP_SendBuff("数据文件", lpSendInfo->sd, sendBuff, len, NULL)<0)
  3338. {
  3339. _lclose(hFile);
  3340. goto thread_exit;
  3341. }
  3342. _lclose(hFile);
  3343. }
  3344. else
  3345. {
  3346. alen=2000;
  3347. slen=0;
  3348. for(;;)
  3349. {
  3350. if(tlen-slen>2000)
  3351. alen=2000;
  3352. else
  3353. alen=tlen-slen;
  3354. slen+=alen;
  3355. if(slen==tlen)
  3356. {
  3357. if(lpSendInfo->version>10)
  3358. SendFileFrame.sign ='F';
  3359. else
  3360. SendFileFrame.sign ='E';
  3361. if(lpSendInfo->version==12)
  3362. SendFileFrame.sign =GZ_OVER;
  3363. }
  3364. if(slen>2000&&slen<tlen)
  3365. {
  3366. SendFileFrame.sign ='S';
  3367. if(lpSendInfo->version==12)
  3368. SendFileFrame.sign =GZ_CONT;
  3369. }
  3370. if(slen<=2000)
  3371. {
  3372. SendFileFrame.sign ='B';
  3373. if(lpSendInfo->version==12)
  3374. SendFileFrame.sign =GZ_STAR;
  3375. }
  3376. SendFileFrame.filelen=alen;
  3377. strcpy(sendBuff,SEND_FILE_HEAD);
  3378. len =strlen(SEND_FILE_HEAD);
  3379. memcpy(&sendBuff[len],&SendFileFrame,sizeof(SEND_FILE_FRAME));
  3380. len+=sizeof(SEND_FILE_FRAME);
  3381. if(_lread(hFile, &sendBuff[len], alen)
  3382. !=alen)
  3383. {
  3384. ErrMsg(ghWndMain,"来自TF_Send_Clt_Init_Files:读文件错!");
  3385. _lclose(hFile);
  3386. goto thread_exit;
  3387. }
  3388. len+=alen;
  3389. if(UDP_SendBuff("数据文件", lpSendInfo->sd, sendBuff, len,NULL)<0)
  3390. {
  3391. _lclose(hFile);
  3392. goto thread_exit;
  3393. }
  3394. if(slen==tlen)
  3395. {
  3396. _lclose(hFile);
  3397. break;
  3398. }
  3399. for(j=0;j<200;j++)
  3400. {
  3401. status=check_socket_status(lpSendInfo->sd);
  3402. if(status ==-1||status == -2)
  3403. {
  3404. _lclose(hFile);
  3405. goto thread_exit;
  3406. }
  3407. if(status==0) 
  3408. break;
  3409. Sleep(40);
  3410. }
  3411. if(j>=200)
  3412. {
  3413. _lclose(hFile);
  3414. goto thread_exit;
  3415. }
  3416. }
  3417. }
  3418. if((i==1||i==2)&&lpSendInfo->version>10)
  3419. unlink(filename);
  3420. }
  3421. thread_exit:
  3422. if(strstr(filename,".comp")!=NULL)
  3423. unlink(filename);
  3424. if(lpSendInfo!=NULL)
  3425. {
  3426. hThrd =lpSendInfo->hThread;
  3427. GlobalUnlock(hMem);
  3428. }
  3429. if(hMem) GlobalFree(hMem);
  3430. if(hThrd!=NULL)
  3431. CloseHandle(hThrd);
  3432. ExitThread(0);
  3433. return 0;
  3434. }
  3435. int UDP_Server_Send_HqChkUsr(int sd, LPSTR lpTmp, struct sockaddr *lpdest)
  3436. {
  3437. int len,ret;
  3438. char SendBuff[100];
  3439.     char Id[HQ_USERID_SIZE+1],Pass[HQ_USERPWD_SIZE+1];
  3440.     LPDEST_INFO lpDestTmp;
  3441. BYTE version;
  3442. HANDLE hMem;
  3443. LPUDP_SEND_INFO lpSendInfo;
  3444. HANDLE hThrd;
  3445. LONG lThreadId;
  3446. memset(SendBuff,0,100);
  3447. strcpy(SendBuff, HQ_CHKUSR_HEAD);
  3448. len =strlen(HQ_CHKUSR_HEAD)+sizeof(short);
  3449.     strncpy(Id,lpTmp,HQ_USERID_SIZE);
  3450. Id[HQ_USERID_SIZE]=0;
  3451.     strncpy(Pass,lpTmp+HQ_USERID_SIZE,HQ_USERPWD_SIZE);
  3452. Pass[HQ_USERPWD_SIZE] =0;
  3453.     if(Monitor.IsRun)
  3454. {
  3455.         lpDestTmp=GetAnotherUserById(Id,sd);
  3456. if(lpDestTmp==NULL||lpDestTmp->isDead)
  3457. {
  3458. ret=RegisterUser(Id,Pass);
  3459. if(ret>0)
  3460. {
  3461. version=(BYTE)HqDestActiveUsr(sd, lpdest, Id,ret);
  3462. ret=LOGIN_SUCC;
  3463. }
  3464. }
  3465. else
  3466. {
  3467. ret=RegisterUser(Id,Pass);
  3468.             if(ret>0)
  3469. {
  3470. if(SendMsg(lpDestTmp->sd,"请您注意,有别的用户试图用您的帐号登录")<0)
  3471. {
  3472. version=(BYTE)HqDestActiveUsr(sd, lpdest, Id,ret);
  3473. ret=LOGIN_SUCC;
  3474. }
  3475. else
  3476. ret=LOGIN_ANOTHER;
  3477. }
  3478.         }
  3479. }
  3480. else 
  3481. {
  3482. version =(BYTE)11;
  3483. ret =LOGIN_SUCC;
  3484. }
  3485. SendBuff[len++] =ret;
  3486. *(short *)&SendBuff[strlen(HQ_CHKUSR_HEAD)] =len;
  3487. UDP_SendBuff("效验用户", sd, SendBuff, len, NULL);
  3488. if(ret==LOGIN_SUCC)
  3489. {  
  3490.         //派生出初始化用户端线程
  3491. hMem =GlobalAlloc(GHND, sizeof(UDP_SEND_INFO));
  3492. if(hMem ==NULL)
  3493. {
  3494. ErrMsg(ghWndMain, "来自HqChkUsr:不能分配发送缓冲区!");
  3495. return -1;
  3496. }
  3497. lpSendInfo =(LPUDP_SEND_INFO)GlobalLock(hMem);
  3498. if(lpSendInfo ==NULL)
  3499. {
  3500. ErrMsg(ghWndMain, "来自HqChkUsr:不能锁定发送缓冲区!");
  3501. GlobalFree(hMem);
  3502. return -1;
  3503. }
  3504. lpSendInfo->sd =sd;
  3505. lpSendInfo->version =version;
  3506. hThrd =CreateThread(NULL, 200*1024,
  3507. (LPTHREAD_START_ROUTINE)TF_Send_Clt_Init_Files,
  3508. hMem, CREATE_SUSPENDED, (LPDWORD)&lThreadId);
  3509. if(!hThrd)
  3510. {
  3511. GlobalUnlock(hMem);
  3512. GlobalFree(hMem);
  3513. ErrMsg(ghWndMain, "来自HqChkUsr:不能建立线程!");
  3514. }
  3515. else
  3516. {
  3517. lpSendInfo->hThread =hThrd;
  3518. GlobalUnlock(hMem);
  3519. SetThreadPriority(hThrd, THREAD_PRIORITY_NORMAL);
  3520. ResumeThread(hThrd);
  3521. }
  3522. }
  3523. return 0;
  3524. }
  3525. #define FILE_STOCK_INFO 0 //个股信息
  3526. #define FILE_LIST_DIR 1   //新闻目录
  3527. #define FILE_NORMAL 2   //单个文件
  3528. #define FILE_SZ_ALL_MINUTE 3   //深分时数据
  3529. #define FILE_SZ_ALL_DAY     4   //深日线数据
  3530. #define FILE_SH_ALL_MINUTE 5   //沪分时数据
  3531. #define FILE_SH_ALL_DAY     6   //沪日线数据
  3532. #define FILE_WINPY 7
  3533. DWORD WINAPI TF_Send_DownLoad(LPVOID hMem)
  3534. {
  3535. HANDLE hThrd =NULL;
  3536. LPUDP_SEND_INFO lpSendInfo =NULL;
  3537. SEND_FILE_FRAME SendFileFrame;
  3538. char sendBuff[1024],filename[80],temp[80],search[128];
  3539.     UINT tlen,
  3540.  alen,
  3541.  slen,
  3542.  len;
  3543. int j,status,type;
  3544. HFILE hFile=HFILE_ERROR;
  3545. OFSTRUCT os;
  3546.     WIN32_FIND_DATA FindData;
  3547.     HANDLE hFindFile;
  3548. BOOL fFind;
  3549. lpSendInfo =GlobalLock(hMem);
  3550. if(lpSendInfo ==NULL)
  3551. {
  3552. ErrMsg(ghWndMain, "来自TF_SendFile:目标信息指针为空!");
  3553. goto thread_exit;
  3554. }
  3555.     type =lpSendInfo->filename[0];
  3556. switch(type)
  3557. {
  3558. case FILE_SZ_ALL_MINUTE:
  3559. sprintf(search,"%s\szdata\*.dat",szDataPath);
  3560. break;
  3561. case FILE_SZ_ALL_DAY:
  3562. sprintf(search,"%s\szday\*.day",szDataPath);
  3563. break;
  3564. case FILE_SH_ALL_MINUTE:
  3565. sprintf(search,"%s\shdata\*.dat",szDataPath);
  3566. break;
  3567. case FILE_SH_ALL_DAY:
  3568. sprintf(search,"%s\shday\*.day",szDataPath);
  3569. break;
  3570. }
  3571. hFindFile =FindFirstFile(search,&FindData);
  3572. if(hFindFile!=INVALID_HANDLE_VALUE)
  3573. {
  3574. do
  3575. {
  3576. if(FindData.cFileName[0]>='0'&&FindData.cFileName[0]<='9')
  3577. {
  3578. switch(type)
  3579. {
  3580. case FILE_SZ_ALL_MINUTE:
  3581. sprintf(filename,"%s\szdata\%s",szDataPath,FindData.cFileName);
  3582. break;
  3583. case FILE_SZ_ALL_DAY:
  3584. sprintf(filename,"%s\szday\%s",szDataPath,FindData.cFileName);
  3585. break;
  3586. case FILE_SH_ALL_MINUTE:
  3587. sprintf(filename,"%s\shdata\%s",szDataPath,FindData.cFileName);
  3588. break;
  3589. case FILE_SH_ALL_DAY:
  3590. sprintf(filename,"%s\shday\%s",szDataPath,FindData.cFileName);
  3591. break;
  3592. }
  3593. sprintf(temp,"%s.lzw.%d",filename,lpSendInfo->sd);
  3594. if(ZlibCompressFile(filename,temp))
  3595. hFile =OpenFile(temp, &os, OF_SHARE_DENY_NONE|OF_READ);
  3596. else goto thread_exit;
  3597. if(hFile==HFILE_ERROR)
  3598. {
  3599. ErrMsg(ghWndMain, "来自TF_Send_Day:不能打开文件!");
  3600. goto thread_exit;
  3601. }
  3602. if((tlen=(UINT)_llseek(hFile, 0, FILE_END))==HFILE_ERROR)
  3603. {
  3604. ErrMsg(ghWndMain, "来自TF_SendFile:不能定位到文件尾!");
  3605. goto thread_exit;
  3606. }
  3607. if(_llseek(hFile, 0, FILE_BEGIN)==HFILE_ERROR)
  3608. {
  3609. ErrMsg(ghWndMain, "来自TF_SendFile:不能定位到文件头!");
  3610. goto thread_exit;
  3611. }
  3612. strcpy(SendFileFrame.filename,FindData.cFileName);
  3613. if(tlen<=900)
  3614. {
  3615. SendFileFrame.filelen=tlen;
  3616. strcpy(&sendBuff[0],SEND_FILE_HEAD);
  3617. len =strlen(SEND_FILE_HEAD);
  3618. SendFileFrame.sign =GZ_SING;
  3619. memcpy(&sendBuff[len],&SendFileFrame,sizeof(SEND_FILE_FRAME));
  3620. len+=sizeof(SEND_FILE_FRAME);
  3621. if(_lread(hFile, &sendBuff[len], tlen)
  3622. !=tlen)
  3623. {
  3624. ErrMsg(ghWndMain,"来自TF_SendFile:读文件错!");
  3625. goto thread_exit;
  3626. }
  3627. len+=tlen;
  3628. if(UDP_SendBuff("数据文件", lpSendInfo->sd, sendBuff, len, NULL)<0)
  3629. {
  3630. ErrMsg(ghWndMain,"来自TF_SendFile:发送文件错!");
  3631. goto thread_exit;
  3632. }
  3633. }
  3634. else
  3635. {
  3636. alen=900;
  3637. slen=0;
  3638. for(;;)
  3639. {
  3640. if(tlen-slen>900)
  3641. alen=900;
  3642. else alen=tlen-slen;
  3643. slen+=alen;
  3644. if(slen==tlen)
  3645. SendFileFrame.sign =GZ_OVER;
  3646. if(slen>900&&slen<tlen)
  3647. SendFileFrame.sign =GZ_CONT;
  3648. if(slen<=900)
  3649. SendFileFrame.sign =GZ_STAR;
  3650. SendFileFrame.filelen=alen;
  3651. strcpy(&sendBuff[0],SEND_FILE_HEAD);
  3652. len =strlen(SEND_FILE_HEAD);
  3653. memcpy(&sendBuff[len],&SendFileFrame,sizeof(SEND_FILE_FRAME));
  3654. len+=sizeof(SEND_FILE_FRAME);
  3655. if(_lread(hFile, &sendBuff[len], alen)
  3656. !=alen)
  3657. {
  3658. ErrMsg(ghWndMain,"来自TF_SendFile:读文件错!");
  3659. goto thread_exit;
  3660. }
  3661. len+=alen;
  3662. if(UDP_SendBuff("数据文件", lpSendInfo->sd, sendBuff, len, NULL)<0)
  3663. goto thread_exit;
  3664. if(slen==tlen) break;
  3665. for(j=0;j<250;j++)
  3666. {
  3667. status=check_socket_status(lpSendInfo->sd);
  3668. if(status ==-1||status ==-2)
  3669. goto thread_exit;
  3670. if(status==0) 
  3671. break;
  3672. Sleep(40);
  3673. }
  3674. if(j>=250) goto thread_exit;
  3675. }
  3676. }
  3677. _lclose(hFile);
  3678. unlink(temp);
  3679. }
  3680. fFind =FindNextFile(hFindFile,&FindData);
  3681. if(fFind)
  3682. {
  3683. for(j=0;j<250;j++)
  3684. {
  3685. status=check_socket_status(lpSendInfo->sd);
  3686. if(status ==-1||status ==-2)
  3687. goto thread_exit;
  3688. if(status==0) 
  3689. break;
  3690. Sleep(40);
  3691. }
  3692. if(j>=250) goto thread_exit;
  3693. }
  3694. }while(fFind);
  3695. }
  3696. thread_exit:
  3697. FindClose(hFindFile);
  3698. unlink(temp);
  3699. if(lpSendInfo!=NULL)
  3700. {
  3701. hThrd =lpSendInfo->hThread;
  3702. GlobalUnlock(hMem);
  3703. }
  3704. if(hMem) GlobalFree(hMem);
  3705. if(hThrd !=NULL)
  3706. CloseHandle(hThrd);
  3707. ExitThread(0);
  3708. return 0;
  3709. }
  3710. DWORD WINAPI TF_SendFile(LPVOID hMem)
  3711. {
  3712. HANDLE hThrd =NULL;
  3713. LPUDP_SEND_INFO lpSendInfo =NULL;
  3714. SEND_FILE_FRAME SendFileFrame;
  3715. char sendBuff[1024],filename[80],*ptr,temp[80];
  3716.     UINT tlen,
  3717.  alen,
  3718.  slen,
  3719.  len;
  3720. int j,status;
  3721. HFILE hFile=HFILE_ERROR;
  3722. OFSTRUCT os;
  3723. lpSendInfo =GlobalLock(hMem);
  3724. if(lpSendInfo ==NULL)
  3725. {
  3726. ErrMsg(ghWndMain, "来自TF_SendFile:目标信息指针为空!");
  3727. goto thread_exit;
  3728. }
  3729. strcpy(filename,lpSendInfo->filename);
  3730. if(access(filename,0)!=0)
  3731. goto thread_exit;
  3732. if(lpSendInfo->version==11)
  3733. {
  3734. /*
  3735. 获取压缩文件名
  3736. */
  3737. sprintf(temp,"%s.lzw.%d",filename,lpSendInfo->sd);
  3738. /*
  3739. 压缩文件
  3740. */
  3741. if(CompressFile(filename,temp))
  3742. hFile =OpenFile(temp, &os, OF_SHARE_DENY_NONE|OF_READ);
  3743. else
  3744. lpSendInfo->version=10;
  3745. }
  3746. if(lpSendInfo->version==12)
  3747. {
  3748. sprintf(temp,"%s.lzw.%d",filename,lpSendInfo->sd);
  3749. if(ZlibCompressFile(filename,temp))
  3750. hFile =OpenFile(temp, &os, OF_SHARE_DENY_NONE|OF_READ);
  3751. else lpSendInfo->version=10;
  3752. }
  3753. if(lpSendInfo->version<11)
  3754. hFile =OpenFile(filename, &os, OF_SHARE_DENY_NONE|OF_READ);
  3755. if(hFile==HFILE_ERROR)
  3756. {
  3757. ErrMsg(ghWndMain, "来自TF_SendFile:不能打开文件!");
  3758. goto thread_exit;
  3759. }
  3760. if((tlen=(UINT)_llseek(hFile, 0, FILE_END))==HFILE_ERROR)
  3761. {
  3762. ErrMsg(ghWndMain, "来自TF_SendFile:不能定位到文件尾!");
  3763. goto thread_exit;
  3764. }
  3765. if(_llseek(hFile, 0, FILE_BEGIN)==HFILE_ERROR)
  3766. {
  3767. ErrMsg(ghWndMain, "来自TF_SendFile:不能定位到文件头!");
  3768. goto thread_exit;
  3769. }
  3770. ptr=strrchr(filename,'\');
  3771. strcpy(SendFileFrame.filename,++ptr);
  3772. if(tlen<=900)
  3773. {
  3774. SendFileFrame.filelen=tlen;
  3775. strcpy(&sendBuff[0],SEND_FILE_HEAD);
  3776. len =strlen(SEND_FILE_HEAD);
  3777. if(lpSendInfo->version<11)
  3778. SendFileFrame.sign ='e';
  3779. if(lpSendInfo->version==11)
  3780. SendFileFrame.sign ='f';
  3781. if(lpSendInfo->version>11)
  3782. SendFileFrame.sign =GZ_SING;
  3783. memcpy(&sendBuff[len],&SendFileFrame,sizeof(SEND_FILE_FRAME));
  3784. len+=sizeof(SEND_FILE_FRAME);
  3785. if(_lread(hFile, &sendBuff[len], tlen)
  3786. !=tlen)
  3787. {
  3788. ErrMsg(ghWndMain,"来自TF_SendFile:读文件错!");
  3789. goto thread_exit;
  3790. }
  3791. len+=tlen;
  3792.         if(UDP_SendBuff("数据文件", lpSendInfo->sd, sendBuff, len, NULL)<0)
  3793. {
  3794. ErrMsg(ghWndMain,"来自TF_SendFile:发送文件错!");
  3795. goto thread_exit;
  3796. }
  3797. }
  3798. else
  3799. {
  3800. alen=900;
  3801. slen=0;
  3802. for(;;)
  3803. {
  3804. if(tlen-slen>900)
  3805. alen=900;
  3806. else
  3807. alen=tlen-slen;
  3808. slen+=alen;
  3809. if(slen==tlen)
  3810. {
  3811. if(lpSendInfo->version<11)
  3812. SendFileFrame.sign ='E';
  3813. if(lpSendInfo->version==11)
  3814. SendFileFrame.sign ='F';
  3815. if(lpSendInfo->version>11)
  3816. SendFileFrame.sign =GZ_OVER;
  3817. }
  3818. if(slen>900&&slen<tlen)
  3819. {
  3820. if(lpSendInfo->version>11)
  3821. SendFileFrame.sign =GZ_CONT;
  3822. else
  3823. SendFileFrame.sign ='S';
  3824. }
  3825. if(slen<=900)
  3826. {
  3827. if(lpSendInfo->version>11)
  3828. SendFileFrame.sign =GZ_STAR;
  3829. else
  3830. SendFileFrame.sign ='B';
  3831. }
  3832. SendFileFrame.filelen=alen;
  3833. strcpy(&sendBuff[0],SEND_FILE_HEAD);
  3834. len =strlen(SEND_FILE_HEAD);
  3835. memcpy(&sendBuff[len],&SendFileFrame,sizeof(SEND_FILE_FRAME));
  3836. len+=sizeof(SEND_FILE_FRAME);
  3837. if(_lread(hFile, &sendBuff[len], alen)
  3838. !=alen)
  3839. {
  3840. ErrMsg(ghWndMain,"来自TF_SendFile:读文件错!");
  3841. goto thread_exit;
  3842. }
  3843. len+=alen;
  3844. if(UDP_SendBuff("数据文件", lpSendInfo->sd, sendBuff, len, NULL)<0)
  3845. goto thread_exit;
  3846. if(slen==tlen) break;
  3847. for(j=0;j<200;j++)
  3848. {
  3849. status=check_socket_status(lpSendInfo->sd);
  3850. if(status ==-1||status ==-2)
  3851. goto thread_exit;
  3852. if(status==0) 
  3853. break;
  3854. Sleep(40);
  3855. }
  3856. if(j>=200) goto thread_exit;
  3857. if(FileTranLock)
  3858. {
  3859. SendMsg(lpSendInfo->sd,"系统正在初始化,请稍侯");
  3860. goto thread_exit;
  3861. }
  3862. }
  3863. }
  3864. thread_exit:
  3865. if(hFile!=HFILE_ERROR)
  3866. _lclose(hFile);
  3867. if(lpSendInfo->version>10)
  3868. unlink(temp);
  3869. if(lpSendInfo!=NULL)
  3870. {
  3871. hThrd =lpSendInfo->hThread;
  3872. GlobalUnlock(hMem);
  3873. }
  3874. if(hMem) GlobalFree(hMem);
  3875. if(hThrd !=NULL)
  3876. CloseHandle(hThrd);
  3877. ExitThread(0);
  3878. return 0;
  3879. }
  3880. BOOL CreateSendThread(int sd, char *filename,BYTE type)
  3881. {
  3882.  HANDLE hMem=0;
  3883.  LPUDP_SEND_INFO lpSendInfo;
  3884.  HANDLE hThrd;
  3885.  LONG lThreadId;
  3886.  DEST_INFO *lpDestInfo;
  3887. hMem =GlobalAlloc(GHND, sizeof(UDP_SEND_INFO));
  3888. if(hMem ==NULL)
  3889. {
  3890. ErrMsg(ghWndMain, "来自SendFile:不能分配发送缓冲区!");
  3891. return -1;
  3892. }
  3893. lpSendInfo =(LPUDP_SEND_INFO)GlobalLock(hMem);
  3894. if(lpSendInfo ==NULL)
  3895. {
  3896. ErrMsg(ghWndMain, "来自SendFile:不能锁定发送缓冲区!");
  3897. GlobalFree(hMem);
  3898. return -1;
  3899. }
  3900. lpSendInfo->sd =sd;
  3901. lpDestInfo =GetDestBySd(sd);
  3902. if(lpDestInfo!=NULL)
  3903. lpSendInfo->version =lpDestInfo->version;
  3904. else
  3905. lpSendInfo->version =10;
  3906. if(type ==FILE_WINPY)
  3907. lpSendInfo->version =12;
  3908.     lpSendInfo->lpDestInfo =lpDestInfo;
  3909. //    strcpy(lpSendInfo->filename,filename);
  3910. if(type >=FILE_SZ_ALL_MINUTE && type <=FILE_SH_ALL_DAY)
  3911. {
  3912. lpSendInfo->filename[0] =type;
  3913. hThrd =CreateThread(NULL, 200*1024,
  3914. (LPTHREAD_START_ROUTINE)TF_Send_DownLoad,
  3915. (LPVOID)hMem, CREATE_SUSPENDED, (LPDWORD)&lThreadId);
  3916. }
  3917. else
  3918. {
  3919. strcpy(lpSendInfo->filename,filename);
  3920. hThrd =CreateThread(NULL, 200*1024,
  3921. (LPTHREAD_START_ROUTINE)TF_SendFile,
  3922. (LPVOID)hMem, CREATE_SUSPENDED, (LPDWORD)&lThreadId);
  3923. }
  3924. if(!hThrd)
  3925. {
  3926. GlobalUnlock(hMem);
  3927. GlobalFree(hMem);
  3928. ErrMsg(ghWndMain, "来自SendFile:不能建立线程!");
  3929. }
  3930. else
  3931. {
  3932. lpSendInfo->hThread =hThrd;
  3933. GlobalUnlock(hMem);
  3934. SetThreadPriority(hThrd, THREAD_PRIORITY_NORMAL);
  3935. ResumeThread(hThrd);
  3936. }
  3937. return 0;
  3938. }
  3939. int UDP_Send_File(int sd,STOCK_INFO_FRAME *FileInfo)
  3940. {
  3941. HFILE hFile;
  3942. OFSTRUCT os;
  3943. char temp[80];
  3944. FileInfo->gpdm[MAX_FILE_NAME_SIZE-1]=0;
  3945. if(FileInfo->type == FILE_STOCK_INFO)
  3946. {
  3947. sprintf(temp,"%s\ggxx\%s",szDataPath,FileInfo->gpdm);
  3948. if(strchr(temp,'.') ==NULL)
  3949. strcat(temp,".txt");
  3950. if(access(temp,0)!=0)
  3951. {
  3952. hFile=OpenFile(temp,&os,OF_CREATE|OF_WRITE);
  3953. if(hFile==HFILE_ERROR)
  3954. return -1;
  3955. if(_lwrite(hFile,"无此个股信息 ",13)!=13)
  3956. {
  3957. _lclose(hFile);
  3958. return -1;
  3959. }
  3960. _lclose(hFile);
  3961. }
  3962. }
  3963.      
  3964. if(FileInfo->type == FILE_LIST_DIR)
  3965. {
  3966. if(szNewsPath[0]!=0 &&szNewsSrc[0]!=0)
  3967. {
  3968. if(FileInfo->gpdm[0] ==0)
  3969. sprintf(temp,"%s\news.idx",szDataPath);
  3970. else
  3971. sprintf(temp,"%s\%s",szDataPath,FileInfo->gpdm);
  3972. }
  3973. else return 0;
  3974. }
  3975. if(FileInfo->type ==FILE_NORMAL)  //FILE_NEWS_FILE
  3976. {
  3977. if(FileTranLock)
  3978. {
  3979. SendMsg(sd,"系统正在初始化,请稍侯");
  3980. return 0;
  3981. }
  3982. else
  3983. sprintf(temp,"%s\%s",szNewsPath,FileInfo->gpdm);
  3984. }
  3985. if(FileInfo->type ==FILE_WINPY)
  3986. sprintf(temp,"%s\sys\%s",szDataPath,FileInfo->gpdm);
  3987. CreateSendThread(sd,temp,(BYTE)FileInfo->type);
  3988. return 0;
  3989. }