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

📄 communication.cpp~

📁 电力系统Linux设备通讯程序 主要是为了各大电网通讯数据代码
💻 CPP~
📖 第 1 页 / 共 3 页
字号:
}bool CComdev::SetStopbit(int stopBit){ bool result; result = CComdev::SetStopbit(this->com_fd, stopBit); return result;}bool CComdev::SetParity(int comfd, paritytype_t type){ return true ; if (!isatty(comfd)) {  error_log("error at SetParity, comfd is not atty\n");  return false; } struct termios option; if (tcgetattr(comfd, &option) != 0) {  error_log("error at SetParity, tcgetattr error\n");  return false; } switch (type) {  case N:       option.c_cflag &= ~PARENB;   option.c_iflag &= ~INPCK;   break;    case O:   option.c_cflag |= PARENB;    option.c_cflag |= PARODD;   option.c_iflag |= INPCK;   break;  case E:   option.c_cflag |= PARENB;   option.c_cflag &= ~PARODD;   option.c_iflag |= INPCK;   break;   default:   return false;   break;    } if (tcsetattr(comfd, TCSANOW, &option) != 0) {  error_log("error SetParity, tcsetattr error\n");  return false; } else return true;}bool CComdev::SetParity(paritytype_t type){ bool result; result = CComdev::SetParity(this->com_fd, type); return result;}bool CComdev::SetOption(int comfd, struct termios *p_option){ if (!isatty(comfd)) {  error_log("error at SetOption, comfd is not atty\n");  return false; } if (p_option == NULL)	{		error_log("error at SetOption, option is NULL\n");		return false;	}	if (tcsetattr(comfd, TCSANOW, p_option) != 0)	{		error_log("error at SetOption, tcsetattr error\n");		return false;	}	else return true;}bool CComdev::SetOption(struct termios *p_option){	bool result;	result = CComdev::SetOption(this->com_fd, p_option);	return result;}bool CComdev::GetOption(int comfd, struct termios *p_option){	if (!isatty(comfd))	{		error_log("error at GetOption, comfd is not atty\n");		return false;	}	if (p_option == NULL)	{		error_log("error at GetOption, p_option is NULL\n");		return false;	}		if (tcgetattr(comfd, p_option) != 0)	{		error_log("error at GetOption, tcgetattr error\n");		return false;	}	else return true;}bool CComdev::GetOption(struct termios *p_option){	bool result;	result = CComdev::GetOption(this->com_fd, p_option);	return result;}bool CComdev::CloseCom(int& comfd){ if (isatty(comfd)) {  close(comfd);  comfd = -1;  return true; } else {  error_log("comfd is not COM dev\n");  return false; }}bool CComdev::CloseCom(){ bool result; result = CComdev::CloseCom(this->com_fd); return result;}/*==============================================================================* Net socket==============================================================================*/#define NETERRTOFILE "neterror.log"int net_error;void net_error_init(){ net_error = 0;}int net_error_log(const char *error_msg1, const char *error_msg2, const int error_code){ if (error_msg1 != NULL) {  printf("--@@Com103 error message 1 is %s. @@--\n", error_msg1); } if (error_msg2 != NULL) {  printf("--@@Com103 error message 2 is %s. @@--\n", error_msg2); } net_error = error_code; printf("--@@Com103 error code is %d @@--\n", net_error); return 0 ;}//-------------------------------------------------------------------------namespace nsErrorReturnValues{	const int SOCKET_ERROR      = -1;    const int BIND_ERROR        = -1;    const int CONNECT_ERROR     = -1;    const int SEND_ERROR        = -1;    const int RECV_ERROR        = -1;    const int LISTEN_ERROR      = -1;    const int ACCEPT_ERROR      = -1;    const int GETSOCKNAME_ERROR = -1;    const int GETPEERNAME_ERROR = -1;    const int GETSOCKOPT_ERROR  = -1;    const int SETSOCKOPT_ERROR  = -1;    const int SHUTDOWN_ERROR    = -1;}namespace nsErrorMessages{	const char * NOT_OPENED = "Socket not opened yet";    const char * OPENED     = "Socket already opened";}namespace nsMethodNames{	const char * OPEN        = "CSocket::Open()";    const char * CLOSE       = "CSocket::Close()";    const char * BIND        = "CSocket::Bind()";    const char * CONNECT     = "CSocket::Connect()";    const char * SEND        = "CSocket::Send()";    const char * SENDTO      = "CSocket::Sendto()";    const char * RECV        = "CSocket::Recv()";    const char * RECVFROM    = "CSocket::Recvfrom()";    const char * LISTEN      = "CSocket::Listen()";    const char * ACCEPT      = "CSocket::Accept()";    const char * GETSOCKNAME = "CSocket::Getsockname()";    const char * GETPEERNAME = "CSocket::Getpeername()";    const char * GETSOCKOPT  = "CSocket::Getsockopt()";    const char * SETSOCKOPT  = "CSocket::Setsockopt()";    const char * SHUTDOWN    = "CSocket::Shutdown()";    const char * WAIT        = "CSocket::Wait()";}using namespace nsErrorReturnValues;using namespace nsErrorMessages;using namespace nsMethodNames;//----------------------------------------CSocket::CSocket(){	this->socketfd = -1;}CSocket::CSocket(int_socket sockfd){	this->socketfd = sockfd;}CSocket::CSocket(enuProtocol protocol){	this->socketfd = -1;	this->Open(protocol);}CSocket::~CSocket(){	if (this->IsOpened())	{		::close(this->socketfd);		this->socketfd = -1;	}}int_socket CSocket::OpenSocket(enuProtocol protocol){	int_socket tempsock;		tempsock = ::socket(AF_INET, protocol, 0);	if (tempsock == SOCKET_ERROR)	{		switch (errno)		{			case EPROTONOSUPPORT://				net_error_log(OPEN, "protocol no support", errno);				break;			case ENFILE://				net_error_log(OPEN, "not core mem to socket", errno);				break;			case EMFILE://				net_error_log(OPEN, "overflow process des_tbl", errno);				break;			default:				net_error_log(OPEN);				break;		}		return -1;	}	else	{//socket		int val;		val = fcntl(tempsock, F_GETFL, 0);		fcntl(tempsock, F_SETFL, val | O_NONBLOCK);				return tempsock;	}}bool CSocket::Open(enuProtocol protocol){	if (this->IsOpened())	{		net_error_log(OPEN, OPENED, OPENED_CODE);		return false;	}		this->socketfd = CSocket::OpenSocket(protocol);	if (!this->IsOpened()) return false;	else return true;}void CSocket::Close(int_socket& mysocket){	if (!CSocket::IsOpened(mysocket))	{		net_error_log(CLOSE, NOT_OPENED, NOT_OPENED_CODE);		return;	}	::close(mysocket);	mysocket = -1;	return;}void CSocket::Close(){	CSocket::Close(this->socketfd);	return;}bool CSocket::Bind(int_socket mysock, const sockaddr_in& addr){	int localError;		if (!CSocket::IsOpened(mysock))	{		net_error_log(BIND, NOT_OPENED, NOT_OPENED_CODE);		return false;	}		const sockaddr *socketAddress = reinterpret_cast<const sockaddr *>(&addr);	localError = ::bind(mysock, socketAddress, sizeof(addr));	if (localError == BIND_ERROR)	{		switch (errno)		{			default:				net_error_log(BIND);				break;		}		return false;	}	else return true;}bool CSocket::Bind(const sockaddr_in& addr){	bool result;	result = CSocket::Bind(this->socketfd, addr);	return result;}bool CSocket::Connect(int_socket mysock, const sockaddr_in& addr){	int localError;		if (!CSocket::IsOpened(mysock))	{		net_error_log(CONNECT, NOT_OPENED, NOT_OPENED_CODE);		return false;	}	const int val = fcntl(mysock, F_GETFL, 0);	fcntl(mysock, F_SETFL, val &(~ O_NONBLOCK));	localError = ::connect(mysock, (struct sockaddr *)&addr, sizeof(addr));	fcntl(mysock, F_SETFL, val | O_NONBLOCK);	if (localError == CONNECT_ERROR)	{//connect		switch (errno)		{			case EBADF://socket				net_error_log(CONNECT, "EBADF", errno);				break;			case ENOTSOCK://socket				net_error_log(CONNECT, "ENOTSOCK", errno);				break;			case EADDRNOTAVAIL://				net_error_log(CONNECT, "EADDRNOTAVAIL", errno);				break;			case EAFNOSUPPORT://socket				net_error_log(CONNECT, "EAFNOSUPPORT", errno);				break;			case EISCONN://				net_error_log(CONNECT, "EISCONN", errno);				break;			case ETIMEDOUT://				net_error_log(CONNECT, "ETIMEDOUT", errno);				break;			case ECONNREFUSED://				net_error_log(CONNECT, "RST ECONNREFUSED", errno);				break;			case ENETUNREACH://				net_error_log(CONNECT, "ENETUNREACH", errno);				break;			case EADDRINUSE://				net_error_log(CONNECT, "EADDRINUSE", errno);				break;			case EINPROGRESS://				net_error_log(CONNECT, "EINPROGRESS", errno);				break;			case EALREADY://				net_error_log(CONNECT, "EALREADY", errno);				break;			default:				net_error_log(CONNECT);		}		return false;	}	else return true;}bool CSocket::Connect(const sockaddr_in& addr){	bool result;	result = CSocket::Connect(this->socketfd, addr);	return result;}ssize_t CSocket::Send(int_socket mysock, const void * data, size_t size, unsigned int timeout, int flags){	ssize_t bytes;		if (!CSocket::IsOpened(mysock))	{		net_error_log(SEND, NOT_OPENED, NOT_OPENED_CODE);		return -1;	}	fd_set w_set;	struct timeval tv;	FD_ZERO(&w_set);	FD_SET(mysock, &w_set);	tv.tv_sec = timeout;	tv.tv_usec = 0;	if (select(mysock+1, NULL, &w_set, NULL, &tv) == 0) bytes = 0;	else bytes = ::send(mysock, data, size, flags);	if (bytes == SEND_ERROR) net_error_log(SEND);		return bytes;}ssize_t CSocket::Send(const void* data, size_t size, unsigned int timeout, int flags)// throw (CException){	ssize_t result;	result = CSocket::Send(this->socketfd, data, size, timeout, flags);	return result;}ssize_t CSocket::Sendto(int_socket mysock, const sockaddr_in& addr, const void * data, size_t size, unsigned int timeout, int flags){	ssize_t bytes;		if (!CSocket::IsOpened(mysock))	{		net_error_log(SENDTO, NOT_OPENED, NOT_OPENED_CODE);		return -1;	}		const sockaddr *socketAddress = reinterpret_cast<const sockaddr*>(&addr);	fd_set w_set;	struct timeval tv;	FD_ZERO(&w_set);	FD_SET(mysock, &w_set);	tv.tv_sec = timeout;	tv.tv_usec = 0;	if (select(mysock+1, NULL, &w_set, NULL, &tv) == 0) bytes = 0;	else bytes = ::sendto(mysock, data, size, flags, socketAddress, sizeof(addr));	if (bytes == SEND_ERROR) net_error_log(SENDTO);		return bytes;}ssize_t CSocket::Sendto(const sockaddr_in& addr, const void * data, size_t size, unsigned int timeout, int flags)// throw (CException){	ssize_t result;	result = CSocket::Sendto(this->socketfd, addr, data, size, timeout, flags);	return result;}ssize_t CSocket::Recv(int_socket mysock, void *data, size_t size, unsigned int timeout, int flags){	ssize_t bytes;		if (!CSocket::IsOpened(mysock))	{		net_error_log(RECV, NOT_OPENED, NOT_OPENED_CODE);		return -1;	}	fd_set r_set;	struct timeval tv;	FD_ZERO(&r_set);	FD_SET(mysock, &r_set);	tv.tv_sec = timeout;	tv.tv_usec = 0;	if (select(mysock+1, &r_set, NULL, NULL, &tv) == 0) bytes = 0;	else bytes = ::recv(mysock, data, size, flags);	if (bytes == RECV_ERROR) net_error_log(RECV);		return bytes;}ssize_t CSocket::Recv(void * data, size_t size, unsigned int timeout, int flags)// throw (CException){	ssize_t result;	result = CSocket::Recv(this->socketfd, data, size, timeout, flags);	return result;}ssize_t CSocket::Recvfrom(int_socket mysock, sockaddr_in& addr, void * data, size_t size, unsigned int timeout, int flags){	ssize_t bytes;		if (!CSocket::IsOpened(mysock))	{		net_error_log(RECVFROM, NOT_OPENED, NOT_OPENED_CODE);		return -1;	}	socklen_t addrLen = sizeof(addr);	sockaddr *socketAddress = reinterpret_cast<sockaddr *>(&addr);	fd_set r_set;	struct timeval tv;	FD_ZERO(&r_set);	FD_SET(mysock, &r_set);	tv.tv_sec = timeout;	tv.tv_usec = 0;	if (select(mysock+1, &r_set, NULL, NULL, &tv) == 0) bytes = 0;	else bytes = ::recvfrom(mysock, data, size, flags, socketAddress, &addrLen);	if (bytes == RECV_ERROR) net_error_log(RECVFROM);	return bytes;}ssize_t CSocket::Recvfrom(sockaddr_in& addr, void * data, size_t size, unsigned int timeout, int flags){	ssize_t result;	result = CSocket::Recvfrom(this->socketfd, addr, data, size, timeout, flags);	return result;}bool CSocket::Listen(int_socket mysock, int queuelen){	ssize_t localError;		if (!CSocket::IsOpened(mysock))	{		net_error_log(LISTEN, NOT_OPENED, NOT_OPENED_CODE);		return false;	}	localError = ::listen(mysock, queuelen);	if (localError == LISTEN_ERROR)	{		net_error_log(LISTEN);		return false;	}	else return true;}bool CSocket::Listen(int queuelen){	bool result;	result = CSocket::Listen(this->socketfd, queuelen);	return result;}int_socket CSocket::Accept(int_socket mysock, struct sockaddr_in* addr){	int_socket sfd;	bool main_pass = true;	bool returned = false;		struct timeval tv;	tv.tv_sec = 2;	tv.tv_usec = 0;	fd_set read_set;	FD_ZERO(&read_set);	FD_SET(mysock, &read_set);		if (!CSocket::IsOpened(mysock))	{		net_error_log(ACCEPT, NOT_OPENED, NOT_OPENED_CODE);		return -1;	}	socklen_t addrLen = sizeof(addr);	sockaddr *socketAddress = (struct sockaddr *)addr;//reinterpret_cast<sockaddr *>(&addr);	while (main_pass)	{		if (select(mysock+1, &read_set, NULL, NULL, &tv) == 0)		{			sfd = -1;			main_pass = false;			return sfd;		}		else		{			sfd = ::accept(mysock, socketAddress, &addrLen);			main_pass = false;			return sfd;		}		if (sfd == ACCEPT_ERROR)		{//accept			switch (errno)			{				case EINTR:					if (returned)					{						main_pass = false;						net_error_log(ACCEPT, "meet EINTR", errno);					}					else					{						returned = true;						main_pass = true;					}

⌨️ 快捷键说明

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