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

金融证券系统

开发平台:

Visual C++

  1. #include <windows.h>
  2. #include <string.h>
  3. #include <time.h>
  4. #include <winsock.h>
  5. #include "pctcp.h"
  6. #include "hq.h"
  7. #include "jy_cl.h"
  8. #include "caption.h"
  9. #include "des.h"
  10. #include "rsa.h"
  11. #include "msg.h"
  12. BOOL udpread_stop =TRUE;
  13. extern BOOL gfOnLine,gfConnecting;
  14. extern JY_ANS_CHKUSR ChkUsrRes;
  15. extern ZQSXX Qsxx;
  16. extern BOOL ErrMsg(HWND, LPSTR);
  17. extern HWND ghWndMain, ghDlgJy;
  18. extern BOOL run_cancelled;
  19. extern int sdJy;    
  20. extern BOOL IsSzRead,IsShRead;
  21. char  *JyReadBuf; //[MAX_READ_BUF_SIZE+1];  
  22. uchar DesKey[9];
  23. int UDP_Client_ReadJy(void);
  24. extern LPSTR GetError(LPSTR);
  25. LPVOID lpCurJyData =NULL, lpCurJyRes =NULL, lpCurJyHead =NULL;
  26. int curJyDataSize =0, curJyHead =0, curJyResSize =0;
  27. BOOL fIsJyCx =FALSE;
  28. HINSTANCE hDesDll=NULL;
  29. lpfnDES_INIT far pascal desinit=NULL;
  30. lpfnDES_ECB far pascal ecbencode=NULL;
  31. int UDP_Client_JySend(LPSTR, LPVOID, int, LPVOID, int);
  32. int UDP_Jy_ChkUsr(LPJY_ASK_CHKUSR lpChkUsrData, LPJY_ANS_CHKUSR lpChkUsrRes)
  33. {
  34. fIsJyCx =FALSE;
  35. return UDP_Client_JySend(JY_CHKUSR_HEAD, lpChkUsrData, sizeof(JY_ASK_CHKUSR),
  36. lpChkUsrRes, sizeof(JY_ANS_CHKUSR));
  37. }
  38. int UDP_Jy_ChgPwd(LPJY_ASK_CHGPWD lpChgPwdData, LPJY_ANS_CHGPWD lpChgPwdRes)
  39. {
  40. fIsJyCx =FALSE;
  41. return UDP_Client_JySend(JY_CHGPWD_HEAD, lpChgPwdData, sizeof(JY_ASK_CHGPWD),
  42. lpChgPwdRes, sizeof(JY_ANS_CHGPWD));
  43. }
  44. int UDP_Jy_BuySell(LPJY_ASK_BUYSELL lpBuySellData, LPJY_ANS_BUYSELL lpBuySellRes)
  45. {
  46. fIsJyCx =FALSE;
  47. return UDP_Client_JySend(JY_BUYSELL_HEAD, lpBuySellData, sizeof(JY_ASK_BUYSELL),
  48. lpBuySellRes, sizeof(JY_ANS_BUYSELL));
  49. }
  50. int UDP_Jy_Cancel(LPJY_ASK_CANCEL lpCancelData, LPJY_ANS_CANCEL lpCancelRes)
  51. {
  52. fIsJyCx =FALSE;
  53. return UDP_Client_JySend(JY_CANCEL_HEAD, lpCancelData, sizeof(JY_ASK_CANCEL),
  54. lpCancelRes, sizeof(JY_ANS_CANCEL));
  55. }
  56. int UDP_Jy_Wtcx(LPJY_ASK_WTCX lpWtcxData, LPJY_ANS_WTCX lpWtcxRes)
  57. {
  58. fIsJyCx =TRUE;
  59. return UDP_Client_JySend(JY_WTCX_HEAD, lpWtcxData, sizeof(JY_ASK_WTCX),
  60. (LPVOID)lpWtcxRes, sizeof(JY_ANS_WTCX));
  61. }
  62. int UDP_Jy_Cjcx(LPJY_ASK_CJCX lpCjcxData, LPJY_ANS_CJCX lpCjcxRes)
  63. {
  64. fIsJyCx =TRUE;
  65. return UDP_Client_JySend(JY_CJCX_HEAD, (LPVOID)lpCjcxData, sizeof(JY_ASK_CJCX),
  66. (LPVOID)lpCjcxRes, sizeof(JY_ANS_CJCX));
  67. }
  68. int UDP_Jy_Yecx(LPJY_ASK_YECX lpYecxData, LPJY_ANS_YECX lpYecxRes)
  69. {
  70. fIsJyCx =TRUE;
  71. return UDP_Client_JySend(JY_YECX_HEAD, (LPVOID)lpYecxData, sizeof(JY_ASK_YECX),
  72. lpYecxRes, sizeof(JY_ANS_YECX));
  73. }
  74. char en[43]={'A','=','U','X','Z','E','R','P','4','W','5','S','Q','B','7','O',
  75.      '<','1','V','Y','?','0','L','N','T','@','6','F','C','9','D','G',
  76.  '>',';','H','3','J','K',':','2','I','M','8'};
  77. int gn_jy_num =0;
  78. #define  DATA_START_SIGN -16
  79. int UDP_Client_JySend(LPSTR lpHead, LPVOID lpData, int DataSize, LPVOID lpRes, int ResSize)
  80. {
  81. int len,i= 0,x,tlen;
  82. char JyWriteBuf[MAX_WRITE_BUF_SIZE+1],temp[100];
  83.     static uchar * b;
  84.     
  85. if(HqTime[*(char *)lpData].fRunning ==FALSE)
  86. {
  87. ErrMsg(ghDlgJy, "已经收市!");
  88. return 0;
  89. }
  90. if(!gfOnLine||gfConnecting) return 0;
  91. udpread_stop =FALSE;
  92. lpCurJyData =NULL;
  93. lpCurJyRes =NULL;
  94. lpCurJyHead =NULL;
  95. curJyDataSize =0;
  96. curJyResSize =0;
  97.  
  98. memset(&JyWriteBuf[0], 0,sizeof(JyWriteBuf));
  99. JyWriteBuf[0]=DATA_START_SIGN;
  100. len=1+sizeof(int);
  101. strcpy(&JyWriteBuf[len], lpHead);
  102. len += strlen(lpHead);
  103. gn_jy_num ++;
  104. *(short *)&JyWriteBuf[len] =gn_jy_num;
  105. len +=sizeof(short);
  106. memcpy(&JyWriteBuf[len], lpData, DataSize);
  107. len +=DataSize;
  108.     
  109.     *(int*)&JyWriteBuf[1]= len - 1 - sizeof(int);
  110.     
  111.     if(hDesDll!=NULL)
  112.     {
  113.    desinit(DesKey);
  114.    for(b=&JyWriteBuf[3],i=len-3;i>0;i-=8,b+=8)
  115.    {
  116.    if(i<8) break;
  117.    ecbencode(b,b);
  118.    }
  119.    }
  120.   
  121.    if(hDesDll!=NULL &&RsaOk &&
  122.    strncmp(lpHead,JY_CHKUSR_HEAD,strlen(JY_CHKUSR_HEAD)) ==0)
  123.    {
  124.    memset(temp,0,100);
  125.    BytToStr(RsaKey,temp);
  126.    memcpy(&JyWriteBuf[len],temp,100);
  127.    len +=100;
  128.    memcpy(&JyWriteBuf[len],"RSAKEY",6);
  129.    len +=6;
  130.    *(int*)&JyWriteBuf[1]= len - 1 - sizeof(int);
  131.    }
  132.   
  133. for(i=1+sizeof(int);i<len;i++)
  134. {
  135. if(JyWriteBuf[i]>='0'&&JyWriteBuf[i]<='Z')
  136. {
  137. JyWriteBuf[i]=en[JyWriteBuf[i]-'0'];
  138. }
  139. }
  140.    tlen = len;
  141. for(x=0;;)
  142. {
  143.     DrawTime(1);
  144. len = send(sdJy,&JyWriteBuf[x], tlen -x, 0);
  145. if (len == SOCKET_ERROR)
  146. {
  147. if ((len =h_errno) == WSAEWOULDBLOCK)
  148. {
  149. DrawTime(YELLOW_SIGN);
  150. continue;
  151. }
  152. else if(len !=WSAENETRESET)
  153. {
  154. ErrMsg(ghDlgJy, GetError("translate jy"));
  155. DrawTime(RED_SIGN);
  156. return(-1);
  157. }
  158. }
  159. if(x+len !=tlen)
  160. x+=len;
  161. else
  162. break;
  163. }
  164. lpCurJyData =lpData;
  165. lpCurJyRes =lpRes;
  166. lpCurJyHead =lpHead;
  167. curJyDataSize =DataSize;
  168. curJyResSize =ResSize;
  169. *(char *)lpCurJyRes =ANS_UNKOWN;
  170. DrawTime(0);
  171. return len;
  172. }
  173. #define DATA_HEAD_SIZE 3
  174. char JydataHead[DATA_HEAD_SIZE+1];
  175. int  JyHeadPrt=0,JydataPrt=0 ;
  176. int AnaJyRecvData(void)
  177. {
  178.   int prt,len,try_times,dataNum;
  179.   char temp[MAX_READ_BUF_SIZE+1];  
  180.    prt=len=try_times=dataNum=0;
  181.    
  182. retry_read:
  183. if(try_times ++>10)
  184. {
  185. ErrMsg(ghDlgJy, "recv error");
  186. return -1;
  187. }
  188. memset((char *)&temp[0],0,MAX_READ_BUF_SIZE*sizeof(char));
  189.    DrawTime(1);
  190. len = recv(sdJy,(char *)&temp[0],MAX_READ_BUF_SIZE*sizeof(char),0);
  191. if (len == SOCKET_ERROR) 
  192. {
  193. if (h_errno == WSAEWOULDBLOCK)
  194. goto retry_read;
  195. else
  196. {
  197. ErrMsg(ghDlgJy, GetError("recv cancel error"));
  198. if(ConnectHost(0, -1)<0)
  199. {
  200. ErrMsg(ghDlgJy, "Reconnect failed");
  201. DrawTime(2);
  202. return -1;
  203. }
  204. }
  205. }
  206. if(len <=0)
  207. {   
  208. DrawTime(2);
  209.   return -1;
  210.     }
  211.     if(len>4)
  212.     {        
  213.      if(temp[0]==DATA_START_SIGN && JyHeadPrt!=0 && temp[3]>='A' && temp[3]<='Z')
  214.      {
  215.       JydataPrt=0; 
  216.       JyHeadPrt=0;
  217.      }
  218.     }        
  219.     while(prt<len)
  220.     {
  221.       if(JyHeadPrt<DATA_HEAD_SIZE)
  222.       {
  223.       if(JyHeadPrt==0)
  224.       {
  225.       if(temp[prt]!=DATA_START_SIGN)
  226.       {
  227.       prt++;
  228.       DrawTime(2);
  229.       continue;
  230.       }     
  231.       else
  232.       {
  233.       DrawTime(1);     
  234.           JydataHead[JyHeadPrt]=temp[prt];
  235.           JyHeadPrt++;
  236.       prt++;
  237.       }
  238.       }
  239.       if(prt>=len)
  240.       {
  241.       DrawTime(2);     
  242.       return 0;
  243.       }
  244.       if(DATA_HEAD_SIZE - JyHeadPrt >len-prt)
  245.       {
  246.       memcpy((char*)&JydataHead[JyHeadPrt],(char*)&temp[prt],len-prt);
  247.       JyHeadPrt+=len-prt;
  248.       DrawTime(2);
  249.       return 0;
  250.       }
  251.       else
  252.       {
  253.       memcpy((char*)&JydataHead[JyHeadPrt],(char*)&temp[prt],DATA_HEAD_SIZE - JyHeadPrt);
  254.       prt+=DATA_HEAD_SIZE - JyHeadPrt;
  255.       JyHeadPrt=DATA_HEAD_SIZE;
  256.       }
  257.      
  258.       }
  259.      
  260.       if(prt>=len)
  261.       {
  262.           DrawTime(2);
  263.       return 0;
  264.       }
  265.       dataNum=*(int *)&JydataHead[1];
  266.       if(dataNum<=0)
  267.       {
  268. MessageBeep(0);     
  269. DrawTime(2);
  270.       return -1;
  271.       }
  272.       if(dataNum-JydataPrt  > len - prt)
  273.       {
  274.       memcpy((char FAR *)&JyReadBuf[JydataPrt],(char*)&temp[prt],len-prt);
  275.       JydataPrt+=len-prt;
  276.       DrawTime(2);     
  277.       return 0;
  278.       }
  279.       else
  280.       {
  281.       memcpy((char FAR *)&JyReadBuf[JydataPrt],(char*)&temp[prt],dataNum-JydataPrt);
  282.       prt+=dataNum-JydataPrt;
  283.       JydataPrt=dataNum;
  284.       UDP_Client_ReadJy();
  285.       JydataPrt=0; 
  286.       JyHeadPrt=0;
  287.       dataNum=0;
  288.       }
  289.      
  290.       if(prt>=len)
  291.       {   
  292.       DrawTime(0);     
  293.       return 0;     
  294.       }
  295.     }
  296.     DrawTime(0);     
  297.     return 0;    
  298.     
  299. }
  300. int UDP_Client_ReadJy(void)
  301. {
  302. int len, jy_num;
  303. LPSTR lpTmp;
  304. int retry_times =0;
  305. lpTmp =&JyReadBuf[0];
  306. if(!strnicmp(JY_ZQSXX_HEAD,lpTmp,sizeof(JY_ZQSXX_HEAD)))
  307. {
  308. lpTmp +=strlen(JY_ZQSXX_HEAD);
  309. //memset(&Qsxx, 0, sizeof(ZQSXX));
  310. //memcpy(&Qsxx,lpTmp,sizeof(ZQSXX));
  311. if(*(lpTmp+DATALENGTH -1) !=0)
  312. {   
  313. Msg("正在初始化交易加密参数,请您稍候...",MSG_VERT);
  314. gfConnecting =TRUE;
  315. WriteRsaPk(JyQs,lpTmp,lpTmp+DATALENGTH);
  316. EncipherDesKey(DesKey,lpTmp,lpTmp+DATALENGTH,RsaKey);
  317. WriteRsaCiper(JyQs,RsaKey,DesKey);
  318. RsaOk =1;
  319. DispQsName(JyQs,RsaOk);
  320. Msg("",MSG_HIDE);
  321. gfConnecting =FALSE;
  322. }
  323. else
  324. RsaOk =0;
  325. return 0;
  326. }
  327. len=JydataPrt;
  328. if(len ==0) return -1;
  329. if(lpCurJyData ==NULL) return -1;
  330. if(strnicmp(lpCurJyHead, lpTmp, strlen(lpCurJyHead)))
  331. {
  332. MessageBeep(0);
  333. return -1;
  334. }
  335. lpTmp +=strlen(lpCurJyHead);
  336. len -=strlen(lpCurJyHead);
  337. jy_num =*(short *)lpTmp;
  338. lpTmp +=sizeof(short);
  339. len -=sizeof(short);
  340. if(jy_num !=gn_jy_num) return -1;
  341. if(len ==1)
  342. {
  343. *(char *)lpCurJyRes =*lpTmp;    //cx_end, sys_err, time_out, other ret_err...
  344. goto read_ok;
  345. }
  346. if(!fIsJyCx && len !=curJyResSize)
  347. {
  348. MessageBeep(0);
  349. return -1;
  350. }
  351. memcpy(lpCurJyRes, lpTmp, curJyResSize);
  352. read_ok:
  353. if(fIsJyCx)
  354. SendMessage(ghDlgJy, WM_JYCX_RES, 0, 0L);
  355. else
  356. SendMessage(ghDlgJy, WM_JY_RES, 0, 0L);
  357. return 0;
  358. }
  359. void SendJyExit(char *lpgddm)
  360. {
  361. char SendBuff[100];
  362. int i, len,x,tlen;
  363. memset(&SendBuff[0],0,sizeof(SendBuff));
  364. SendBuff[0]=DATA_START_SIGN;
  365. len = 1 + sizeof(int );
  366. memcpy(&SendBuff[len], JY_EXIT,strlen(JY_EXIT));
  367. len += strlen(JY_EXIT);
  368. memcpy(&SendBuff[len], lpgddm ,strlen(lpgddm));
  369. len +=strlen(lpgddm);
  370. SendBuff[len++] =0;
  371. SendBuff[len] =0;
  372. *(int *)&SendBuff[1] = len -1 -sizeof(int );
  373.     len= len -1 - sizeof( int );
  374.     
  375.     for(i=0;i<len;i++)
  376.     {
  377. if(SendBuff[i+1+sizeof(int)]>='0'&&SendBuff[i+1+sizeof(int)]<='Z')
  378. {
  379.      SendBuff[i+1+sizeof(int)]=en[SendBuff[i+1+sizeof(int)]-'0'];
  380. }
  381.     }
  382. len = len +1 + sizeof(int);
  383. DrawTime(1);
  384. tlen =len;
  385. for(x=0;;)
  386. {
  387. len =send(sdJy, &SendBuff[x], tlen -x, 0);
  388. if (len == SOCKET_ERROR)
  389. {
  390. if (h_errno == WSAEWOULDBLOCK)
  391. continue;
  392. else 
  393. return;
  394. }
  395. if(x+len !=tlen)
  396. x+=len;
  397. else
  398. break;
  399. }
  400. DrawTime(0);     
  401. }
  402. void SendJyQsxx(void)
  403. {
  404. char SendBuff[100];
  405. int i, len ,tlen,x;
  406. memset(&SendBuff[0],0,sizeof(SendBuff));
  407. SendBuff[0]=DATA_START_SIGN;
  408. len = 1 + sizeof(int );
  409. memcpy(&SendBuff[len], JY_ZQSXX_HEAD,strlen(JY_ZQSXX_HEAD));
  410. len += strlen(JY_ZQSXX_HEAD);
  411. SendBuff[len] =0;
  412. *(int *)&SendBuff[1] = len -1 -sizeof(int );
  413.     len= len -1 - sizeof( int );    
  414.     for(i=0;i<len;i++)
  415.     {
  416. if(SendBuff[i+1+sizeof(int)]>='0'&&SendBuff[i+1+sizeof(int)]<='Z')
  417. {
  418.      SendBuff[i+1+sizeof(int)]=en[SendBuff[i+1+sizeof(int)]-'0'];
  419. }
  420.     }
  421. len = len +1 + sizeof(int);
  422. DrawTime(1);     
  423. tlen =len;
  424. for(x =0;;)
  425. {
  426. len =send(sdJy, &SendBuff[x],tlen -x, 0);
  427. if (len == SOCKET_ERROR)
  428. {
  429. if (h_errno == WSAEWOULDBLOCK)
  430. continue;
  431. else 
  432. return;
  433. }
  434. if(len+x!=tlen)
  435. x+=len;
  436. else
  437. break;
  438. }
  439. DrawTime(0);     
  440. }