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

📄 tcplib.cpp

📁 中国移动的短信网关程序
💻 CPP
字号:
/***************************************** file : TcpLib.cpp writer: linsh date: 2004-07-23 content: tcp client and server class *****************************************/#include "stdafx.h"#include "TcpLib.h"#include <io.h>
#include <Winsock2.h>
#include <stdlib.h>
extern int errno;
CTcpClient::CTcpClient(){	rCommFunc_.OnRecvData = NULL;	rCommFunc_.OnConnected = NULL;	rCommFunc_.OnDisconnected = NULL;	sock = -1;	FD_ZERO(&m_readset);}CTcpClient::~CTcpClient(){	if(sock > 0)		closesocket(sock);}int CTcpClient::InitClient(char *ip, int port){	struct sockaddr_in dest;	strncpy(m_sdistIp,ip,16);	m_port = port;
	sock = socket(PF_INET,SOCK_STREAM,0);	if(sock < 0)
	{
		int err = WSAGetLastError();
		return -1;	}	memset(&dest,0, sizeof(dest));	dest.sin_family = PF_INET;	dest.sin_port = htons(port);	dest.sin_addr.S_un.S_addr = inet_addr(ip);	if(0 != connect(sock, (sockaddr *)&dest, sizeof(dest)))	{		closesocket(sock);		sock = -1;		return -1;	}	
	unsigned long flag = 0;
	int ret = ioctlsocket(sock,FIONBIO,&flag);
	if(ret != 0)
	{
			closesocket(sock);
			sock = -1;
			return -1;
	}	if(rCommFunc_.OnConnected != NULL)		rCommFunc_.OnConnected(sock,ip,port);	return sock;}int CTcpClient::SendMsg(int sock,char * sBuf,int nLen){	int ret = send(sock,sBuf,nLen,MSG_DONTROUTE);
	if(ret == nLen)
		return 0;
	else
	{
		if(rCommFunc_.OnDisconnected)
			rCommFunc_.OnDisconnected(sock,m_sdistIp,m_port);
		closesocket(sock);
		sock = -1;
		return 104;
	}
}void CTcpClient::RunClient(){	int nLen;	struct  timeval timeout = {0,0};		FD_ZERO(&m_readset);	FD_SET((unsigned int)sock, &m_readset);	if(select(sock + 1, &m_readset, NULL,NULL, &timeout) > 0)	{		if (FD_ISSET(sock,&m_readset)) {			nLen = recv(sock,m_Buf,SOCK_BUF_SIZE,0);
			if(nLen > 0)			{				if(rCommFunc_.OnRecvData != NULL)					rCommFunc_.OnRecvData(sock,m_sdistIp,m_port,m_Buf,nLen);			}			else			{				if(rCommFunc_.OnDisconnected)					rCommFunc_.OnDisconnected(sock,m_sdistIp,m_port);
				closesocket(sock);
				sock = -1;
			}		}    } }void CTcpClient::CloseClient(){	if(sock > 0)		closesocket(sock);	if(rCommFunc_.OnDisconnected)		rCommFunc_.OnDisconnected(sock,m_sdistIp,m_port);	sock = -1;}CTcpServer::CTcpServer(){	rCommFunc_.OnRecvData = NULL;	rCommFunc_.OnConnected = NULL;	rCommFunc_.OnDisconnected = NULL;	FD_ZERO(&m_readset);	m_srvsock = -1;	m_listenport =  0;	maxsock = 0;	lst_clients = NULL;}CTcpServer::~CTcpServer(){	tagCliList *cr ;	tagCliList *nt;	cr = lst_clients;	while( cr != NULL )	{		nt = cr->next;		if(cr->clifd > 0)			closesocket(cr->clifd);		delete cr;		cr = nt;	}	lst_clients = NULL;}int CTcpServer::InitServer(int iport){	struct sockaddr_in dest;	m_srvsock = socket(PF_INET, SOCK_STREAM, 0);	if(m_srvsock < 0)		return -1;	memset(&dest,0, sizeof(dest));	dest.sin_family = PF_INET;	dest.sin_port = htons(iport);	dest.sin_addr.s_addr = INADDR_ANY;	if(bind(m_srvsock, (struct sockaddr*)&dest, sizeof(dest)) != 0)	{		closesocket(m_srvsock);		m_srvsock = -1;		return -1;	}		listen(m_srvsock, 255);	maxsock = maxsock>m_srvsock? maxsock:m_srvsock;	unsigned long flag = 0;
	int ret = ioctlsocket(m_srvsock,FIONBIO,&flag);
	if(ret != 0)
	{
			closesocket(m_srvsock);
			m_srvsock = -1;
			return -1;
	}
	
	return 0;}void CTcpServer::RunServer(){	struct  timeval timeout = {0,0};  	FD_ZERO(&m_readset);	FD_SET((unsigned int)m_srvsock, &m_readset);	if(select(m_srvsock + 1, &m_readset, NULL,NULL, &timeout) > 0)	{		if (FD_ISSET(m_srvsock,&m_readset)) {			tagCliList *cr ;			struct sockaddr_in client_addr;			int addrlen = sizeof(client_addr);			int clientfd;			clientfd = accept(m_srvsock, (struct sockaddr*)&client_addr, &addrlen);			if(clientfd > 0)			{				cr = new tagCliList;				memset(cr,0,sizeof(tagCliList));				cr->clifd = clientfd;				strncpy(cr->cliIp,inet_ntoa(client_addr	.sin_addr),16);				cr->cliport = ntohs(client_addr.sin_port);				cr->next = NULL;				tagCliList **lp;				for(lp = &lst_clients; (*lp) != NULL; lp = &((*lp)->next));				(*lp) = cr;				(rCommFunc_.OnConnected)(cr->clifd, cr->cliIp,cr->cliport);				maxsock = maxsock > cr->clifd? maxsock: cr->clifd;			}		}        } 	FD_ZERO(&m_readset);		tagCliList **lp;	for(lp = &lst_clients; (*lp) != NULL; lp = &((*lp)->next))	{		if((*lp)->clifd > 0)			FD_SET((unsigned int)(*lp)->clifd,&m_readset);	}	if(select(maxsock + 1, &m_readset, NULL,NULL, &timeout) > 0)	{
		lp = &lst_clients;
		while((*lp) != NULL)
		{
			if(FD_ISSET((*lp)->clifd, &m_readset))
			{
				int nLen;;
				nLen = recv((*lp)->clifd,m_Buf,SOCK_BUF_SIZE,0);
				if(nLen > 0)
				{
					if(rCommFunc_.OnRecvData != NULL)
						rCommFunc_.OnRecvData((*lp)->clifd,(*lp)->cliIp,(*lp)->cliport,m_Buf,nLen);
					lp = &((*lp)->next);
				}
				else
				{
					if(rCommFunc_.OnDisconnected)
						rCommFunc_.OnDisconnected((*lp)->clifd,(*lp)->cliIp,(*lp)->cliport);
					closesocket((*lp)->clifd);
					(*lp)->clifd = -1;
					tagCliList *dellp;
					dellp = *lp;
					*lp = (*lp)->next;
					delete dellp;
				}
			}
			else
				lp = &((*lp)->next);
		}	}}void CTcpServer::CloseServer(){	if(m_srvsock > 0)		closesocket(m_srvsock);	m_srvsock = -1;}int CTcpServer::SendMsg(int ihandle, char *buf, int nLen){	int ret = send(ihandle,buf,nLen,MSG_DONTROUTE);
	if(ret == nLen)
		return 0;
	else
	{
		tagCliList **lp;
		lp = &lst_clients;
		while((*lp) != NULL)
		{
			if((*lp)->clifd == ihandle)
			{
				if(rCommFunc_.OnDisconnected)
					rCommFunc_.OnDisconnected((*lp)->clifd,(*lp)->cliIp,(*lp)->cliport);
				closesocket((*lp)->clifd);
				(*lp)->clifd = -1;
				tagCliList *dellp;
				dellp = *lp;
				*lp = (*lp)->next;
				delete dellp;
				break;
			}
			else
				lp = &((*lp)->next);
		}
		return 104;
	}
}

⌨️ 快捷键说明

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