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

金融证券系统

开发平台:

Visual C++

  1. #include <windows.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <time.h>
  5. #include <malloc.h>
  6. #include "hq.h"
  7. #include "pctcp.h"
  8. HLOCAL hWSAData;
  9. int ret;
  10. int sdHq =-1;
  11. int PROTO_USE =PROTO_TCP;
  12. BOOL fInTransing =FALSE;
  13. #define WSA_MAKEWORD(x,y)       ((y) * 256 + (x))
  14. extern BOOL run_cancelled;
  15. LPSTR GetError(LPSTR err_prefix);
  16. char HostName[40];
  17. FILE *fp =NULL;
  18. extern BOOL GetInitString(LPSTR, LPSTR, LPSTR);
  19. extern void PutInitString(LPSTR, LPSTR, LPSTR);
  20. extern BOOL ErrMsg(HWND, LPSTR);
  21. extern HWND ghWndMain;
  22. extern HINSTANCE ghInstance;
  23. extern HWND ghWndXlt, ghWndJlt, ghWndMaxMin;
  24. extern HWND ghDlgJy;
  25. //int PROTO_USE =PROTO_UDP;
  26. void WriteMsg(LPSTR msg)
  27. {                
  28. if(fp) fputs(msg, fp);
  29. }
  30. int PCTCPInit(void)
  31. {
  32. WORD VersionReqd;        
  33. WSADATA myWSAData;
  34.                       
  35.     char tmp[80];
  36.     
  37. VersionReqd=WSA_MAKEWORD(MAJOR_VERSION, MINOR_VERSION);
  38. hWSAData =LocalAlloc(LHND, sizeof(WSADATA));
  39. ret = WSAStartup(VersionReqd, &myWSAData);
  40.     
  41. sdHq =-1;
  42. if (ret != 0)
  43. {
  44. ErrMsg(NULL, GetError("WSAStartup()")); 
  45. return -1;
  46. }        
  47.      
  48. if(!GetInitString("NET", "HOST", HostName))
  49. {
  50. ErrMsg(NULL, "Not find HOST set in [NET] of init file");
  51. PutInitString("NET", "HOST", "172.20.1.1");
  52. return -1;
  53. }
  54.     if(GetInitString("NET","PROTO_USE",tmp))
  55.     {
  56.         if(tmp[0]=='U' || tmp[0]=='u')
  57.             PROTO_USE =PROTO_UDP;
  58.         else
  59.             PROTO_USE =PROTO_TCP;
  60.     }
  61.     else
  62.         PutInitString("NET","PROTO_USE","TCP");
  63. return 0;
  64. }
  65. int PCTCPClose(void)
  66. {
  67. int ret;
  68. run_cancelled =TRUE;
  69. WSACancelBlockingCall();
  70. if(sdHq !=-1)
  71. {
  72. closesocket(sdHq);
  73. sdHq =-1;
  74.     }
  75. ret = WSACleanup();
  76. if (ret == SOCKET_ERROR && h_errno == WSAEINPROGRESS)
  77. {
  78. //ErrMsg(NULL, "Data transfer in progress.nStop transfer first.");
  79. return -1;
  80. }
  81. return 0;
  82. }
  83. int PCTCPExit(void)
  84. {
  85. static BOOL fExit =FALSE;
  86. if(fExit ==TRUE) return 0;
  87. fExit =TRUE;
  88. PCTCPClose();
  89. LocalUnlock(hWSAData);
  90. LocalFree(hWSAData);
  91. if(fp) fclose(fp);
  92. return 0;
  93. }
  94. // used for client
  95. int ConnectHost(void)
  96. {
  97. LPSTR lpHostName;
  98. struct  hostent FAR *hp;
  99. struct  sockaddr_in server_addr;
  100.     //SOCKET  hSock;
  101.     int hSock,i;
  102. int iSockType;
  103. long lret;
  104. static BOOL fFirst =TRUE;
  105. if(fFirst ==FALSE)
  106. {
  107. if(sdHq !=-1)
  108. {
  109. closesocket(sdHq);
  110. sdHq =-1;
  111. }
  112. }
  113. if(fFirst ==TRUE) fFirst =FALSE;
  114. lpHostName =&HostName[0];
  115. memset(&server_addr, 0, sizeof(server_addr));
  116. server_addr.sin_addr.s_addr =(u_long)inet_addr(lpHostName);
  117. if (server_addr.sin_addr.s_addr == (u_long) -1L || 
  118. server_addr.sin_addr.s_addr == 0) 
  119. {
  120. if ((hp = gethostbyname(lpHostName)) == NULL) 
  121. {
  122. //ErrMsg(NULL, "rpcinfo: server address is unknown");
  123. return -1;
  124. }
  125. _fmemcpy((char *)&server_addr.sin_addr, hp->h_addr, hp->h_length);
  126. }
  127. server_addr.sin_family = PF_INET;
  128. if (PROTO_USE == PROTO_TCP)
  129. iSockType = SOCK_STREAM;
  130. else
  131. iSockType = SOCK_DGRAM;
  132.     
  133. server_addr.sin_port = htons((u_int) PORT_HQ);
  134.     
  135. hSock = socket(PF_INET, iSockType, 0);
  136. if (hSock == INVALID_SOCKET)
  137. {
  138. ErrMsg(NULL, "socket() failed");
  139. return (SOCKET) -1;
  140. }
  141.     
  142. lret = 1L;
  143.     ioctlsocket(hSock, FIONBIO, (u_long FAR *) &lret);
  144.     i=0;
  145.     do
  146.     {
  147.         ret=connect(hSock,(struct sockaddr FAR *)&server_addr,sizeof(server_addr));
  148.     }while(ret ==SOCKET_ERROR && i++<9000);
  149. sdHq =hSock;
  150. return hSock;
  151. }
  152. int PASCAL FAR WSAsperror(int errorcode, char far * buf, int len)
  153. {
  154. int err_len;
  155.     
  156. if (errorcode == 0)
  157. errorcode = WSABASEERR;
  158. if (errorcode < WSABASEERR)
  159. return 0;
  160.     
  161. err_len = LoadString(ghInstance,errorcode,buf,len);
  162. return err_len;
  163. }
  164. LPSTR GetError(LPSTR err_prefix)
  165. {
  166. int wsa_err;
  167. char errbuf[1000];
  168. char prbuf[1000];
  169. wsa_err =WSAGetLastError(); 
  170. WSAsperror(wsa_err, (LPSTR)errbuf, sizeof(errbuf));
  171.     
  172. wsprintf((LPSTR)prbuf, "%s:n%s", (LPSTR) err_prefix, (LPSTR)errbuf);
  173. return &prbuf[0];  
  174. }
  175. #define  DATA_START_SIGN -16
  176. extern int Skip;
  177. int UDP_SendBuff(int sd, LPSTR SendBuf, int len)
  178. {
  179. int i, e;
  180. char  far *WriteBuf;
  181. static skip=0;
  182. if(Skip>0)
  183. {
  184. skip++;
  185. if(skip<Skip)
  186. return len;
  187.    else
  188.        skip=0;
  189. }
  190. WriteBuf=_fmalloc((len+10) *sizeof(char ));
  191. if(WriteBuf==NULL)
  192. {
  193. ErrMsg(NULL,"Alloc mem err!");
  194. return  -1;
  195. }
  196. memset(&WriteBuf[0],0,sizeof(WriteBuf));
  197. WriteBuf[0]=DATA_START_SIGN;
  198. *(int *)&WriteBuf[1]=len;
  199. memcpy(&WriteBuf[1+sizeof(int)],SendBuf,len);
  200. for(i =0; i<10; i++)
  201. {
  202. len = send(sdHq, &WriteBuf[0], len +1 +sizeof(int), 0);
  203. if (len == SOCKET_ERROR)
  204. {
  205. if ((e =h_errno) == WSAEWOULDBLOCK)
  206. continue;
  207. else if(e !=WSAENETRESET)
  208. {
  209. MessageBeep(0);
  210. if(ConnectHost() <0) return -1;
  211. }
  212. else
  213. {
  214. //ErrMsg(NULL, "UDP_SendBuff failed");
  215. return -1;
  216. }
  217. }
  218. break;
  219. }
  220. _ffree(WriteBuf);
  221. return i;
  222. }