From fa29bd6c10d8ad77d67e33d34606a36840415f93 Mon Sep 17 00:00:00 2001 From: yhy Date: Mon, 23 Dec 2024 19:13:35 +0800 Subject: [PATCH] =?UTF-8?q?net=5Faddress=20=E5=B0=81=E8=A3=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- includes/net/net_address.hpp | 30 +++++++++++++++ src/net/net_address.cc | 72 ++++++++++++++++++++++++++++++++++++ 2 files changed, 102 insertions(+) create mode 100644 includes/net/net_address.hpp create mode 100644 src/net/net_address.cc diff --git a/includes/net/net_address.hpp b/includes/net/net_address.hpp new file mode 100644 index 0000000..29b49de --- /dev/null +++ b/includes/net/net_address.hpp @@ -0,0 +1,30 @@ +#pragma once +#include +#include +#include +#include +namespace tinyrpc { + + class NetAddress { + + public: + NetAddress() = delete; + NetAddress(const std::string ip, uint16_t port); + NetAddress(uint16_t port); + NetAddress(const sockaddr_in* addr); + std::string toString() const; + const sockaddr* getSockaddr() const { + return reinterpret_cast(&m_addr_in); + } + socklen_t getSockLen() const {return sizeof m_addr_in;} + ~NetAddress(); + + + static bool checkIpString(const std::string& ip); + private: + std::string m_ip{"None"}; + uint16_t m_port{}; + sockaddr_in m_addr_in{}; + }; + +} \ No newline at end of file diff --git a/src/net/net_address.cc b/src/net/net_address.cc new file mode 100644 index 0000000..4d17821 --- /dev/null +++ b/src/net/net_address.cc @@ -0,0 +1,72 @@ +#include "net_address.hpp" +#include "logger.hpp" +#include +#include +#include +#include +#include +#include + + +namespace tinyrpc { + + NetAddress::NetAddress(const std::string ip, uint16_t port) : m_ip(ip), m_port(port){ + m_addr_in.sin_family = AF_INET; + inet_pton(AF_INET, ip.c_str(), &m_addr_in.sin_addr.s_addr); + m_addr_in.sin_port = htons(port); + logger() << "NetAddress created:" << toString(); + } + + NetAddress::NetAddress(uint16_t port) : m_ip("0.0.0.0"), m_port(port){ + m_addr_in.sin_family = AF_INET; + m_addr_in.sin_addr.s_addr = INADDR_ANY; + m_addr_in.sin_port = htons(port); + logger() << "NetAddress created:" << toString(); + } + + NetAddress::NetAddress(const sockaddr_in* addr) { + assert(addr); + memcpy(&m_addr_in, addr, sizeof(sockaddr_in)); + char buf[16]{}; + m_ip = inet_ntop(AF_INET, &addr->sin_addr.s_addr, buf, sizeof(buf)); + m_port = ntohs(addr->sin_port); + logger() << "NetAddress created from sockaddr_in:" << toString(); + } + + NetAddress::~NetAddress(){ + + } + + std::string NetAddress::toString() const{ + std::stringstream ss; + ss << m_ip << ":" << m_port; + return ss.str(); + } + + bool NetAddress::checkIpString(const std::string& ip) { + // 192.168.1.1 + int num_stat = 0; // 0-3 + int dot_stat = 0; // 0-3 + + for(char ch : ip) { + if(std::isdigit(ch)) { + if(dot_stat < 0 || dot_stat > 3) { + return false; + } + num_stat += 1; + if(num_stat > 3) return false; + } else if(ch == '.'){ + if(num_stat < 1 || num_stat > 3) { + return false; + } + dot_stat += 1; + num_stat = 0; + if(dot_stat > 3) return false; + } else { + return false; + } + + } + return true; + } +} \ No newline at end of file