📄 sv_tcp.c
字号:
#include <windows.h>#include <windowsx.h>#include <stdio.h>#include <string.h>#include <time.h>#include "resource.h"#include "main.h"#include "pctcp.h"#include "hq.h"#include "sv_hq.h"#include "hqdest.h"#include "jydest.h"#include "sv_jy.h"#include "sv_tcp.h"#include "monitor.h"#include "lzw.h"#include "rsa.h"#include "zlib.h"extern BOOL fUseJy, gfUseThrd;int sdHq =-1, sdJy =-1;extern HFILE hfZx;#define WSA_MAKEWORD(x,y) ((y) * 256 + (x))int PROTO_USE =PROTO_TCP;BOOL gfReadData =FALSE;BOOL running =FALSE, run_cancelled =FALSE;BOOL FileTranLock=FALSE;extern MONITOR Monitor;extern char ZxDataFile[128], szDataPath[128],HqDataPath[128];extern char szNewsPath[128],szNewsSrc[128];extern int check_socket_status(int sd);FILE *fp;int gnDestCount =0;long TF_SendBuff(HANDLE phMem);BOOL IsZsRec(int, short);extern int Jy_SendRet(int sd, char, char, int);extern void JyDest_Exit(int sd);JUNK_PACK JunkPack[MAX_JUNK_PACK_COUNT];typedef unsigned char uchar;typedef int (CALLBACK* lpfnDES_INIT)(uchar *);typedef int (CALLBACK* lpfnDES_ECB3)(uchar *,uchar *);HINSTANCE hDesDll;lpfnDES_INIT desinit;lpfnDES_ECB3 ecbdecode;void WriteMsg(LPSTR msg){ if(fp) fputs(msg, fp);}BOOL fPctcpInited =FALSE;int PCTCPInit(void){ int ret; WSADATA WSAData; fPctcpInited =TRUE; ret = WSAStartup(0x0101, &WSAData); sdHq =sdJy =-1; if (ret != 0) { ErrMsg(ghWndMain, GetError("来自WSAStartup()")); return -1; } return 0;}int PCTCPClose(void){ static BOOL fClosed =FALSE; int ret; if(!fPctcpInited) return 0; if(fClosed ==TRUE) return 0; fClosed =TRUE; WSACancelBlockingCall(); if(sdHq !=-1) { closesocket(sdHq); sdHq =-1; } if(sdJy !=-1) { closesocket(sdJy); sdJy =-1; } ret = WSACleanup(); if (ret == SOCKET_ERROR && h_errno == WSAEINPROGRESS) { return -1; } return 0;} int PCTCPExit(void){ static BOOL fExit =FALSE; if(fExit ==TRUE) return 0; fExit =TRUE; PCTCPClose(); if(fp) fclose(fp); return 0;}BOOL can_read =TRUE;int PCTCPStop(void){ run_cancelled =TRUE; can_read =FALSE; return 0;}void PCTCPPause(BOOL fPause){ can_read =!fPause;} //// used for server or broadcast clientint BindSocket(HWND hWnd){ struct sockaddr_in local; int iSockType; int ret;// long lret; int hSock; memset(&local, '\0', sizeof (local)); iSockType = SOCK_STREAM; local.sin_family = PF_INET; local.sin_port = htons((u_short)PORT_HQ); //local.sin_addr.s_addr =INADDR_ANY;//BROADCAST; hSock = socket(PF_INET, iSockType, 0); if (hSock == INVALID_SOCKET) { ErrMsg (hWnd, GetError("来自BindSocket:socket()")); return -1; } ret = bind(hSock, (struct sockaddr FAR *) &local, sizeof(local)); if (ret == SOCKET_ERROR) { ErrMsg(hWnd, GetError("来自BindSocket:bind()")); return -1; } /*if(PROTO_USE ==PROTO_TCP) { lret = 1L; ioctlsocket(hSock, FIONBIO, (u_long FAR *) &lret); } */ sdHq =hSock; ret =WSAAsyncSelect(sdHq, hWnd, WM_UDP_HQ, FD_ACCEPT); //FD_READ| if(ret <0) { ErrMsg(hWnd, GetError("来自BindSocket:asyncselect")); return -1; } // ret =listen(sdHq, SOMAXCONN);// if(ret ==SOCKET_ERROR)// {// ErrMsg(NULL, GetError("来自BindSocket:listen()"));// return -1;// } local.sin_port = htons((u_short)PORT_JY); hSock = socket(PF_INET, iSockType, 0); if (hSock == INVALID_SOCKET) { ErrMsg (hWnd, GetError("来自BindSocket:socket()1")); return -1; } ret = bind(hSock, (struct sockaddr FAR *) &local, sizeof(local)); if (ret == SOCKET_ERROR) { ErrMsg(hWnd, GetError("来自BindSocket:bind()1")); return -1; } //if(PROTO_USE ==PROTO_TCP) //{ // lret = 1L; // ioctlsocket(hSock, FIONBIO, (u_long FAR *) &lret); //} sdJy =hSock; ret =WSAAsyncSelect(sdJy, hWnd, WM_UDP_JY, FD_ACCEPT|FD_READ); //FD_READ| if(ret <0) { ErrMsg(hWnd, GetError("来自BindSocket:asyncselect1")); return -1; } // ret =listen(sdJy, 0);// if(ret ==SOCKET_ERROR)// {// ErrMsg(NULL, GetError("来自BindSocket:listen()"));// return -1;// } return 0;}int DesInit(void){ hDesDll = LoadLibrary("DES3W32.DLL"); if(hDesDll==NULL) { ErrMsg(ghWndMain, "can not load DES dll"); return -1; } desinit= (lpfnDES_INIT)GetProcAddress(hDesDll,"desinit"); ecbdecode =(lpfnDES_ECB3)GetProcAddress(hDesDll,"ecbdecode"); if(!desinit||!ecbdecode) { ErrMsg(ghWndMain, "can not load DES FUNC"); FreeLibrary(hDesDll); return -1; } return 0;}#define DATA_START_SIGN -16 typedef struct tag_RECV_PARA{ int sd; int len; char *para; HANDLE hThread;}RECV_PARA, *LPRECV_PARA;long TF_ReadHq(HANDLE hMem){ int sd,len; char *RecvBuf; struct sockaddr_in dest; DEST_INFO *lpDest; int len1,ret; BYTE FAR *lpTmp; HANDLE hThrd =NULL; LPRECV_PARA lpRecvPara =NULL; lpRecvPara =GlobalLock(hMem); if(lpRecvPara ==NULL) { ErrMsg(ghWndMain, "来自TF_ReadHq:目标信息指针为空!"); goto thread_exit; } len1 = sizeof(dest); sd =lpRecvPara->sd; len =lpRecvPara->len; RecvBuf =lpRecvPara->para; if(len <=0) { ErrMsg(ghWndMain,"数据长度错1"); goto thread_exit; } lpTmp =&RecvBuf[0]; if(strncmp(HQ00_HEAD, RecvBuf, strlen(HQ00_HEAD)) ==0) { MsgRecv("行情00"); if(UDP_Server_Send_Hq01(sd, &RecvBuf[strlen(HQ00_HEAD)], (struct sockaddr* )&dest)<0) { SendMsg(sd,"处理行情00错"); } } else if(strncmp(GRA00_HEAD, lpTmp, strlen(GRA00_HEAD)) ==0) { MsgRecv("分时图00"); UDP_Server_Send_Gra01(sd, &RecvBuf[strlen(GRA00_HEAD)], (struct sockaddr *)&dest); } else if(strncmp(HQREF_HEAD, lpTmp, strlen(HQREF_HEAD)) ==0) { MsgRecv("数据采集机信息"); //Data_RefHq(lpTmp+strlen(HQREF_HEAD)); } else if(strncmp(CLNT_EXIT, lpTmp, strlen(CLNT_EXIT)) ==0) { MsgRecv("退出"); HqDestStopBySd(sd); } else if(!strncmp(ZX_HEAD, lpTmp, strlen(ZX_HEAD))) { MsgRecv("资讯"); UDP_Server_Send_Zx(sd, lpTmp+strlen(ZX_HEAD), (struct sockaddr *)&dest); } else if(!strncmp(DATA_DAY_HEAD, lpTmp, strlen(DATA_DAY_HEAD))) { MsgRecv("日线"); SendDataDay(sd, lpTmp+strlen(DATA_DAY_HEAD), (struct sockaddr *)&dest); } else if(!strncmp(GETZQMC_HEAD, lpTmp, strlen(GETZQMC_HEAD))) { MsgRecv("股票名称"); UDP_Server_Send_GetZqmc(sd, lpTmp+strlen(GETZQMC_HEAD), (struct sockaddr *)&dest); } else if(!strncmp(HQ_CHKUSR_HEAD, lpTmp, strlen(HQ_CHKUSR_HEAD))) { MsgRecv("效验行情用户"); UDP_Server_Send_HqChkUsr(sd, lpTmp+strlen(HQ_CHKUSR_HEAD), (struct sockaddr *)&dest); } else if(!strncmp(STOCK_INFO_HEAD,lpTmp, strlen(STOCK_INFO_HEAD))) { MsgRecv("个股资料"); UDP_Send_File(sd,(FILE_INFO_FRAME *)(lpTmp+strlen(STOCK_INFO_HEAD))); } else if(!strncmp("SETENV",lpTmp,6)) { if(Monitor.IsRun) { lpDest =GetDestBySd(sd); if(lpDest!=NULL) { MsgRecv("环境设置"); ret =SetUserEnv(lpDest->recNum,(TCP_FRAME_HQ_ENV *)lpTmp,len); if(ret ==SET_SUCC) SendMsg(sd,"修改行情用户密码成功"); if(ret ==SET_PWD_ERROR) SendMsg(sd,"输入的原密码错,不能修改行情用户密码"); if(ret ==SET_DATA_ERROR) SendMsg(sd,"输入的数据有误,不能修改行情用户密码"); if(ret ==SET_SYS_ERROR) SendMsg(sd,"主机系统有误,不能修改行情用户密码"); } else { SendMsg(sd,"用户登录有误,不能修改行情用户密码"); } } } else { SendMsg(sd,"未识行情数据包"); }thread_exit: if(lpRecvPara!=NULL) { hThrd =lpRecvPara->hThread; GlobalFreePtr(lpRecvPara->para); GlobalFreePtr(lpRecvPara); } if(hThrd!=NULL) CloseHandle(hThrd); ExitThread(0); return 0;}int AnaRecvData(int sd,int type){ short prt,len,try_times,dataNum; char temp[MAX_RECV_BUF_SIZE+1]; char ReadBuf[MAX_RECV_BUF_SIZE+1]; struct sockaddr_in dest; int len1,i; prt=len=try_times=dataNum=0; memset((char *)&temp[0],0,MAX_RECV_BUF_SIZE*sizeof(char)); len = recvfrom(sd,(char *) temp,sizeof(temp), 0, (struct sockaddr *) &dest, (int FAR *) &len1); if (len == SOCKET_ERROR) { MessageBeep(0); return -1; } if(len <=0) { ErrMsg(ghWndMain,"接收数据长度小于零"); return -1; } while(prt<len) { if(temp[prt]!=DATA_START_SIGN) { for(i=0;i<MAX_JUNK_PACK_COUNT;i++) { if(JunkPack[i].sd==sd) break; } if(JunkPack[i].sd==sd&&JunkPack[i].junk[0]==DATA_START_SIGN) { while(JunkPack[i].len<1+sizeof(short)) { JunkPack[i].junk[JunkPack[i].len]=temp[prt]; JunkPack[i].len++; prt++; if(prt>=len) return 0; } if(JunkPack[i].len+(len-prt)>=*(short*)&JunkPack[i].junk[1]+3) { memcpy(&JunkPack[i].junk[JunkPack[i].len],&temp[prt], *(short*)&JunkPack[i].junk[1]-(JunkPack[i].len-3)); prt+=*(short*)&JunkPack[i].junk[1]-(JunkPack[i].len-3); memset(&ReadBuf[0],0,MAX_RECV_BUF_SIZE); memcpy(&ReadBuf[0],&JunkPack[i].junk[1+sizeof(short)], *(short*)&JunkPack[i].junk[1]); dataNum=*(short*)&JunkPack[i].junk[1]; memset(&JunkPack[i],0,sizeof(JUNK_PACK)); } else { memcpy(&JunkPack[i].junk[JunkPack[i].len],&temp[prt], len-prt); JunkPack[i].len+=len-prt; return 0; } } else {// ErrMsg(ghWndMain,"丢弃该数据包"); return -1; } } else { if(prt+1+2>=len) { do { for(i=0;i<MAX_JUNK_PACK_COUNT;i++) { if(JunkPack[i].sd==0|| difftime(time(NULL),JunkPack[i].ltime)>MAX_JUNK_VALID_TIME) break; } ShoutBlockingHook(); }while(i>=MAX_JUNK_PACK_COUNT); JunkPack[i].sd=sd; JunkPack[i].ltime=time(NULL); memcpy(&JunkPack[i].junk[JunkPack[i].len], &temp[prt],len-prt); JunkPack[i].len=len-prt; return 0; } dataNum=*(short *)&temp[prt+1]; if(dataNum<=0) { ErrMsg(ghWndMain,"数据长度错"); return -1; } if(prt+1+2+dataNum>len) { do { for(i=0;i<MAX_JUNK_PACK_COUNT;i++) { if(JunkPack[i].sd==0|| difftime(time(NULL),JunkPack[i].ltime)>MAX_JUNK_VALID_TIME) break; } if(i>=MAX_JUNK_PACK_COUNT) ShoutBlockingHook(); }while(i>=MAX_JUNK_PACK_COUNT); JunkPack[i].sd=sd; JunkPack[i].ltime=time(NULL); memcpy(&JunkPack[i].junk[JunkPack[i].len], &temp[prt],len-prt); JunkPack[i].len=len-prt; return 0; } else { memset(&ReadBuf[0],0,MAX_RECV_BUF_SIZE); memcpy(&ReadBuf[0],&temp[prt+1+sizeof(short)],dataNum); prt+=1+sizeof(short)+dataNum; } } if(type==0) UDP_ReadHq(sd,&ReadBuf[0],(int )dataNum,dest); else UDP_ReadJy(sd,&ReadBuf[0],(int )dataNum,dest); dataNum=0; if(prt>=len) { dataNum=0; return 0; } } return 0; }long TF_AnaRecvData(int sd){ short prt,len,try_times,dataNum; char temp[MAX_RECV_BUF_SIZE+1]; char ReadBuf[MAX_RECV_BUF_SIZE+1]; struct sockaddr_in dest; int len1,i; int type =0; prt=len=try_times=dataNum=0; memset((char *)&temp[0],0,MAX_RECV_BUF_SIZE*sizeof(char)); len = recvfrom(sd,(char *) temp,sizeof(temp), 0, (struct sockaddr *) &dest, (int FAR *) &len1); if (len == SOCKET_ERROR) { MessageBeep(0); return -1; } if(len <=0) { ErrMsg(ghWndMain,"接收数据长度小于零"); return -1; } while(prt<len) { if(temp[prt]!=DATA_START_SIGN) { for(i=0;i<MAX_JUNK_PACK_COUNT;i++) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -