把linux平台提供的有关socket操作的API进行封装是有必要的;基于stream操作的流程与基于dgram操作的流程略有不同,分别放在两个类中,但两者又有很多相似的操作,因此写一个基类,让其继承自这个基类;基类起名为:CommBase,操作stream与dgram两个类分别起名为:StreamSock、DgramSock;

/***************************************************************************************
****************************************************************************************
* FILE      : socket_base.h
* Description   : 
*             
* Copyright (c) 2012 by Liu Yanyun(E-mail:liuyun827@foxmail.com). All Rights Reserved.
*            Without permission, shall not be used for any commercial purpose

* History:
* Version       Name            Date            Description
   0.1      Liu Yanyun      2012/12/06      Initial Version
   
****************************************************************************************
****************************************************************************************/ 
 
#ifndef _SOCKET_BASE_H_  
#define _SOCKET_BASE_H_   
 
#include <stdio.h>  
#include <string.h>  
#include <stdint.h>  
#include <unistd.h>  
#include <errno.h>  
#include <string>  
 
class SockAddr; 
 
 
/*==================================================================
* Function  : CommBase
* Description   : socket base class
==================================================================*/ 
class CommBase 

public: 
 
  /*==================================================================
  * Function    : CommBase
  * Description : construction function
  ==================================================================*/ 
  CommBase(); 
 
  /*==================================================================
  * Function    : CommBase
  * Description : Destructor function
  ==================================================================*/ 
  virtual ~CommBase(); 
 
  /*==================================================================
  * Function    : CommBase.getSockFd
  * Description : get socket fd
  * Return Value: socket fd
  ==================================================================*/ 
  int getSockFd(); 
 
  /*==================================================================
  * Function    : CommBase.setSockFd
  * Description : set socket fd
  * Input Para  : socket fd
  * Return Value: void
  ==================================================================*/ 
  void setSockFd(int fd); 
 
  /*==================================================================
  * Function    : CommBase.openSock
  * Description : for stream (socket->bind->listen);for dgram(socket->bind)
  * Input Para  : socket address
  * Return Value: if success return true, or else false is return
  ==================================================================*/ 
  virtual bool openSock(SockAddr &addr_) = 0; 
 
  /*==================================================================
  * Function    : CommBase.acceptSock
  * Description : used for server accept client connection
  * Input Para  : addr_--socket address
  * Output Para : addr_--client address
  * Return Value: if success return client fd, or else -1 is return
  ==================================================================*/ 
  int acceptSock(SockAddr &addr_); 
 
  /*==================================================================
  * Function    : CommBase.connectTo
  * Description : used for client to connect to server
  * Input Para  : socket address
  * Return Value: if success return client fd, or else -1 is return
  ==================================================================*/ 
  bool connectTo(SockAddr &addr_); 
 
  /*==================================================================
  * Function    : CommBase.sendData
  * Description : send data
  * Input Para  : data_--data buf pointer
  * Input Para  : len_--data buf length
  * Return Value: success send length
  ==================================================================*/ 
  virtual int sendData(void *data_,  
      uint32_t len_); 
 
  /*==================================================================
  * Function    : CommBase.sendData
  * Description : send data
  * Input Para  : data_--data buf pointer
  * Input Para  : len_--data buf length
  * Input Para  : addr_--address
  * Return Value: success send length
  ==================================================================*/ 
  virtual int sendData(void *data_,  
      uint32_t len_,  
      SockAddr &addr_); 
 
  /*==================================================================
  * Function    : CommBase.recvData
  * Description : recv data
  * Input Para  : data_--data buf pointer
  * Input Para  : len_--data buf length
  * Return Value: success recv length
  ==================================================================*/ 
  virtual int recvData(void *data_,  
      uint32_t len_); 
 
  /*==================================================================
  * Function    : CommBase.recvData
  * Description : recv data
  * Input Para  : data_--data buf pointer
  * Input Para  : len_--data buf length
  * Input Para  : addr_--address
  * Return Value: success recv length
  ==================================================================*/ 
  virtual int recvData(void *data_,  
      uint32_t len_, 
      SockAddr &addr_); 
 
  /*==================================================================
  * Function    : CommBase.enableSockReuse
  * Description : enable socket address reuse
  * Return Value: if success return true, or else false is return
  ==================================================================*/ 
  bool enableSockReuse(); 
 
  /*==================================================================
  * Function    : CommBase.setSendBufSize
  * Description : set send buffer size
  * Input Para  : size_--buffer size
  * Return Value: if success return true, or else false is return
  ==================================================================*/ 
  bool setSendBufSize(uint32_t size_); 
 
  /*==================================================================
  * Function    : CommBase.setRecvBufSize
  * Description : set recv buffer size
  * Input Para  : size_--buffer size
  * Return Value: if success return true, or else false is return
  ==================================================================*/ 
  bool setRecvBufSize(uint32_t size_); 
 
  /*==================================================================
  * Function    : CommBase.getSendBufSize
  * Description : get send buffer size
  * Return Value: if success return buffer size, or else -1 is return
  ==================================================================*/ 
  int getSendBufSize(); 
 
  /*==================================================================
  * Function    : CommBase.getRecvBufSize
  * Description : get recv buffer size
  * Return Value: if success return buffer size, or else -1 is return
  ==================================================================*/ 
  int getRecvBufSize(); 
   
