跨平台Socket封装——对IPv4地址的封装

socket编程:socket()函数详解 文章目录1. 什么是socket?1.1 意义1.2 本质1.3 应用1.4 结论2. socket() 函数参数介绍2.1 参数1:int af2.2 参数2:int type2.3 参数3:int protocol3. socket()函数返回值介绍 1. 什么是socket? 套接字函数创建一个绑定到特定传输服务提供者的套接字。 将底层复杂的协议体系,执行流程,进行了封装,封装完的结果,就是一个SOCKET了,也就是说,SOCKET是我们调用协议进行通信的操作接口。 1.1 意义 将复杂的协议过程与我 阅读详情

IPv4地址的封装主要是对sockadr_in的封装, 这是别人写的一个跨平台的代码,觉得不错,故记录下来。如果您看到代码,觉得还有改进的地方,可以说出来分享一下。
头文件SocketAddress.h

namespace LinWin
{
#define NET_DEFAULT_IP "0.0.0.0"
class CSocketAddress
{
private:
sockaddr_in m_addr;
public:
CSocketAddress(const char *ip = NET_DEFAULT_IP, unsigned short port = 0);
CSocketAddress(const sockaddr_in &addr);
CSocketAddress(const CSocketAddress &addr);
CSocketAddress& operator=(const CSocketAddress &addr);
virtual ~CSocketAddress();
public:
inline const struct sockaddr_in* GetAddress() const
{   return &m_addr; }

//添加一个非const版本的GetAddress函数
inline struct sockaddr_in* GetAddress()
{   return &m_addr; }

inline void SetAddress(const struct sockaddr_in addr)
{   m_addr = addr;  }

inline unsigned int AddressLength() const
{   return sizeof(struct sockaddr_in);  }

inline int GetFamily() const
{   return m_addr.sin_family;   }

inline void SetFamily(int fam)
{   m_addr.sin_family = fam;    }

virtual unsigned int GetHost() const
{   return m_addr.sin_addr.s_addr;  }

inline void SetHost(unsigned int addr)
{   m_addr.sin_addr.s_addr = addr;  }

inline unsigned short GetPort() const
{   return m_addr.sin_port; }

inline void SetPort(unsigned short p)
{   m_addr.sin_port = p;    }

virtual int Parse(const std::string& addrStr);
virtual int Parse(const std::string& addr, int port);
virtual std::string ToString() const;
};
}

实现文件SocketAddress.cpp

LinWin::CSocketAddress::CSocketAddress(const char *ip, unsigned short port)
{
    memset(&m_addr, 0, sizeof(sockaddr_in));
    m_addr.sin_family = AF_INET;
    m_addr.sin_addr.s_addr = inet_addr(ip);
    m_addr.sin_port = htons(port);
}

LinWin::CSocketAddress::CSocketAddress(const struct sockaddr_in& addr) : m_addr(addr)
{}

LinWin::CSocketAddress::CSocketAddress(const CSocketAddress& addr) : m_addr(addr.m_addr)
{}

LinWin::CSocketAddress::~CSocketAddress()
{}

LinWin::CSocketAddress& LinWin::CSocketAddress::operator=(const CSocketAddress& addr)
{
    if (&addr != this)
    {
        m_addr = addr.m_addr;
    }
    return *this;
}

std::string LinWin::CSocketAddress::ToString() const
{
    unsigned short port = ntohs(m_addr.sin_port);
    std::string result = inet_ntoa(m_addr.sin_addr);
    char buf[8];
    sprintf(buf, ":%d", port);
    result += buf;

    return result;
}

int LinWin::CSocketAddress::Parse(const std::string& addrStr)
{
    size_t i;
    unsigned short port = 0;
    size_t index = addrStr.find(":");
    if (index == std::string::npos || (index + 1) == addrStr.length())
        return -1;

    const char* pData = addrStr.c_str();
    i = 0;
    while (isspace(pData[i]))
        i++;
    std::string tmp;
    while (!isspace(pData[i]) && i < index)
    {
        tmp.push_back(pData[i]);
        i++;
    }
    struct hostent *hostip = ::gethostbyname(tmp.c_str());
    if (hostip == NULL)
        return -1;

    i = index + 1;
    while (!isdigit(pData[i]) && i < addrStr.length())
        i++;
    port = atoi(pData + i);

    memset(&m_addr, 0, sizeof(const struct sockaddr_in));
    m_addr.sin_family = AF_INET;
    memcpy((char*)&m_addr.sin_addr, hostip->h_addr, hostip->h_length);
    m_addr.sin_port = htons(port);

    return 0;
}

