实现一个数据库(2)建立_ossSocket自定义套接字封装类

本文介绍了如何实现一个数据库的自定义套接字类_ossSocket,详细讲解了socket的基础知识,包括socket地址、流程图以及在mydb架构中的应用。此外,还探讨了big endian/little endian、socket创建、linger机制、bind与listen、send与recv、connect和accept函数,以及如何处理disableNagle机制和超时问题。同时,作者在实践中遇到了Makefile的missing separator问题,并寻求解决方案。
摘要由CSDN通过智能技术生成

github链接(更新中)

https://github.com/pourtheworld/mydb

大纲(更新中)
(0)mydb的架构设想

socket回顾

socket地址(以Internet Socket为例):

本地IP地址与端口;
远程IP地址与端口(适用于已经建立的TCP连接);
协议(TCP、UDP)。

流程图:
在这里插入图片描述
socket API:

socket() 创建一个新的套接字并分配资源
bind()用于服务端,将套接字与套接字地址(IP+port)绑定
listen()用于服务端,将绑定的TCP置于监听状态
connect()用于客户端,分配一个本地的空闲端口,并与远程地址连接
accpet()用于服务端,接受一个新的连接请求,并创建一个与其绑定的套接字
select()用于等待一个或者多个指定套接字的下一个读写事件
poll()用于测试一个或者多个套接字的读写状态
setsockopt()配置指定套接字的参数

用于mydb的_ossSocket套接字类

类示意图:其中-代表private,#代表protected,+代表public.
接下来会挑几个重要的函数解析。
在这里插入图片描述
big endian/little endian

数值0x2211用两个字节存储,高位字节为0x22,低位字节为0x11。
big endian:0x2211
little endian: 0x1122
网络字节序一般为big endian。
(既然big endian符合人类从高位读的习惯,为什么还要有little endian?
这是因为计算电路一般从低位开始读起,运算效率高。)

创建socket:

//socket的创建函数分为了
//创建一个socket
//创建一个用于listen的socket
//创建一个用于connect的socket
//创建一个已经存在的socket
//这里我们以listen socket为例:
_ossSocket::_ossSocket(unsigned int port,int timeout)
{
        //初始化信息
        _init=false;
        _fd=0;
        _timeout=timeout;

    //清空本机及对方地址
    memset(&_sockAddress,0,sizeof(sockaddr_in));
    memset(&_peerAddress,0,sizeof(sockaddr_in));

    //设置本机和远程的地址长度
    _peerAddressLen=sizeof(_peerAddress);
    _addressLen=sizeof(_sockAddress);
    
    //本机选择IPV4,接受任意地址
    _sockAddress.sin_family=AF_INET;
    //htonl 将主机的长整型转换成网络字节顺序
    //htons 将主机的整形转换成网络字节顺序
    _sockAddress.sin_addr.s_addr=htonl(INADDR_ANY);
    _sockAddress.sin_port=htons(port);
}

初始化socket

//需要注意的是我们将创建socket的准备工作放到了前面去做
//具体的socket创建放到了init中
int _ossSocket::initSocket()
{
        int rc=EDB_OK;
        if(_init) goto done;

        memset(&_peerAddress,0,sizeof(sockaddr_in));
        _peerAddressLen=sizeof(_peerAddress);
        //创建socket SOCK_STREAM为有保障的,SOCK_DGRAM为无保障的
        _fd=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
        if(-1==_fd)
        {
          
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值