From 195bef0e6f6a33d702e53be8bc609482e65617ab Mon Sep 17 00:00:00 2001 From: Tindy X <49061470+tindy2013@users.noreply.github.com> Date: Sun, 25 Jul 2021 22:56:03 +0800 Subject: [PATCH] Clean up codes --- src/main.cpp | 179 +++++++++++++++++---------------------------------- 1 file changed, 59 insertions(+), 120 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index eae22f0..2c1cca3 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -21,21 +21,13 @@ size_t tcp_receive_threshold = 48; std::atomic_bool EXIT_FLAG {false}, CONNECTED {false}; -int setTimeout(SOCKET s, int timeout) +void socketSetTimeout(SOCKET sHost, int timeout) { - int ret = -1; -#ifdef _WIN32 - ret = setsockopt(s, SOL_SOCKET, SO_SNDTIMEO, (char*)&timeout, sizeof(int)); - ret = setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, (char*)&timeout, sizeof(int)); -#else - struct timeval timeo = {timeout / 1000, (timeout % 1000) * 1000}; - ret = setsockopt(s, SOL_SOCKET, SO_SNDTIMEO, (const char*)&timeo, sizeof(timeo)); - ret = setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, (const char*)&timeo, sizeof(timeo)); -#endif - return ret; + setsockopt(sHost, SOL_SOCKET, SO_SNDTIMEO, (char*)&timeout, sizeof(int)); + setsockopt(sHost, SOL_SOCKET, SO_RCVTIMEO, (char*)&timeout, sizeof(int)); } -int socket_bind(SOCKET sHost, long addr, uint16_t port) +int socketBind(SOCKET sHost, long addr, uint16_t port) { sockaddr_in srcaddr = {}; memset(&srcaddr, 0, sizeof(srcaddr)); @@ -45,22 +37,27 @@ int socket_bind(SOCKET sHost, long addr, uint16_t port) return bind(sHost, reinterpret_cast(&srcaddr), sizeof(srcaddr)); } -int udp_broadcast(SOCKET sHost, uint16_t port, const std::string &data) +sockaddr_in makeBroadcastAddr(uint16_t port) { struct sockaddr_in addr = {}; addr.sin_family = AF_INET; addr.sin_addr.s_addr = htonl(INADDR_BROADCAST); addr.sin_port = htons(port); - return sendto(sHost, data.data(), data.size(), 0, reinterpret_cast(&addr), sizeof(addr)); + return addr; } -int udp_send(SOCKET sHost, const std::string &dst_host, uint16_t dst_port, const std::string &data) +sockaddr_in makeIPv4Addr(const std::string &host, uint16_t port) { struct sockaddr_in addr = {}; addr.sin_family = AF_INET; - inet_pton(AF_INET, dst_host.data(), (struct in_addr *)&addr.sin_addr.s_addr); - addr.sin_port = htons(dst_port); - return sendto(sHost, data.data(), data.size(), 0, reinterpret_cast(&addr), sizeof(addr)); + inet_pton(AF_INET, host.data(), (struct in_addr *)&addr.sin_addr.s_addr); + addr.sin_port = htons(port); + return addr; +} + +int socketSendTo(SOCKET sHost, const sockaddr_in &addr, const std::string &data) +{ + return sendto(sHost, data.data(), data.size(), 0, reinterpret_cast(&addr), sizeof(addr)); } std::string getTime(int type) @@ -97,11 +94,12 @@ void printErr(const char* format, Args... args) fprintf(stderr, format, args...); } -void UDPLEDBroadcast(SOCKET sHost, const IPCMemoryInfo* memory) +void threadLEDBroadcast(SOCKET sHost, const IPCMemoryInfo* memory) { static std::string previous_status; static int skip_count = 0; static std::string head = "\x63LED"; + auto addr = makeIPv4Addr(remote_address, remote_port); while(!EXIT_FLAG) { if(!CONNECTED) { @@ -113,13 +111,10 @@ void UDPLEDBroadcast(SOCKET sHost, const IPCMemoryInfo* memory) bool same = true; if(!previous_status.empty()) { - for(int i = 0; i < 32 * 3; i++) + if(memcmp(previous_status.data(), current_status.data(), previous_status.size()) != 0) { - if(previous_status[i] != current_status[i]) - { - same = false; - break; - } + same = false; + break; } } else @@ -128,88 +123,11 @@ void UDPLEDBroadcast(SOCKET sHost, const IPCMemoryInfo* memory) if(!same) { current_status.insert(0, head); - //if(udp_broadcast(sHost, server_port, current_status) < 0) - if(udp_send(sHost, remote_address, remote_port, current_status) < 0) - { - //std::cerr<<"cannot send broadcast: error " + std::to_string(GetLastError()) + "\n"; - printErr("[ERROR] Cannot send packet: error %lu\n", GetLastError()); - } - skip_count = 0; - } - else - { - if(++skip_count > 50) - { - current_status.insert(0, head); - //if(udp_broadcast(sHost, server_port, current_status) < 0) - if(udp_send(sHost, remote_address, remote_port, current_status) < 0) - { - //std::cerr<<"cannot send broadcast: error " + std::to_string(GetLastError()) + "\n"; - printErr("[ERROR] Cannot send packet: error %lu\n", GetLastError()); - } - skip_count = 0; - } - } - Sleep(10); - } -} - -void TCPLEDBroadcast(SOCKET sHost, const IPCMemoryInfo* memory) -{ - static std::string previous_status; - static int skip_count = 0; - static std::string head = "\x63LED"; - while(!EXIT_FLAG) - { - if(!CONNECTED) { - Sleep(50); - continue; - } - std::string current_status; - current_status.assign(reinterpret_cast(memory->ledRgbData), sizeof(memory->ledRgbData)); - bool same = true; - if(!previous_status.empty()) - { - for(int i = 0; i < 32 * 3; i++) - { - if(previous_status[i] != current_status[i]) - { - same = false; - break; - } - } - } - else - same = false; - previous_status = current_status; - if(!same) - { - current_status.insert(0, head); - if(send(sHost, current_status.data(), current_status.size(), 0) < 0) + if(socketSendTo(sHost, addr, current_status) < 0) { printErr("[Error] Cannot send packet: error %lu\n", GetLastError()); - if(errno == EINTR || errno == EWOULDBLOCK || errno == EAGAIN) + if(tcp_mode) { - continue; - } - else - { - printErr("[INFO] Device disconnected!\n"); - CONNECTED = false; - EXIT_FLAG = true; - break; - } - } - skip_count = 0; - } - else - { - if(++skip_count > 50) - { - current_status.insert(0, head); - if(udp_send(sHost, remote_address, remote_port, current_status) < 0) - { - printErr("[ERROR] Cannot send packet: error %lu\n", GetLastError()); if(errno == EINTR || errno == EWOULDBLOCK || errno == EAGAIN) { continue; @@ -222,6 +140,32 @@ void TCPLEDBroadcast(SOCKET sHost, const IPCMemoryInfo* memory) break; } } + } + skip_count = 0; + } + else + { + if(++skip_count > 50) + { + current_status.insert(0, head); + if(socketSendTo(sHost, addr, current_status) < 0) + { + printErr("[ERROR] Cannot send packet: error %lu\n", GetLastError()); + if(tcp_mode) + { + if(errno == EINTR || errno == EWOULDBLOCK || errno == EAGAIN) + { + continue; + } + else + { + printErr("[INFO] Device disconnected!\n"); + CONNECTED = false; + EXIT_FLAG = true; + break; + } + } + } skip_count = 0; } } @@ -350,11 +294,12 @@ void printCardInfo(uint8_t cardType, uint8_t *cardId) } } -void InputReceive(SOCKET sHost, IPCMemoryInfo *memory) +void threadInputReceive(SOCKET sHost, IPCMemoryInfo *memory) { char recv_buffer[tcp_buffer_size]; char buffer[BUFSIZ]; std::string remains; + auto addr = makeIPv4Addr(remote_address, remote_port); while(!EXIT_FLAG) { int recv_len, real_len; @@ -458,7 +403,7 @@ void InputReceive(SOCKET sHost, IPCMemoryInfo *memory) std::string response; response.assign(buffer, 12); response.replace(2, 1, "O"); - udp_send(sHost, remote_address, remote_port, response); + socketSendTo(sHost, addr, response); } else if(packet_len >= sizeof(PacketCard) && buffer[1] == 'C' && buffer[2] == 'R' && buffer[3] == 'D') { @@ -557,16 +502,12 @@ int main(int argc, char* argv[]) printErr("[INFO] Mode: UDP\n"); SOCKET sHost = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); defer(closesocket(sHost)) - setTimeout(sHost, 2000); - int broadcastEnable = 1; - setsockopt(sHost, SOL_SOCKET, SO_BROADCAST, reinterpret_cast(&broadcastEnable), sizeof(broadcastEnable)); - socket_bind(sHost, htonl(INADDR_ANY), server_port); - //std::cout << "Waiting for device on port " << server_port << "..." << std::endl; + socketSetTimeout(sHost, 2000); + socketBind(sHost, htonl(INADDR_ANY), server_port); printErr("[INFO] Waiting for device on port %d...\n", server_port); - auto LEDThread = std::thread(UDPLEDBroadcast, sHost, memory); - auto InputThread = std::thread(InputReceive, sHost, memory); + auto LEDThread = std::thread(threadLEDBroadcast, sHost, memory); + auto InputThread = std::thread(threadInputReceive, sHost, memory); while(_getwch() != L'q'); - //std::cout << "Exiting gracefully..." << std::endl; printErr("[INFO] Exiting gracefully...\n"); last_input_packet_id = 0; EXIT_FLAG = true; @@ -580,8 +521,8 @@ int main(int argc, char* argv[]) printErr("[INFO] TCP receive threshold: %" PRIu32 "\n", tcp_receive_threshold); SOCKET sHost = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); defer(closesocket(sHost)); - setTimeout(sHost, 50); - socket_bind(sHost, htonl(INADDR_ANY), server_port); + socketSetTimeout(sHost, 50); + socketBind(sHost, htonl(INADDR_ANY), server_port); listen(sHost, 10); while(true) { @@ -598,12 +539,10 @@ int main(int argc, char* argv[]) } CONNECTED = true; EXIT_FLAG = false; - auto LEDThread = std::thread(TCPLEDBroadcast, acc_socket, memory); - auto InputThread = std::thread(InputReceive, acc_socket, memory); - //while(_getwch() != L'q'); + auto LEDThread = std::thread(threadLEDBroadcast, acc_socket, memory); + auto InputThread = std::thread(threadInputReceive, acc_socket, memory); LEDThread.join(); InputThread.join(); - //std::cout << "Exiting gracefully..." << std::endl; printErr("[INFO] Exiting gracefully...\n"); last_input_packet_id = 0; EXIT_FLAG = true;