int LinWin::CSocketAddress::Parse(const std::string& addr, int port)
{
    struct hostent *hostip = ::gethostbyname(addr.c_str());
    if (hostip == NULL)
        return -1;
    memset(&m_addr, 0, sizeof(const struct sockaddr_in));
    m_addr.sin_family = AF_INET;
    memcpy((char*)&m_addr.sin_addr, hostip->h_addr, hostip->h_length);
    m_addr.sin_port = htons(port);

    return 0;
}

命名空间是我自己添加的,如果不需要可以去掉。整体的代码是比较简单的,就是类的基础知识和socketaddr_in结构体的使用。类中留有两个接口,一个是解析像这样”域名 + 端口号”(如”www.baidu.com:80”)形式的接口;一个是输出”IP + 端口”(如”192.168.0.1:80”)这样的形式的接口。想要修改这两个接口,可以直接继承,在子类中重写这个接口。
新增一个接口,是把“域名”和“端口号”作为两个参数传入。

封装TCP socket 封装TCP socket 对字节序转化函数、网络地址、Socket操作函数、监听套接字和连接套接字进行了封装,部分代码参考自muduo网络库 源码地址:https://github.com/liuyunian/tools-cxx/tree/master/tools/socket 字节序转化函数 对于字节序转化函数,Unix和Linux共同拥有的是htonl(), htons(), ntohl(),... 阅读详情

相关推荐

Socket地址结构解析

Socket地址结构解析Socket地址结构简介  Socket的地址结构里封装了通信一方的地址及端口信息,这些信息在应用程序以及内核之间会进行传递,为建立Socket提供必要的信息。这里介绍四种socket地址结构,分别是IPv4 socket地址结构、IPv6 socket地址结构、通用socket地址结构、新通用socket地址结构。IPv4地址结构  在< netinet/in.h >头文件

u012069890的博客 1057

跨平台Socket封装

为什么80%的码农都做不了架构师?>>> ...

weixin_34203832的博客 359

C++ socket 基本功能跨平台封装(好用)

真正可以使用的平台无关性的 C++ socket wrapper,没有做任何多余的事情,仅仅对 socket 的基本功能进行了平台无关性的封装,简洁原生。封装了:setoption, connect, close, send, recv, sendto, recvfrom, accept,bind 等基本方法。C++11 标准,macos/linux/windows 均进行了完全测试。

c++ 跨平台封装socket

odsocket.h: /*    * define file about portable socket class.     * description:this sock is suit both windows and linux    *     */    #ifndef _ODSOCKET_H_   #define _ODSOCKET_H_    #ifd

weihongchang的专栏 2209

MPC模型预测控制实战:从理论到代码实现(Python示例)

本文详细介绍了MPC模型预测控制的实战应用,从理论到Python代码实现。通过构建系统模型、预测方程、优化问题及约束处理,展示了如何实现一个完整的MPC控制器。文章还提供了水箱液位控制的应用案例,帮助读者掌握MPC在工业控制中的实际应用。

weixin_42653691的博客 460

vsomeip3 双机通信文件配置

验证环境 vsomeip地址Android运行命令,红色的地方需要和配置文件一样Linux运行命令,红色的地方需要和配置文件一样Linux service配置文件 ,红色的地方需要更改Android client配置文件,红色的地方需要更改,蓝色的地方可不要 ...

m0_37132481的博客 5223

socket之网络通信

