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

📄 tcpapi.cpp

📁 路透串口通讯程序
💻 CPP
字号:
// TCPAPI.cpp : Defines the entry point for the DLL application.
//

#include "stdafx.h"
#include "TCPAPI.h"
#include "winsock2.h"
#include "stdlib.h"
#include "stdio.h"

#define  STX                 0x02
#define  ETX                 0x03
#define  MMAX				 4096
#define  WAITTIME            30000
static   char dirty_buf[MMAX]; /* Internal buffer for whatever purpose */

int Save(char *name, char *ptr, int len);

BOOL SockInit(void)
{
	WORD wVersion = MAKEWORD(2, 2);
    WSADATA wsaData;
	
    if(WSAStartup(wVersion, &wsaData) == SOCKET_ERROR)
        return FALSE;	//WSAStartup fail
	else if (wsaData.wHighVersion < 0x0200)
		return FALSE;	
	return TRUE;
}

void SockUninit(void)
{
	WSACleanup();
}

//数据发送,接收,带有超时
//返回-1表示失败
int SocketSendDataTimeout(SOCKET sock,const char* pbSend,int iLen,int iTimeOut)
{
	DWORD dwTick=GetTickCount();
	int iSent=0, iLeft = iLen;
	while((GetTickCount()-dwTick)<=(DWORD)iTimeOut)
	{
		iLeft=iLen - iSent;
		int iRet = send(sock,(char*)pbSend+iSent,iLeft,0);
		if(iRet == INVALID_SOCKET)
		{
			if(iSent ==0)
				return -1;
			break;
		}
		iSent +=iRet;
		if(iSent == iLen)
			break;
	}
	return iSent;
}

int SocketRecvDataTimeout(SOCKET sock,char* pbRecv,int iLen,int iTimeOut)
{
	DWORD dwTick=GetTickCount();
	int iRecved=0,iLeft=iLen;
	while((GetTickCount()-dwTick)<=(DWORD)iTimeOut)
	{
		struct timeval tvLeft={1,0};
		fd_set fdRecv;
		FD_ZERO(&fdRecv);
		FD_SET(sock,&fdRecv);
		iLeft = iLen - iRecved;
		int iRet = select(1,&fdRecv,NULL,NULL,&tvLeft);
		if(iRet == INVALID_SOCKET)
			break;
		if(iRet == 1)
		{
			iRet = recv(sock,(char*)pbRecv+iRecved,iLeft,0);
			if(iRet == INVALID_SOCKET  || iRet ==0)
			{
				if(iRecved==0)
					return -1;
				break;
			}
			iRecved +=iRet;
			if(iRecved == iLen)
				break;
		}
	}
	return iRecved;
}

int SocketRecvDataWait(SOCKET sock,char* pbRecv,int iMaxLen,int iTimeOut)
{
	DWORD dwTick=GetTickCount();
	while((GetTickCount()-dwTick)<=(DWORD)iTimeOut)
	{
		struct timeval tvLeft={1,0};
		fd_set fdRecv;
		FD_ZERO(&fdRecv);
		FD_SET(sock,&fdRecv);
		int iRet = select(1,&fdRecv,NULL,NULL,&tvLeft);
		if(iRet == INVALID_SOCKET)
		{
			//return 0;
			return INVALID_SOCKET ;
		}
		if(iRet == 1)
		{
			iRet = recv(sock,(char*)pbRecv,iMaxLen,0);
			if(iRet == 0)
				return INVALID_SOCKET ;
			return iRet;
		}
	}
	return 0;
}

int SocketRecvDataWaitV2(SOCKET sock,char* pbRecv,int iMaxLen,int iTimeOut)
{
	DWORD dwTick=GetTickCount();
	while((GetTickCount()-dwTick)<=(DWORD)iTimeOut)
	{
//		struct timeval tvLeft={1,0};
//		fd_set fdRecv;
//		FD_ZERO(&fdRecv);
//		FD_SET(sock,&fdRecv);
//		int iRet = select(1,&fdRecv,NULL,NULL,&tvLeft);
//		if(iRet == INVALID_SOCKET)
//		{
//			return 0;
//			//return INVALID_SOCKET ;
//		}
//		if(iRet == 1)
		{
			int iRet = recv(sock,(char*)pbRecv,iMaxLen,0);
			//TRACE("recv v2 %d\n",iRet);
			if(iRet == 0)
			{
				//return INVALID_SOCKET ;
				Sleep(100);
				continue;
			}
			if(iRet==INVALID_SOCKET)
			{
				if(iRet == 0)
					return INVALID_SOCKET ;
				return iRet;
			}
			return iRet;
		}
	}
	return 0;
}

