【数据库】VioletDB开发(二)--OSS模块开发

1. 封装Socket

常用的标准函数接口:

  • socket() 创建新的套接字并分配系统资源
  • bind() 一般用于服务端,将套接字与套接字地址(IP及本地端口)绑定
  • listen() 一般用于服务端,将绑定的TCP置于监听状态
  • connect() 一般用于客户端,分配一个本地的空闲端口,并与服务端建立连接
  • accept() 一般用于服务端,接受一个新的连接请求,并创建一个与该链接绑定的套接字
  • send(), recv() 或 write(), read() 或 sendto(), recvfrom() 用于发送和接收数据
  • close() 关闭一个打开的套接字并释放资源
  • select() 用于等待一个或多个指定套接字的下一个读写事件
  • poll() 用于测试一个或多个套接字的读写状态
  • gethostbyname(),gethostbyaddr() 在IPv4协议中解析域名和地址
  • getsockopt() 获取指定套接字的参数
  • setsockopt() 设置指定套接字的参数

相关接口的知识延伸:socket接口api的深度探究

封装部分接口:

封装

core.hpp的宏定义:

/* 打印需要的宏定义*/
#define OSS_MAX_PATHSIZE PATH_MAX       //路径最大长度
#define OSS_FILE_SEP_STR "/"            //路径分隔符
#define OSS_FILE_SEP_CHAR *((const char*)OSS_FILE_SET_STR)[0]   //分割字>符
#define OSS_NEWLINE     "\n"            //换行符 linux->\n, windows->\r\n
/*错误代码的宏定义*/
#define EDB_OK                  0       //正常
#define EDB_IO                  -1      //IO错误
#define EDB_INVALIDARG          -2      //非法参数
#define EDB_PERM                -3      //权限错误
#define EDB_OOM                 -4      //内存不足
#define EDB_SYS                 -5      //系统错误
#define EDB_PMD_HELP_ONLY       -6      //
#define EDB_PMD_FORCE_SYSTEM_EDU -7     //
#define EDB_TIMEOUT             -8      //超时错误
#define EDB_QUIESCED            -9      //
#define EDB_EDU_INVAL_STATUS    -10     //
#define EDB_NETWORK             -11     //网络错误
#define EDB_NETWORK_CLOSE       -12     //网络关闭错误
#define EDB_APP_FORCED          -13     //
#define EDB_IXM_ID_EXIST        -14     //
#define EDB_HEADER_INVALID      -15     //
#define EDB_IXM_ID_NOT_EXIST    -16     //
#define EDB_NO_ID               -17     //

ossSocket.hpp的头文件:

#include "core.hpp"

#define SOCKET_GETLASTERROR errno

//默认超时10ms
#define OSS_SOCKET_DFT_TIMEOUT 10000
//最大的hostname和servicename的长度
#define OSS_MAX_HOSTNAME NI_MAXHOST
#define OSS_MAX_SERVICENAME NI_MAXSERV

class _ossSocket{
private:
        int _fd;
        socklen_t _addressLen;
        sokclen_t _peerAddressLen;
        struct sockaddr_in _sockAddress;
        struct sockaddr_in _peerAddress;
        bool _init;
        int _timout;
protected:
        unsigned int _getPort( sockaddr_in *addr);
        int _getAddress( sockaddr_in *addr, char *pAddress, unsigned int length);
public:
        int setSocketLi(int lOnOff, int linger);
        void setAddress( const char *pHostName, unsigned int port);
        _ossSocket();
        //创建监听socket,输入需要监听的port
        _ossSocket(unsigned int port, int timeout = 0);
         //创建请求连接的客户端socket,输入远程服务的ip和port
        _ossSocket(const char *pHostName, unsigned int port, int timeout = 0);
         //用于accept,生成新接入的客户socket
        _ossSocket(int *sock, int timeout);
        ~_ossSocket(){  close();        }

        int initSocket();
        int bind_listen();
        int send(const char *pMsg, int len,
                int timeout = OSS_SOCKET_DEF_TIMEOUT,
                int flags = 0);
        //如果timeout=0,代表永不超时,即recv会等到接收的数据达到len长度,才会返回
        int recv(char *pMsg, int len,
                int timeout = OSS_SOCKET_DEF_TIMEOUT,
                int flags = 0);
        //只要收到数据,就会立刻返回
        int recvNF(char *pMsg, int len,
                int timeout = OSS_SOCKET_DEF_TIMEOUT);
        int connect();
        void close();
        int accept( int *sock, struct sockaddr * addr, socklen_t * addrlen,
                int timeout = OSS_SOCKET_DEF_TIMEOUT);
        //关闭发送的打包功能,让小包也能即刻发送
        int disableNagle();
        unsigned int getPeerPort();
        //获取对方的IP
        int getPeerAddress(char *pAddress, unsigned int length);
        unsigned int getLocalPort();
        //获取本地的IP
        int getLocalAddress(char *pAddress, unsigned int length);
        int setTimeout( int seconds);
        //获取本机域名
        static int getHostName(char *pName, int nameLen);
        //获取服务程序占用的端口号
        static int getPort(const char *pServiceName, unsigned short &port);

}
typedef class _ossSocket ossSocket;


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,427评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,551评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,747评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,939评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,955评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,737评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,448评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,352评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,834评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,992评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,133评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,815评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,477评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,022评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,147评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,398评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,077评论 2 355