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

📄 socket.cpp

📁 小型短信网关系统
💻 CPP
字号:
#include <unistd.h>                             /* close */#include <string.h>                             /* strerror */#include <strings.h>                    	/* bzero */#include <errno.h>                              /* extern int errno */#include <sys/socket.h>                 	/* socket, bind, listen, etc. */#include <netdb.h>				//gethostbyname()#include <arpa/inet.h>				//inet_ntoa()#include	"Socket.h"#include	"Logger.h"const   UInt    MaxLength=65535;Socket::Socket(){	_sockfd=-1;        _sockfd_cli=-1; 	_fd=-1;        _port=0;        _host=NULL;}Socket::~Socket(){}void	Socket::ClientInit(char* sAddr, char* sPort){		_host=gethostbyname(sAddr);	if(_host == NULL)	{		Logger::debug("In gethostbyname error!");		exit(1);	}	_port=atoi(sPort);	if(_port < 0)	{		Logger::debug("Get port error!");		exit(1);	}	bzero(& _server_addr, sizeof( _server_addr));	_server_addr.sin_family=AF_INET;	_server_addr.sin_addr=*(struct in_addr *)_host->h_addr;	_server_addr.sin_port=htons(_port);}void	Socket::ServerInit(char* sPort){		_host=gethostbyname(sPort);	if(_host == NULL)	{		Logger::debug("In gethostbyname error!");		exit(1);	}	_port=atoi(sPort);	if(_port < 0)	{		Logger::debug("Get port error!");		exit(1);	}	bzero(&_server_addr, sizeof(_server_addr));	_server_addr.sin_family=AF_INET;	_server_addr.sin_addr.s_addr=htonl(INADDR_ANY);	_server_addr.sin_port=htons(_port);}void	Socket::Sock(){	_sockfd=socket(AF_INET, SOCK_STREAM, 0);	if(_sockfd < 0)	{ 		Logger::debug("In socket error: %s", strerror(errno)); 		exit(1);	}}void	Socket::Connect(){	int	ret;	ret=connect(_sockfd, (struct sockaddr*) &_server_addr, sizeof(struct sockaddr));	if(ret < 0) 	{ 		Logger::debug("In connect error: %s", strerror(errno));		close(_sockfd); 		exit(1);	}	_fd=_sockfd;}void	Socket::Bind(){	int	ret;	int	in=1;	//setsockopt to avoid meeting error "Address already in use"	ret=setsockopt(_sockfd, SOL_SOCKET, SO_REUSEADDR,&in,sizeof(in));	if(ret < 0) 	{ 		Logger::debug("In connect error: %s", strerror(errno));		close(_sockfd); 		exit(1); 	}	ret=bind(_sockfd, (struct sockaddr*) &_server_addr, sizeof(struct sockaddr));	if(ret < 0)	{ 		Logger::debug("In connect error: %s", strerror(errno));		close(_sockfd); 		exit(1);	}}void	Socket::Listen(int maxListen){	int	ret;	ret=listen(_sockfd, maxListen);	if(ret < 0)	{ 		Logger::debug("In connect error: %s", strerror(errno));		close(_sockfd); 		exit(1);	}}void	Socket::Accept(){	size_t	size_in;	size_in=sizeof(struct sockaddr);		_sockfd_cli=accept(_sockfd, (struct sockaddr*) &_client_addr, &size_in);	if(_sockfd_cli < 0)	{ 		Logger::debug("In connect error: %s", strerror(errno));		close(_sockfd); 		exit(1);	}	Logger::debug("Server get connection from %s", inet_ntoa(_client_addr.sin_addr));	Logger::log(L_ERR, "Server get connection from %s", inet_ntoa(_client_addr.sin_addr));		_fd=_sockfd_cli;}int	Socket::Send(Octets data, UInt length){	int	sendLen;	const char* ptr;	ptr=(char*)data;	while(length > 0)		{		sendLen=send(_fd, ptr, length, 0);		if(sendLen < 0)		{			Logger::debug("In send error: %s", strerror(errno));			SockEnd();			exit(1);		}		length-=sendLen;		ptr+=sendLen;	}	return ptr-(char*)data;}UInt    Socket::Receive(Octets data){	int	recvLen;	UInt	totalLength, nTotalLength, length;	char*	ptr;	ptr=(char*)data;	//totalLength	recvLen=recv(_fd, ptr, 12, 0);	if(recvLen < 0)	{		Logger::debug("In recv error: %s", strerror(errno));		SockEnd();		exit(1);	}	else if(recvLen == 0)	{		Logger::debug("In recv error: Connection Refused!");		SockEnd();		exit(1);	}	else if(recvLen < 12)	{		Logger::log(L_ERR, "Receive length = %d < 12 !", recvLen);		SockEnd();		exit(1);	}	memcpy(&nTotalLength,ptr, 4);	totalLength=ntohl(nTotalLength);	if(totalLength < 12)		{		Logger::log(L_ERR, "TotalLength length < 12 !");		SockEnd();		exit(1);	}	length=totalLength-12;	ptr+=12;	while(length > 0)	{		recvLen=recv(_fd, ptr, length, 0);		if(recvLen < 0)		{			Logger::debug("In recv error: %s", strerror(errno));			SockEnd();			exit(1);		}		else if(recvLen == 0) 	//client unlink			break;			length-=recvLen;		ptr+=recvLen;	}	if(length != 0)	{		Logger::debug("Receive data length not equal total length!");		SockEnd();		exit(1);	}		return totalLength;}bool	Socket::IsLinked(){	if(_fd <= 0)		return false;	else			return true;	}void	Socket::Close(){	if(_fd > 0)		close(_fd);}void	Socket::SockEnd(){	if(_sockfd > 0)		close(_sockfd);	if(_sockfd_cli > 0)		close(_sockfd_cli);	if(_fd > 0)		close(_fd);	}

⌨️ 快捷键说明

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