int SocketSendData(SOCKET sock,const char* pbSend,int iLen)
{
	int iSent=0;
	if(iLen <= 0) return -1;

	while(1)
	{
		int iLeft = iLen -iSent;
		int iRet = send(sock,(char*)pbSend+iSent,iLeft,0);
		if(iRet ==0 || iRet == INVALID_SOCKET )
			return -1;
		iSent += iRet;
		if(iSent == iLen)
			return iSent;
	}
	return -1;
}


int SocketRecvData(SOCKET sock,char* pbRecv,int iLen)
{
	int iRecved=0;
	if(iLen <= 0) return -1;

	while(1)
	{
		int iLeft = iLen -iRecved;
		int iRet = recv(sock,(char*)pbRecv+iRecved,iLeft,0);
		if(iRet ==0 || iRet == INVALID_SOCKET )
			return -1;
		iRecved += iRet;
		if(iRecved == iLen)
		{
			return iRecved;
		}
	}
	return -1;

}


SOCKET CreateConnectSocket(LPCSTR pszRemoteAddr,int iPort,LPCSTR pszLocalAddr)
{
	SOCKET sock=socket(AF_INET,SOCK_STREAM,0);
	if(sock<0)
		return INVALID_SOCKET ;
/*	//bind
	SOCKADDR_IN sinLocal;
	sinLocal.sin_family=AF_INET;
	sinLocal.sin_port=htons(7171);
	if(pszLocalAddr)
	{
		LONG lAddr= inet_addr(pszLocalAddr);
		memcpy((LPSTR)&(sinLocal.sin_addr),&lAddr,sizeof(lAddr));
	}
	else
	{
		LONG lAddr= INADDR_ANY;
		memcpy(&(sinLocal.sin_addr),&lAddr,sizeof(lAddr));
	}
	int iStatus=bind(sock,(struct sockaddr FAR*)&sinLocal,sizeof(sinLocal));
	if(iStatus<0)
	{
		closesocket(sock);
		return INVALID_SOCKET ;
	}*/
	//connect
	SOCKADDR_IN sinRemote;
	sinRemote.sin_family=AF_INET;
	sinRemote.sin_port=htons(iPort);
	LONG lAddr= inet_addr(pszRemoteAddr);
	memcpy((LPSTR)&(sinRemote.sin_addr),&lAddr,sizeof(lAddr));
	int iStatus = connect(sock,(struct sockaddr FAR*)&sinRemote,sizeof(sinRemote));
	if(iStatus <0)
	{
		closesocket(sock);
		return INVALID_SOCKET ;
	}
	return sock;
}

SOCKET CreateListenSocket(LPCSTR pszLocalAddr,UINT uPort)
{
	SOCKET sock=socket(AF_INET,SOCK_STREAM,0);
	if(sock<0)
		return INVALID_SOCKET ;
	//bind
	SOCKADDR_IN sinLocal;
	sinLocal.sin_family=AF_INET;
	sinLocal.sin_port=htons(uPort);
	if(pszLocalAddr)
	{
		LONG lAddr= inet_addr(pszLocalAddr);
		memcpy((LPSTR)&(sinLocal.sin_addr),&lAddr,sizeof(lAddr));
	}
	else
	{
		LONG lAddr= INADDR_ANY;
		memcpy(&(sinLocal.sin_addr),&lAddr,sizeof(lAddr));
	}
	int iStatus=bind(sock,(struct sockaddr FAR*)&sinLocal,sizeof(sinLocal));

	if(iStatus<0)
	{
		closesocket(sock);
		return INVALID_SOCKET ;
	}
   
	if(0>(iStatus=listen(sock,15)))
	{
		closesocket(sock);
		return INVALID_SOCKET ;
	}
	return sock;
}

