📄 tcpapi.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 + -