protected: 
 
  //socket fd  
  int sockFd; 
   
private: 
 
  // Disable copy construction and assignment.  
  CommBase(const CommBase&); 
  const CommBase &operator = (const CommBase&); 
}; 
 
 
 
/*==================================================================
* Function  : StreamSock 
* Description   : Stream Socket class
==================================================================*/ 
class StreamSock : public CommBase 

public: 
 
  /*==================================================================
  * Function    : StreamSock 
  * Description : construction function
  ==================================================================*/ 
  StreamSock(); 
 
  /*==================================================================
  * Function    : StreamSock 
  * Description : Destructor function
  ==================================================================*/ 
  virtual ~StreamSock(); 
 
  /*==================================================================
  * Function    : StreamSock 
  * Description : Please reference to CommBase
  ==================================================================*/ 
  bool openSock(SockAddr &addr_); 
 
  /*==================================================================
  * Function    : StreamSock 
  * Description : Please reference to CommBase
  ==================================================================*/ 
  int sendData(void *data_,  
    uint32_t len_); 
 
  /*==================================================================
  * Function    : StreamSock 
  * Description : Please reference to CommBase
  ==================================================================*/ 
  int recvData(void *data_,  
    uint32_t len_); 
}; 
 
/*==================================================================
* Function  : DgramSock 
* Description   : Dgram Socket class
==================================================================*/ 
class DgramSock : public CommBase 

public: 
 
  /*==================================================================
  * Function    : DgramSock 
  * Description : construction function
  ==================================================================*/ 
  DgramSock(); 
 
  /*==================================================================
  * Function    : StreamSock 
  * Description : Destructor function
  ==================================================================*/ 
  virtual ~DgramSock(); 
 
  /*==================================================================
  * Function    : StreamSock 
  * Description : Please reference to CommBase
  ==================================================================*/ 
  bool openSock(SockAddr &addr_); 
 
  /*==================================================================
  * Function    : StreamSock 
  * Description : Please reference to CommBase
  ==================================================================*/ 
  int sendData(void *data_,  
    uint32_t len_,  
    SockAddr &addr_); 
 
  /*==================================================================
  * Function    : StreamSock 
  * Description : Please reference to CommBase
  ==================================================================*/ 
  int recvData(void *data_,  
    uint32_t len_, 
    SockAddr &addr_); 
};

/#endif /*_SOCKET_BASE_H_*/

L28:尽量使用类型声明方式,而不是包含头文件

通过上面的函数声明可以看出,有关socket地址的参数统一为我们前一节中介绍的,SockAddr