int GetMessage(SOCKET sd, char *ptr, int max)
{
    int	  nread;
    unsigned char  cs_nob[2 + 1];	/* No. of bytes in character */
    unsigned char LRC=0;
    int s_nob;		           	/* No. of bytes in short */
    int	  nbyte;			/* No. of bytes to read from stream */
    int	  ret = -1;			/* Final return value */
    int i;

    if ((nread=SocketRecvDataWait(sd, (char *)cs_nob, 1, WAITTIME)) != 1)
    {
       return -1;
    }

    if (cs_nob[0] != STX)
    {
       return -2;
    }
    
    if ((nread=SocketRecvDataTimeout(sd,  (char *)cs_nob, 2, WAITTIME)) != 2)
    { 
      return -3;
    }

    s_nob = (int)(cs_nob[0]>>4)*1000 + (int)(cs_nob[0]&0x0f)*100;
    s_nob += (int)(cs_nob[1]>>4)*10 + (int)(cs_nob[1]&0x0f);

    if (s_nob > max)
	nbyte = max;
    else
	nbyte = s_nob;

    /* Read remaining bytes */
	//add for test
	//return nbyte;

    nread = SocketRecvDataTimeout(sd, ptr, nbyte, WAITTIME);
    ret = nread;

    if (nread != nbyte)
    {
	return -4;
    }

    if (SocketRecvDataTimeout(sd, dirty_buf, 2,WAITTIME) != 2)
    {   
       return -5;
    }

    if (dirty_buf[0] != ETX)
    {
        return -6;
    }
    
    LRC = 0;
    LRC ^= cs_nob[0];
    LRC ^= cs_nob[1];
    for (i=0; i<nbyte; i++)
      LRC ^= *(ptr+i);
    LRC ^= ETX;

    if (LRC != (unsigned char) dirty_buf[1])
    {
      ret = -7;
    }
	
    /* Check if there is remaining bytes to clear */
    /* Return value independent on result of this section */
    nread = s_nob - max;	 /*Could be negative */
    while (nread > 0) 
    {
	if (nread >= MMAX) 
	    nbyte = MMAX;
	else
	    nbyte = nread; 
	nbyte = SocketRecvDataTimeout(sd, dirty_buf, nbyte,WAITTIME);
	if (nbyte > 0)
	    nread -= nbyte;
	else
	    break;
    }

    return (ret);
}

int PutMessage(SOCKET sd, char *ptr, int nbytes)
{
    int	nwritten;
    unsigned char	cs_nob[2 + 1];
    unsigned char LRC;
    int i;

    cs_nob[0] = STX;
    if ((nwritten=SocketSendDataTimeout(sd, (char *)cs_nob, 1,WAITTIME)) != 1)
       return -1;
    cs_nob[0] = ((nbytes/1000)<<4) + ((nbytes/100)%10);
    cs_nob[1] = ((nbytes/10)%10<<4) + (nbytes%10);
    if ((nwritten=SocketSendDataTimeout(sd, (char *)cs_nob, 2,WAITTIME)) != 2)
       return -1;

    nwritten = SocketSendDataTimeout(sd, (char *)ptr, nbytes,WAITTIME);
    if (nwritten != nbytes)
	return -1;
    LRC = 0;
    LRC ^= cs_nob[0];
    LRC ^= cs_nob[1];
    for (i=0; i<nbytes; i++)
        LRC ^= *(ptr+i);
    LRC ^= ETX;
    
    cs_nob[0] = ETX;
    cs_nob[1] = LRC;
    if (SocketSendDataTimeout(sd, (char *)cs_nob, 2, WAITTIME) != 2)
        return -1;

    return nwritten;
}

/*
1.	经烟户转烟草公司;710303
2.	冲正;710403
3.	对总帐;710503
4.	建立委托关系;712003
5.	撤消委托关系:712103
6.	查询交易结果:710603
7.	对明细;710803
发生日期:格式为年月日,表示为YYYYMMDD,报文发起日期
取值范围:YYYY:1998-2999
MM:01-12
DD:01-31
发生时间:格式为时分秒,表示为hhmmss,报文发起时间
取值范围:hh:00-23
mm:00-59
ss:00-59
*/
int __stdcall ych_sndrcv(char *host,int port,char *ls_str)
{

	int ret;

	SOCKET sd = CreateConnectSocket(host, port, NULL);
	if(sd == INVALID_SOCKET)
	{
		return -1;
	}

	if( (ret = PutMessage(sd, ls_str, 1024 )) < 0)
	{
		closesocket(sd);
		return -2;
	}
	
    return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -