⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sv_tcp.c

📁 站长96年写的一个Internet上用的股票行情、分析、交易、资讯程序源码
💻 C
📖 第 1 页 / 共 5 页
字号:
#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 + -