#include "socket_base.h"  
#include "socket_addr.h"  
#include "log_trace.h"  
#include <string>  
 
using namespace std; 
 
CommBase::CommBase() 

  sockFd = -1; 

 
CommBase::~CommBase() 

  close(sockFd); 
  sockFd = -1; 

 
int CommBase::getSockFd() 

  return sockFd; 

 
void CommBase::setSockFd(int fd) 

  sockFd = fd; 

int CommBase::acceptSock(SockAddr &addr_) 

  struct sockaddr *sockAddr = addr_.getAddr(); 
  socklen_t addrLen = addr_.getSockLen(); 
 
  int connFd = accept(sockFd, sockAddr, &addrLen); 
  if(-1 == connFd) 
  { 
    logTrace("%m"); 
  } 
 
  return connFd; 

bool CommBase::connectTo(SockAddr &addr_) 

  sockFd = socket(addr_.getDomain(), addr_.getType(), 0); 
  if( -1 == sockFd) 
  { 
    logTrace("%m"); 
    return false; 
  } 
   
  const struct sockaddr *sockAddr = addr_.getAddr(); 
  if(NULL == sockAddr) 
  { 
    logTrace(""); 
    return false; 
  } 
 
  int rc = connect(sockFd, sockAddr, addr_.getSockLen()); 
  if(-1 == rc) 
  { 
    logTrace("%m"); 
    return false; 
  } 
 
  return true; 

 
int CommBase::sendData(void *data_,  
    uint32_t len_) 

  logTrace("you can't use this method"); 
 
  return -1; 

 
int CommBase::sendData(void *data_,  
    uint32_t len_,  
    SockAddr &addr_) 

  logTrace("you can't use this method"); 
 
  return -1; 

 
int CommBase::recvData(void *data_,  
    uint32_t len_) 

  logTrace("you can't use this method"); 
 
  return -1; 

 
int CommBase::recvData(void *data_,  
    uint32_t len_, 
    SockAddr &addr_) 

  logTrace("you can't use this method"); 
 
  return -1; 

       
bool CommBase::enableSockReuse() 

  int flag = 1; 
  int rc = setsockopt (sockFd, SOL_SOCKET, SO_REUSEADDR, &flag, sizeof (flag)); 
  if(0 != rc) 
  { 
    logTrace("%m"); 
  } 
 
  return (0 == rc); 

 
bool CommBase::setSendBufSize(uint32_t size) 

  int rc = setsockopt(sockFd, SOL_SOCKET, SO_SNDBUF, &size, sizeof(size)); 
  if(0 != rc) 
  { 
    logTrace("%m"); 
  } 
 
  return (0 == rc); 

 
bool CommBase::setRecvBufSize(uint32_t size) 

  int rc = setsockopt(sockFd, SOL_SOCKET, SO_RCVBUF, &size, sizeof(size)); 
  if(0 != rc) 
  { 
    logTrace("%m"); 
  } 
 
  return (0 == rc); 

 
int CommBase::getSendBufSize() 

  int size; 
  socklen_t len = sizeof(size); 
  int rc = getsockopt(sockFd, SOL_SOCKET, SO_SNDBUF, &size, &len ); 
  if(0 != rc) 
  { 
    logTrace("%m"); 
    return -1; 
  } 
 
  return size; 

 
int CommBase::getRecvBufSize() 

  int size; 
  socklen_t len = sizeof(size); 
  int rc = getsockopt(sockFd, SOL_SOCKET, SO_RCVBUF, &size, &len ); 
  if(0 != rc) 
  { 
    logTrace("%m"); 
    return -1; 
  } 
 
  return size; 

 
StreamSock::StreamSock() 

  //do nothing  

StreamSock::~StreamSock() 

  //do nothing  