对TCP/IP、UDP、Socket编程这些词你不会很陌生吧?随着网络技术的发展,这些词充斥着我们的耳朵。那么我想问: 1.什么是TCP/IP、UDP? 2.Socket在哪里呢? 3.Socket是什么呢? 4.你会使用它们吗?1.什么是TCP/IP、UDP? TCP/IP(Transmission Co...

Zehpyr的博客 663

STM32内存大小与地址的对应关系以及计算方法

1、概述 在计算机中要访问存储区,都是通过地址来进行访问的,包括所有的外设(比如串口、内存、硬盘等),都对应有一个访问地址,地址就相当于门牌号,有了门牌号,我们才知道操作的是哪一个区域、哪一个外设。 最被大家熟知的是计算机内存,计算机内存有4G、8G,16G等等,对于程序员而言,要在代码中操作这些内存,肯定得知道内存的地址,此外,还需要会计算地址与内存大小的计算方法与对应关系。STM32作为微

Ace's Blog 4万+

(P6)socket编程一:什么是socket ,IPv4套接字地址结构 ,网络字节序 ,字节序转换函数 ,地址转换函数 ,套接字类型

文章目录 应用层Application 传输层:TCP,UDP 网络层:IP,路由器工作在网络层 数据链路层:Channel,eg以太网链路 解封装: 以太网接收到数据帧要向上层传递,会依据数据帧中的类型字段进行传递 ,如果是arp,则传递给链路层的arp协议去处理,如果是ip,则传递给网络层的ip协议去处理。 ip协议头部也有类型,拖类型是tcp,则传递给tcp去处理,并且去掉ip头部,接着再传输给应用层,根据端口号传递给对应的应用程序,最后去掉tcp的头部。 0500 ...

喜欢打篮球的普通人 808

速腾聚创多激光雷达点云采集,并用RVIZ进行显示

在ubuntu20.04系统下,使用速腾聚创官方提供的软件RSView,对激光雷达的默认IP地址、MSOP 包端口号、 DIFOP包端口号和时间模式等配置进行查看和修改。使用交换机对两个激光雷达进行组网,实现多激光雷达数据采集,并用RVIZ同时显示两个雷达点云。使用wireshark对比两个雷达数据包。

abanchao的博客 5888

告别瞎猜!用通达信/同花顺这些资金流向函数,一眼看穿主力动向(附实战公式)

本文详细解析了通达信/同花顺资金流向函数的实战应用,帮助投资者精准识别主力动向。通过12个核心资金函数的组合逻辑,构建主力行为监控体系,避免未来函数陷阱,识别主力对倒行为,并提前捕捉异动。适合股票投资者提升自选股分析能力。

weixin_42522964的博客 1216

Socket总结

Java中的socket网络编程

qq_40229166的博客 1040

机器人运动不流畅?手把手教你用ACCSET调整ABB/FANUC点位加速度

本文针对ABB和FANUC工业机器人运动不流畅、拐角抖动、到位震颤等常见问题,提供了详细的解决方案。核心在于使用ACCSET指令(ABB)或ACC选项(FANUC)调整机器人的点位加速度与减速度参数。文章通过实战案例与系统化调试流程,手把手指导工程师优化运动性能,实现平稳、精准的机器人运动控制。

gpu4optimizer的博客 284

Linux 网络(1)

OSI 七层模型是国际标准化组织(ISO)制定的网络通信分层架构参考标准,核心是将网络通信的复杂流程拆分为 7 个独立层级,每层负责特定功能,上下层之间通过接口协作,实现跨系统的标准化通信。

Starry_tsx的博客 2012

电机系列(1) - foc最基本原理、clark变换 、park变换、附代码

什么是FOC? FOC(Field-Oriented Control),直译是磁场定向控制,也被称作矢量控制 (VC,Vector Control) ,是目前无刷直流电机(BLDC)和永磁同步电机(PMSM)高效控制的最优方法之一。FOC旨在通过精确地控制磁场大小与方向,使得电机的运动转矩平稳、噪声小、效率高,并且具有高速的动态响应。 简单来说就是,FOC是一种对无刷电机的驱动控制方法,它可以让我们对无刷电机进行 “像素级” 控制,实现很多传统电机控制方法所无法达到的效果。 因为所谓的“矢量控制”其实就是

nepqiu的博客 7万+

YOLOv11改进 | 注意力篇 | YOLOv11引入CBAM注意力机制

我们的实验表明各种模型的分类和检测性能得到了一致的改进,证明了 CBAM 的广泛适用性。简单介绍:CBAM的主要思想是通过关注重要的特征并抑制不必要的特征来增强网络的表示能力。模块首先应用通道注意力,关注"重要的"特征,然后应用空间注意力,关注这些特征的"重要位置"。到此本文的正式分享内容就结束了,在这里给大家推荐我的YOLOv11改进有效涨点专栏,本专栏目前为新开的,后期我会根据各种前沿顶会进行论文复现,也会对一些老的改进机制进行补充,如果大家觉得本文帮助到你了,订阅本专栏,关注后续更多的更新~

tsg6698的博客 2万+

ngx_inet_add_addr

【代码】ngx_inet_add_addr。

weixin_41812346的博客 167

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

socket 封装,wl ipv4 ipv6

windows,linux, ipv4 ipv6 广播 只需要一个头文件,应急的使用可以使用,代码如下。

qianbo042311的博客 367

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

socket地址API(Linux网络编程基础API)

指向一个缓冲区的指针,用于存储转换后的二进制格式的IP地址。转换后的in_addr_t类型的地址(网络字节序)。用于将一个IPv4地址的字符串表示形式转换为网络字节序的二进制格式,并将结果存储在struct in_addr结构体中。:指向struct in_addr结构体的指针,用于存储转换后的二进制地址。地址族,指定要转换的IP地址类型,如AF_INET,AF_INET6。地址族,指定要转换的IP地址类型,如AF_INET,AF_INET6。指向一个字符数组的指针,用于存储转换后的文本格式的IP地址。

Wendy_robot的博客 1603

socket连接库,兼容ipv6,ipv4,为IOS上架做准备

1.因为引用了OC的代码所以貌似只支持IOS 2.服务端一般来说无要求,并不要求支持IPV6也行 3.原理:引用博客:http://www.cocoachina.com/bbs/read.php?tid=458416,判断当前网络是IPV4还是IPV6,然后采取不同连接方式。 4.测试:MAC插网线,然后开启WIFI,真机测试。 自行百度:MAC开启IPV6。 过程如下: 1.先

桑榆的专栏 4207

深入浅出:Socket封装的艺术,告别原生Socket的繁琐

Socket封装

2403_89494445的博客 955

[Linux#48][网络] 令牌环网 | IPv4 | socket 套接字 | TCP | UDP | 网络字节序列

本文介绍了网络基础,包括令牌环网、IP地址及IPv4地址解释,网络通信原理;并介绍Socket编程预备知识,涉及端口号、传输层协议、网络字节序及相关库函数定义与使用。

No Game No Life 2615

Socket地址

的作用,传递一个地址给函数,至于这个函数是 sockaddr_in 还是 sockaddr_in6,由地址族确定,然后函数内部再强制类型转化为所需的地址类型。地址族类型通常与协议族类型对应。地址结构体,这个结构体不仅提供了足够大的空间用于存放地址值,而且是内存对齐的。sa_family 成员是地址族类型(sa_family_t。头文件中,且后者与前者有完全相同的值,所以二者通常混用。定义了下面这个新的通用的 socket。根本无法容纳多数协议族的地址值。编程接口使用的地址参数类型都是。

leimeili的博客 1175

快速入门Socket编程——封装一套便捷的Socket编程——导论

本文介绍了Socket编程的核心流程与关键API,包括socket创建、bind端口绑定和listen监听设置。重点讲解了socket()函数中domain、type和protocol参数的含义,bind()函数中sockaddr结构体的使用及字节序转换问题,以及listen()函数中backlog参数对连接队列的影响。文章还提供了避免端口绑定冲突的SO_REUSEADDR技巧,为后续封装Socket编程接口奠定了基础。

charlie114514191的博客 1190

0基础学会 socket地址(内含API)

0基础学会 socket地址(内含API)

小石_coding 3675

【C++高并发服务器WebServer】-11:Socket与IP地址转换

很多网络编程函数诞生早于 IPv4 协议,那时候都使用的是 struct sockaddr 结构体,为了向前兼容,现在sockaddr 退化成了(void *)的作用,传递一个地址给函数,至于这个函数是 sockaddr_in 还是sockaddr_in6,由地址族确定,然后函数内部再强制类型转化为所需的地址类型。因此,Linux 定义了下面这个新的通用的 socket 地址结构体,这个结构体不仅提供了足够大的空间用于存放地址值,而且是内存对齐的。通过下面的代码,我们可以确认完整的网络字节序是什么样子的。

theaipower的博客 6292
上一篇: 跨平台Socket封装——跨平台头文件
下一篇: 跨平台Socket封装——CSocketImpl类
路遇天使
博客等级 码龄14年 0粉丝 14原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值