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

📄 mysocket.cpp

📁 电力故障信息采集,主要是针对南自的保护装置,这个程序用在Linux操作系统下
💻 CPP
字号:
//MySocket.cpp#include <iostream>#include <sys/select.h>#include <unistd.h>#include <cstring>#include <errno.h>#include "MySocket.h"using namespace std ;typedef unsigned char BYTE ;//====================  MyConnect  ====================MyConnect::MyConnect(){}//MyConnectMyConnect::~MyConnect(){	shutdown() ;}//~MyConnectbool MyConnect::open(int domain/*AF_INET*/ , int type/*SOCK_STREAM*/ , int protocol/*0*/){	shutdown() ;	m_socket = socket(domain , type , protocol) ;	if (-1 == m_socket)	{		return false ;	}//if		return true ;}//openbool MyConnect::connect(const char *server , int port/*2404*/ , int domain/*AF_INET*/){	sockaddr_in m_server ;	bzero(&m_server , sizeof m_server) ;	m_server.sin_family = domain ;	m_server.sin_port = htons(port) ;	m_server.sin_addr.s_addr = inet_addr(server) ;	if (-1 == ::connect(m_socket , reinterpret_cast<sockaddr *>(&m_server) , sizeof m_server))	{		return false ;	}//if		return true ;}//connectMyConnect::operator int() const{	return m_socket ;}//operator intbool MyConnect::shutdown(int how/*2*/) const{	::shutdown(m_socket , how) ;	return true ;}//shutdown//====================  MyListen  ====================MyListen::MyListen(int domain/*AF_INET*/ , int type/*SOCK_STREAM*/ , int protocol/*0*/){	m_socket = socket(domain , type , protocol) ;}//MyListenMyListen::~MyListen(){	shutdown(m_socket) ;}//~MyListenbool MyListen::shutdown(int socket , int how/*2*/) const{	if (-1 == ::shutdown(socket , how))	{		return false ;	}//if		return true ;}//shutdownbool MyListen::bind(const char *server/*""*/ , int port/*2404*/ , int domain/*AF_INET*/){	bzero(&m_server , sizeof m_server) ;	m_server.sin_family = domain ;	m_server.sin_port = htons(port) ;	if (0 != strlen(server))	{		m_server.sin_addr.s_addr = inet_addr(server) ;	}//if		if (-1 == ::bind(m_socket , reinterpret_cast<sockaddr *>(&m_server) , sizeof m_server))	{		return false ;	}//if		return true ;	}//bindbool MyListen::listen(int backlog/*5*/) const{	if (-1 == ::listen(m_socket , backlog))	{		return false ;	}//if		return true ;}//listenint MyListen::accept(string &ip){	socklen_t length = sizeof m_client ;	bzero(&m_client , length) ;	int socket = ::accept(m_socket , reinterpret_cast<sockaddr *>(&m_client) , &length) ;	if (-1 == socket)	{		return -1 ;	}//if	else if (sizeof m_client != length)	{		return -1 ;	}//else if		ip = inet_ntoa(m_client.sin_addr) ;	return socket ;}//accept//====================  MySocket  ====================MySocket::MySocket(){	m_reset = true ;	m_socket = -1 ;}//MySocketMySocket::~MySocket(){	shutdown() ;}//~MySocketbool MySocket::needReset() const{	return m_reset ;}//needResetMySocket & MySocket::operator =(const MyConnect &connect){	shutdown() ;	m_socket = connect ;	m_reset = false ;	return *this ;}//operator =MySocket & MySocket::operator =(int socket){	shutdown() ;	m_socket = socket ;	m_reset = false ;	return *this ;}//operator =int MySocket::receive(void *buf , int len , int time_out/*5*/ , unsigned int flags/*0*/){	if (m_reset)	{		return -1 ;	}//if		memset(buf , 0 , len) ;	int result = 0 ;	fd_set readfds ;	timeval timeout ;	int retval = 0 ;	int error_time = 0 ;	while (result < len)	{		FD_ZERO(&readfds) ;		FD_SET(m_socket , &readfds) ;		timeout.tv_sec = time_out ;		timeout.tv_usec = 0 ;		retval = select(m_socket + 1 , &readfds , NULL , NULL , &timeout) ;		if (retval)		{			if (FD_ISSET(m_socket , &readfds))			{				retval = recv(m_socket , static_cast<BYTE *>(buf) + result , len - result , flags) ;				if (-1 == retval)				{					m_reset = true ;					return -1 ;				}//if								result += retval ;				error_time = 0 ;				continue ;			}//if			else			{				m_reset = true ;				return -1 ;			}//else		}//if		else if (0 == retval)		{			//cout << " Read Select Timeout ! Want To Read : " << len << " , Have Read : " << result << endl << endl ;		}//else if		else		{			m_reset = true ;			return -1 ;		}//else				if (++error_time > 2)		{			break ;		}//if	}//while			if (0 == result)	{		//cout << " No Data ! " << endl << endl ;	}//if		return result ;}//receiveint MySocket::send(const void *msg , int len , unsigned int flags/*0*/){	if (m_reset)	{		return -1 ;	}//if		int result = ::send(m_socket , msg , len , flags) ;	if (-1 == result)	{		m_reset = true ;		return -1 ;	}//if	else if (len != result)	{		return -1 ;	}//else if			if (0 == result)	{		cout << " No Data ! " << endl << endl ;		return -1 ;	}//if		return result ;}//sendbool MySocket::shutdown(int how/*2*/){	::shutdown(m_socket , how) ;	m_reset = true ;	m_socket = -1 ;	return true ;}//shutdown

⌨️ 快捷键说明

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