bool StreamSock::openSock(SockAddr &addr_) 

  sockFd = socket(addr_.getDomain(), addr_.getType(), 0); 
  if( -1 == sockFd) 
  { 
    logTrace("%m"); 
    return false; 
  } 
 
  enableSockReuse(); 
   
  const struct sockaddr *sockAddr = addr_.getAddr(); 
  if(NULL == sockAddr) 
  { 
    logTrace(""); 
    return false; 
  } 
 
  int ret = bind(sockFd, sockAddr, addr_.getSockLen()); 
  if(0 != ret) 
  { 
    logTrace("%m"); 
    return false; 
  } 
 
  ret = listen(sockFd, 32); 
  if(0 != ret) 
  { 
    logTrace("%m"); 
    return false; 
  } 
 
  return true; 

int StreamSock::sendData(void *data_,  
    uint32_t len_) 

  int sendLen = 0; 
  do 
  { 
    sendLen = send(sockFd, data_, len_, 0); 
  }while(-1 == sendLen && EINTR == errno); 
 
  if(sendLen <= 0) 
  { 
    logTrace("%m"); 
  } 
 
  return sendLen; 

 
int StreamSock::recvData(void *data_,  
    uint32_t len_) 

  int recvLen = 0; 
  do 
  { 
    recvLen = recv(sockFd, data_, len_, 0); 
  }while(-1 == recvLen && EINTR == errno); 
 
  if(recvLen <= 0) 
  { 
    logTrace("%m"); 
  } 
 
  return recvLen; 

DgramSock::DgramSock() 

  //do nothing  

DgramSock::~DgramSock() 

  //do nothing  

bool DgramSock::openSock(SockAddr &addr_) 

  sockFd = socket(addr_.getDomain(), addr_.getType(), 0); 
  if( -1 == sockFd) 
  { 
    logTrace("%m"); 
    return false; 
  } 
 
   
  const struct sockaddr *sockAddr = addr_.getAddr(); 
  if(NULL == sockAddr) 
  { 
    logTrace(""); 
    return false; 
  } 
 
  int ret = bind(sockFd, sockAddr, addr_.getSockLen()); 
  if(0 != ret) 
  { 
    logTrace("%m"); 
    return false; 
  } 
 
  return true; 

int DgramSock::sendData(void *data_,  
    uint32_t len_,  
    SockAddr &addr_) 

  const struct sockaddr *sockAddr = addr_.getAddr(); 
   
  if(NULL == sockAddr) 
  { 
    logTrace(""); 
    return false; 
  } 
 
  int sendLen = 0; 
  do 
  { 
    sendLen = sendto(sockFd, data_, len_, 0, sockAddr, addr_.getSockLen()); 
  }while(-1 == sendLen && EINTR == errno); 
 
  if(sendLen <= 0) 
  { 
    logTrace("%m"); 
  } 
 
  return sendLen; 

int DgramSock::recvData(void *data_,  
    uint32_t len_, 
    SockAddr &addr_) 

  struct sockaddr *sockAddr = addr_.getAddr(); 
  socklen_t addrLen = addr_.getSockLen(); 
   
  int recvLen = 0; 
  do 
  { 
    recvLen = recvfrom(sockFd, data_, len_, 0, sockAddr, &addrLen); 
  }while(-1 == recvLen && EINTR == errno); 
 
  if(recvLen <= 0) 
  { 
    logTrace("%m"); 
  } 
 
  return recvLen; 
}

上面的都是最简单的socket调用,不多说明!

