From 87156fa3adfa2e3232a6f6e612584aa8a4ebaea1 Mon Sep 17 00:00:00 2001 From: yy1717 <fctom1215@outlook.com> Date: 星期二, 19 一月 2021 18:40:25 +0800 Subject: [PATCH] 添加模拟灯光 --- lib/src/main/cpp/common/net.cpp | 354 ++++++++++++++++++++++++++++------------------------------ 1 files changed, 172 insertions(+), 182 deletions(-) diff --git a/lib/src/main/cpp/common/net.cpp b/lib/src/main/cpp/common/net.cpp index 3ea1083..4923c65 100644 --- a/lib/src/main/cpp/common/net.cpp +++ b/lib/src/main/cpp/common/net.cpp @@ -13,19 +13,77 @@ #include <arpa/inet.h> #include <regex> #include <pthread.h> +#include <semaphore.h> +#include <string> #include "net.h" #include "../jni_log.h" #define DEBUG(fmt, args...) LOGD("<net> <%s>: " fmt, __func__, ##args) +#define PARSE_BUFF_SIZE 4096 using namespace std; + +CTcpPort::CTcpPort() +{ + m_iServiceType = TYPE_CLIENT; + m_sIp.clear(); + m_nPort = 0; + m_connected = false; + m_pClientSocket = 0; + m_pServerSocket = 0; + + event_func = NULL; + event_func_context = NULL; + receive_data_func = NULL; + receive_data_func_context = NULL; +} + +CTcpPort::~CTcpPort() +{ + CloseTcpPort(); +} + +bool CTcpPort::IsOpen(void) +{ + if (m_iServiceType == TYPE_SERVER) { + if (m_pServerSocket > 0) { + return true; + } else { + return false; + } + } else { + if (m_pClientSocket > 0) { + return true; + } else { + return false; + } + } +} + +bool CTcpPort::OpenTcpPort(const char *ip, int port) +{ + if (IsOpen()) { + return true; + } + + m_sIp = ip; + m_nPort = port; + + pthread_t platform_pid; + pthread_attr_t attr; + pthread_attr_init(&attr); + pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);//detached + pthread_create(&platform_pid, &attr, TcpConnectThread, this); + + return true; +} /************************************************************* host_name:domain name net_addr:return numbers-and-dots notation */ -int GetHostIP(const char *host_name, char *net_addr) +int CTcpPort::GetHostIP(const char *host_name, char *net_addr) { struct hostent *hptr; char **pptr; @@ -68,7 +126,7 @@ return -2; } -static bool is_domain_name(const char *ip) +bool CTcpPort::is_domain_name(const char *ip) { regex pattern0("^((2(5[0-5]|[0-4]\\d))|[0-1]?\\d{1,2})(\\.((2(5[0-5]|[0-4]\\d))|[0-1]?\\d{1,2})){3}$"); string target(ip); @@ -76,7 +134,7 @@ return !regex_match(target, pattern0); } -static int socket_set_keepalive(int fd) +int CTcpPort::socket_set_keepalive(int fd) { int alive, idle, cnt, intv; @@ -133,7 +191,7 @@ return 0; } -static int tcp_connect(char *ip, uint16_t port) +int CTcpPort::tcp_connect(char *ip, uint16_t port) { struct sockaddr_in server_sockaddr; int soc; @@ -259,51 +317,116 @@ return( -1 ); } -static int udp_connect(const char *ip, uint16_t port) { - struct sockaddr_in server_sockaddr; - int soc; - int opt; - int arg; +void *CTcpPort::TcpConnectThread(void *p) +{ + CTcpPort *pCTcpPort = (CTcpPort *)p; - if ((soc = socket(PF_INET, SOCK_DGRAM, 0)) == -1) { - return -1; + char net_addr[32] = {0}; + + if (pCTcpPort->is_domain_name(pCTcpPort->m_sIp.c_str())) { + if (pCTcpPort->GetHostIP(pCTcpPort->m_sIp.c_str(), net_addr) != 0) { + goto CONNECT_END; + } + } else { + strcpy(net_addr, pCTcpPort->m_sIp.c_str()); } - /*Enable send broadcast packet*/ - opt = 1; - if (setsockopt(soc, SOL_SOCKET, SO_BROADCAST, &opt, sizeof(opt)) != 0) { - perror("setsockopt"); - close(soc); - return -1; + pCTcpPort->m_pClientSocket = pCTcpPort->tcp_connect(net_addr, pCTcpPort->m_nPort); + + if (pCTcpPort->m_pClientSocket > 0) { + if (pCTcpPort->event_func != NULL) { + pCTcpPort->event_func(0, pCTcpPort, pCTcpPort->event_func_context); + } + + pthread_t platform_pid; + pthread_attr_t attr; + pthread_attr_init(&attr); + pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);//detached + pthread_create(&platform_pid, &attr, TcpListenThread, p); + } else { + if (pCTcpPort->event_func != NULL) { + pCTcpPort->event_func(-1, pCTcpPort, pCTcpPort->event_func_context); + } } - // Set non-blocking - if( (arg = fcntl(soc, F_GETFL, NULL)) < 0 ) { - close(soc); - return -1; - } - - if ( fcntl(soc, F_SETFL, arg | O_NONBLOCK) < 0 ) { - close(soc); - return -1; - } - - server_sockaddr.sin_family = AF_INET; - server_sockaddr.sin_addr.s_addr = inet_addr(ip);//htonl(INADDR_ANY); - server_sockaddr.sin_port = htons(port); - bzero(&server_sockaddr.sin_zero, 8); - - return soc; +CONNECT_END: + pthread_exit(NULL); } -int WriteTCP(int fd, const uint8_t * buf, uint32_t len) +void *CTcpPort::TcpListenThread(void *p) +{ + int fds_ret; + struct timeval tv; + fd_set rdfds; + fd_set exfds; + uint8_t RxBuf[PARSE_BUFF_SIZE]; + + CTcpPort *pCTcpPort = (CTcpPort *)p; + + while (pCTcpPort->m_pClientSocket > 0) { + tv.tv_sec = 5; + tv.tv_usec = 0; + FD_ZERO(&rdfds); //clean + FD_SET(pCTcpPort->m_pClientSocket, &rdfds); //set + + fds_ret = select(pCTcpPort->m_pClientSocket + 1, &rdfds, NULL, NULL, &tv); + + if (fds_ret < 0) { + break; + } else if(fds_ret == 0) { + //Occur failure(such as line disconnect) + } else if(FD_ISSET(pCTcpPort->m_pClientSocket, &rdfds)) { + int recvLen = recv(pCTcpPort->m_pClientSocket, RxBuf, sizeof(RxBuf), 0); + + if (recvLen == 0) { + LOGW("tcp error TCP disconnected 0 errno = %d", errno); + break; + } else if (recvLen < 0) { + if (errno == EINTR || errno == EWOULDBLOCK || errno == EAGAIN) { + + } else { + LOGW("tcp error TCP disconnected errno = %d", errno);; + break; + } + } + + if (recvLen > 0) { + if (pCTcpPort->receive_data_func != NULL) { + pCTcpPort->receive_data_func(RxBuf, recvLen, pCTcpPort, pCTcpPort->receive_data_func_context); + } + } + } + } + + pCTcpPort->CloseTcpPort(); + + if (pCTcpPort->event_func) { + pCTcpPort->event_func(-1, pCTcpPort, pCTcpPort->event_func_context); + } + + pthread_exit(NULL); +} + +void CTcpPort::set_event_callback(void (*callback)(int, void *, void *), void *context) +{ + event_func = callback; + event_func_context = context; +} + +void CTcpPort::set_data_callback(void (*callback)(void *, int, void *, void *), void *context) +{ + receive_data_func = callback; + receive_data_func_context = context; +} + +int CTcpPort::WriteTCP(const uint8_t * buf, uint32_t len) { int ret = 0; int fds_ret; struct timeval tv; fd_set rdfds; - if (fd < 0) + if (m_pClientSocket <= 0) return -2; /******************************************************* @@ -314,9 +437,9 @@ tv.tv_usec = 0; FD_ZERO(&rdfds); //clean - FD_SET(fd, &rdfds); //set + FD_SET(m_pClientSocket, &rdfds); //set - fds_ret = select(fd + 1, NULL, &rdfds, NULL, &tv); + fds_ret = select(m_pClientSocket + 1, NULL, &rdfds, NULL, &tv); if (fds_ret < 0) { DEBUG("tcp error send select error"); @@ -325,8 +448,8 @@ DEBUG("tcp error Occur failure(such as line disconnect)"); //Occur failure(such as line disconnect) ret = -1; - } else if(FD_ISSET(fd, &rdfds)) { - ret = send(fd, buf, len, 0); + } else if(FD_ISSET(m_pClientSocket, &rdfds)) { + ret = send(m_pClientSocket, buf, len, 0); if(ret == -1) { DEBUG("tcp error TCP Send Error"); } @@ -337,148 +460,15 @@ return ret; } -int ReadTCP(int fd, uint8_t * buf, uint32_t len) +bool CTcpPort::CloseTcpPort(void) { - if (fd < 0) { - return -2; + DEBUG("DisconnectTCP fd = %d", m_pClientSocket); + + if (m_pClientSocket > 0) { + shutdown(m_pClientSocket, SHUT_RDWR); + close(m_pClientSocket); + m_pClientSocket = 0; + return true; } - - int recvLen = recv(fd, buf, len, 0); //read socket data from server - - if (recvLen == 0) { - LOGW("tcp error TCP disconnected 0 errno = %d", errno); - return -1; - } else if (recvLen < 0) { - if (errno == EINTR || errno == EWOULDBLOCK || errno == EAGAIN) { - return 0; - } else { - LOGW("tcp error TCP disconnected errno = %d", errno);; - return -1; - } - } - - return recvLen; -} - -int ConnectTCP(const char *ip, uint16_t port) -{ - char net_addr[32] = {0}; - - if (is_domain_name(ip)) { - if (GetHostIP(ip, net_addr) != 0) { - return -3; - } - } else { - strcpy(net_addr, ip); - } - - return tcp_connect(net_addr, port); -} - -void DisconnectTCP(int fd) -{ - DEBUG("DisconnectTCP fd = %d", fd); - if (fd >= 0) { - shutdown(fd, SHUT_RDWR); - close(fd); - } -} - -int EstablishUDP(const char *ip, uint16_t port) -{ - char net_addr[32] = {0}; - - if (is_domain_name(ip)) { - if (GetHostIP(ip, net_addr) != 0) { - return -3; - } - } else { - strcpy(net_addr, ip); - } - - return udp_connect(net_addr, port); -} - -void RemoveUDP(int fd) -{ - close(fd); -} - -int WriteUDP(int fd, char *ip, uint16_t port, const uint8_t * buf, uint32_t len) -{ - int ret = 0; - int fds_ret; - struct timeval tv; - fd_set rdfds; - - if (fd < 0) - return -2; - - /******************************************************* - TCP send with nonblock, if occur failure(such as line disconnect...), - will send timeout, so terminate TCP. - */ - tv.tv_sec = 5; - tv.tv_usec = 0; - - FD_ZERO(&rdfds); //clean - FD_SET(fd, &rdfds); //set - - fds_ret = select(fd + 1, NULL, &rdfds, NULL, &tv); - - if (fds_ret < 0) - { - DEBUG("UDP send select error"); - return -1; - } - else if(fds_ret == 0) - { - DEBUG("Occur failure(such as line disconnect)"); - ret = -1; - } - else if(FD_ISSET(fd, &rdfds)) - { - struct sockaddr_in server_sockaddr; - - server_sockaddr.sin_family = AF_INET; - server_sockaddr.sin_addr.s_addr = inet_addr(ip);//htonl(INADDR_ANY); - server_sockaddr.sin_port = htons(port); - bzero(&server_sockaddr.sin_zero, 8); - - ret = sendto(fd, buf, len, 0, (struct sockaddr *)&server_sockaddr, sizeof(struct sockaddr_in)); - - if(ret == -1) - { - DEBUG("UDP Send Error"); - } - } - else - { - DEBUG("UDP send has error\n"); - } - - return ret; -} - -int ReadUDP(int fd, uint8_t * buf, uint32_t len) -{ - struct sockaddr_in from_addr; - socklen_t from_len; - - int recvLen = recvfrom(fd, buf, len, 0, - (struct sockaddr *) &from_addr, - &from_len);//read socket data from server// - - if (recvLen == 0) { - return 0; - } else if (recvLen < 0) { - if (errno == EINTR || errno == EWOULDBLOCK || errno == EAGAIN) { - return 0; - } else { - DEBUG("UDP ERROR!! = %d", errno); - return -1; - } - } - - return recvLen; + return false; } -- Gitblit v1.8.0