转:sock_ev——linux平台socket事件框架(socket API的封装) .的更多相关文章

  1. 转:sock_ev——linux平台socket事件框架(socket代理类) .

    前面分析了对socket基本操作的封装,并按照数据的传送方式写了两个类,本篇将写一个代理类提供给库的使用者使用的类. /**************************************** ...

  2. 转:sock_ev——linux平台socket事件框架(event dispatcher) .

    最近比较忙,好久没更新了:今天我们看一下事件的监听方式,在linux下面事件的监听方式有三种select.poll.epoll,性能上面epoll最高,如果仅是最多监听十多个描述符,用啥无所谓,如果是 ...

  3. 转:sock_ev——linux平台socket事件框架(基于字节流的测试程序) .

    原文:http://blog.csdn.net/gdutliuyun827/article/details/8257186 由于工作与学习的需要,写了一个socket的事件处理框架,在公司写的已经使用 ...

  4. 转:sock_ev——linux平台socket事件框架(event loop) .

    上一篇我们封装了三种事件监听方式,如果分别提供给客户端使用,有点不方便,也不利于统一管理:我们再封装一层EventLoop. /************************************ ...

  5. 转:sock_ev——linux平台socket事件框架(uri地址的解析) .

    在第一篇中,已经说明,传递的socket地址采取以下形式: [cpp] view plaincopyprint?stream://192.168.2.10:8080   dgram://192.168 ...

  6. 转:sock_ev——linux平台socket事件框架(基于数据报的测试程序) .

    上一篇已经做过注释,这一篇直接上代码 /******************************************************************************** ...

  7. 转:sock_ev——linux平台socket事件框架(logTrace) .

    写代码要有调试log,采用syslog的输出:一般会输出到"/var/log/messages" /**************************************** ...

  8. 笔记整理--Linux平台MYSQL的C语言

    Linux平台MYSQL的C语言API全列表 - 第三只眼的专栏 - 博客频道 - CSDN.NET - Google Chrome (2013/8/18 22:28:58)   Linux平台MYS ...

  9. AgileEAS.NET SOA 中间件平台.Net Socket通信框架-介绍

    一.前言 AgileEAS.NET SOA 中间件平台是一款基于基于敏捷并行开发思想和Microsoft .Net构件(组件)开发技术而构建的一个快速开发应用平台.用于帮助中小型软件企业建立一条适合市 ...

随机推荐

  1. 02-MariaDB主从安装SpringBoot整合MyBatis配置

    关于MariaDB的介绍 MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可 MariaDB的目的是完全兼容MySQL,包括API和命令行,使之能轻松成为My ...

  2. Unity ScriptObject创建Asset文件

    创建ScriptObject可以创建带序列化的资源,只保存数据不用绑定在游戏对象上.创建出来的本子资源可以通过资源加载到游戏里使用.这里介绍一下使用Resources加载. 创建好的asset文件也可 ...

  3. 【美】范·K·萨普曼 - 通向财务自由之路(2013年11月26日)

    <通向财务自由之路> 作 者:[美]范·K·萨普曼  译 者:董梅 系 列: 出 版:机械工业出版社 字 数:约40千字 阅读完成:2013年11月26日

  4. sql中字符分割,日期判断,以及函数的应用

    前两天公司有一个功能需求,客户给出几天的工作时间和休息,然后顾客的访问时间必须要在工作时间之内和休息时间之外,所以要求做一下判断.本来以为这个没什么,谁知道客户提供的工作时间段和休息时间段不定,给出的 ...

  5. Circuit level-shifts ac signals

    AC signals can emanate from many sources, and many of these sources are incompatible with the most p ...

  6. SQL SERVER 锁2

    http://blog.csdn.net/huwei2003/article/details/4047191 http://www.cnblogs.com/huangxincheng/category ...

  7. 传输层TCPUDP 具体解释

    1.传输层存在的必要性 因为网络层的分组传输是不可靠的,无法了解数据到达终点的时间,无法了解数据未达终点的状态.因此有必要增强网络层提供服务的服务质量. 2.引入传输层的原因 面向连接的传输服务与面向 ...

  8. animate()--jq动画

    2参数,样式,时间 $(this).animate({top:"100px","opacity": "0"},1000) 3参数,样式,时间 ...

  9. 纠正jQuery获取radio选中值的写法

    先看一段代码 <input type="radio" name="aaa" value="1" checked="true& ...

  10. 单击行,自己主动选中当前行中的单选框button

    需求:单击行,自己主动选中当前行中的单选框button. aspx页面: <asp:Repeater ID="rptRecordList" runat="serve ...