亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

C++自定義封裝socket操作業務類完整實例

2020-01-26 13:56:18
字體:
來源:轉載
供稿:網友

本文實例講述了C++自定義封裝socket操作業務類。分享給大家供大家參考,具體如下:

Linux下C++封裝socket操作的工具類(自己實現)

socketconnector.h

#ifndef SOCKETCONNECTOR_H#define SOCKETCONNECTOR_H#include "global.h"using namespace std;class SocketConnector{public:  typedef enum {    ENormal,    EOther,  } SocketState;public:  static SocketConnector * getInstance();  inline SocketState state(){ return m_state; }  inline void setState(SocketState _state){  m_state = _state;  }  inline bool isConnected() { return m_isConnected;  }  inline void setConnected(bool state) { m_isConnected = state; }  void start();  inline void setServerIP(string ip){  m_server_ip = ip;}  inline void setServerPort(int port){ m_server_port = port; }  int connect_sockfd();  int onSendMessage(string & message);private:  SocketConnector();  void onConnectToServer(string & ip,int port);  static void * onReportMessage(void * p);  static void * onReadMessage(void * p);  static void * onWriteMessage(void * p);private:  SocketState m_state;  bool m_isConnected;  int m_sockFd;  string m_server_ip;  int m_server_port;  pthread_t m_report_tid;  pthread_t m_read_tid;  pthread_t m_write_tid;};#endif // SOCKETCONNECTOR_H

socketconnector.cpp

#include "global.h"#include "socketconnector.h"#include "cmessagecenter.h"#include "cmip_requestparser.h"#include "csettings.h"#include "datadef.h"#include "cstringutils.h"using namespace std;static SocketConnector * g_instance = NULL;/***************************************************************************************************  Single Instance.***************************************************************************************************/SocketConnector * SocketConnector::getInstance(){  if (g_instance == NULL)  {    g_instance = new SocketConnector();  }  return g_instance;}/***************************************************************************************************  Consturoctor***************************************************************************************************/SocketConnector::SocketConnector(){  m_isConnected = false;  m_state = ENormal;}/***************************************************************************************************  Connect to Server By Blocking Method.***************************************************************************************************/void SocketConnector::onConnectToServer(string & ip,int port){  cout << __FUNCTION__ << "connecting::[" << ip << " , " << port << "]" << endl;  struct timeval send_timeout;  send_timeout.tv_sec = 5;  send_timeout.tv_usec = 0;  int keepalive = 1;  int keepidle = 10;  int keepinterval = 5;  int keepcount = 3;  int value = 0;  socklen_t len = sizeof(int);  static struct sockaddr_in server_addr;  memset(&server_addr, 0, sizeof(server_addr));  server_addr.sin_family = AF_INET;  server_addr.sin_port = htons(port);  server_addr.sin_addr.s_addr = inet_addr(ip.c_str());  do  {    m_sockFd = socket(AF_INET, SOCK_STREAM, 0);    if ( -1 == m_sockFd )    {      sleep(1);      continue;    }  }while(-1 == m_sockFd);  if(setsockopt(m_sockFd, SOL_SOCKET, SO_SNDTIMEO, &send_timeout, sizeof(send_timeout)) == -1)  {    printf("setsockopt SO_SNDTIMEO fail/n");  }  if(setsockopt(m_sockFd, SOL_SOCKET, SO_KEEPALIVE, (void *)&keepalive , sizeof(keepalive )) == -1)  {    printf("setsockopt SO_KEEPALIVE fail/n");  }  if(setsockopt(m_sockFd, SOL_TCP, TCP_KEEPIDLE, (void*)&keepidle , sizeof(keepidle )) == -1)  {    printf("setsockopt TCP_KEEPIDLE fail/n");  }  if(setsockopt(m_sockFd, SOL_TCP, TCP_KEEPINTVL, (void *)&keepinterval , sizeof(keepinterval )) == -1)  {    printf("setsockopt TCP_KEEPINTVL fail/n");  }  if(setsockopt(m_sockFd, SOL_TCP, TCP_KEEPCNT, (void *)&keepcount , sizeof(keepcount )) == -1)  {    printf("setsockopt TCP_KEEPCNT fail/n");  }  getsockopt(m_sockFd, SOL_TCP, TCP_KEEPINTVL, (void *)&value, &len);  cout << __FUNCTION__ << "sockFd KeepIntval::[" << value << endl;  while (!m_isConnected)  {    if(connect(m_sockFd, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)) == 0)    {      m_isConnected = true;      break;    }    else    {      if ( ECONNREFUSED == errno)      {        m_isConnected = false;        sleep(1);        printf("Reconnect To Server:%s Port:%d/n", m_server_ip.c_str(), m_server_port);      }      else      {        m_isConnected = false;        perror("connected() error()");        exit(-1);      }    }  }}/***************************************************************************************************  Create Report Thread;*  Create Read Thread;*  Create Write Thread;*  MainThread wait the subThreads exits;***************************************************************************************************/void SocketConnector::start(){  m_sockFd = connect_sockfd();  cout << __FUNCTION__ << "Will Create Report|Read|Write Thread." << endl;  pthread_create(&m_report_tid,NULL, onReportMessage, this);  /* report to cmdmodule*/  pthread_create(&m_read_tid, NULL, onReadMessage, this);  /* read from cmdmodule*/  pthread_create(&m_write_tid, NULL, onWriteMessage, this);  /* reply to cmdmodule*/  pthread_join(m_read_tid,NULL);  pthread_join(m_write_tid,NULL);  pthread_join(m_report_tid,NULL);}/***************************************************************************************************  Used to Get connected socket fd.*  if connected, return directly.*  if not connected,try to create connect fd.***************************************************************************************************/int SocketConnector::connect_sockfd(){  if ( m_isConnected == true)  {    cout << __FUNCTION__ << "::Socket is Already Connected." << endl;    return m_sockFd;  }  cout << __FUNCTION__ << "::Will Try to Connect to Server." << endl;  onConnectToServer(m_server_ip, m_server_port);  return m_sockFd;}/***************************************************************************************************  Report Status to CmdModule Thread.*  every 2s ,report one message to cmdwifi.***************************************************************************************************/void * SocketConnector::onReportMessage(void * p){  SocketConnector * connector = (SocketConnector *)(p);  if ( NULL == p)  {    cout << __FUNCTION__ << "onSelectSocket() Error: param [connector] is NULL" << endl;    return NULL;  }  string content;  int devType = atoi(CSettings::getInstance()->getKuType().c_str());  int report_interval = atoi(CSettings::getInstance()->getKuReportinterval().c_str());  string position = CSettings::getInstance()->getKuPosition();  string local_ip = CSettings::getInstance()->getKuAgentip();  cout << endl;  cout << "###################################" << endl;  cout << "Local-IP::" << local_ip << endl;  cout << "Ku-CMA-Pos::" << position << endl;  cout << "Ku-CMA-Type::" << devType << endl;  cout << "###################################" << endl;  cout << endl;  while(true)  {    int state = connector->state();    content = "<status>" + CStringUtils::toString(state) + "</status>";    content += "<type>" + CStringUtils::toString(devType) + "</type>";    content += "<site>" + position + "</site>";    content += "<ip>" + local_ip + "</ip>";    Response resp(STATUS_REPORT_CMD,0,string(content));    CMessageCenter::getInstance()->addReply(resp);    sleep(report_interval);  }}/***************************************************************************************************  Read Message from Connection.*  Then Send Message to MessageCenter Queue.***************************************************************************************************/void * SocketConnector::onReadMessage(void * p){  SocketConnector * connector = (SocketConnector *)(p);  if ( NULL == p)  {    cout << __FUNCTION__ << "onSelectSocket() Error: param [connector] is NULL" << endl;    return NULL;  }  int sockFd = connector->connect_sockfd();  fd_set fds;  struct timeval timeout={0,0};  const int BUFFER_LEN = 4*1024;  static char buffer[BUFFER_LEN]={0};  while(true)  {    FD_ZERO(&fds);    FD_SET(sockFd,&fds);    int ret = select(sockFd + 1,&fds,NULL,NULL,&timeout);    switch (ret) {      case -1:/*Error process*/      {        perror("select()");        if ( EBADF == errno)        {          close(sockFd);          connector->setConnected(false);          sleep(1);          sockFd = connector->connect_sockfd();          continue;        }        if ( EINTR == errno || ENOMEM == errno)        {          sleep(1);          continue;        }      }break;      case 0:      {        //cout << "select() timeout! " << endl;      }break;      default:      {        if(FD_ISSET(sockFd,&fds))        {          memset(buffer, 0, BUFFER_LEN);          int nRead = read(sockFd, buffer, BUFFER_LEN);          cout << ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>" << endl;          cout << "From Server Recevied Data::" << string(buffer) << endl;          cout << "From Server Recevied Length::" << nRead << endl;          cout << ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>" << endl;          CRequestParser parser;          Request req;          int ret = parser.parseToMessage(buffer,&req);          if (0 != ret)          {            cout << __FUNCTION__ << "Request Format is invalid" << endl;            continue;          }          req.print();          CMessageCenter::getInstance()->addRequest(req);        }      }break;    }  }}/***************************************************************************************************  Write Message to Connection.*  Then Send Message to MessageCenter Queue.***************************************************************************************************/void * SocketConnector::onWriteMessage(void * p){  SocketConnector * connector = (SocketConnector *)(p);  if ( NULL == p)  {    cout << __FUNCTION__ << "onSelectSocket() Error: param [connector] is NULL" << endl;    return NULL;  }  while (true)  {      Response msg;      CMessageCenter::getInstance()->getReplyMsg(msg);      string data = CMessageEncoder(msg).encode();      connector->onSendMessage(data);  }}/***************************************************************************************************  Send Message By Socket.***************************************************************************************************/int SocketConnector::onSendMessage(string & strSend){  if (atoi(CSettings::getInstance()->getDebugMode().c_str()) == 1)  {    cout << __FUNCTION__ << "Send To Cmdwifi Data::" << endl;    cout << strSend << endl;  }  int sock = m_sockFd;  char *pData = &strSend[0];  int nLen = static_cast<int>(strSend.size());  int nTotal = nLen;  int i = 0;  while(1)  {    int nTmp = send(sock, &pData[i], nTotal, 0);    if (nTmp <= 0)    {      close(sock);      return -1;    }    nTotal -= nTmp;    i += nTmp;    if (nTotal <= 0)    {      break;    }  }  return 0;}

希望本文所述對大家C++程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
97精品国产97久久久久久免费| 亚洲欧美日韩天堂一区二区| 尤物九九久久国产精品的分类| 另类图片亚洲另类| 一区二区欧美激情| 成人免费在线网址| 欧美亚洲视频在线看网址| 欧美老女人www| 中文字幕欧美精品日韩中文字幕| 国内精品久久久久影院 日本资源| 欧美综合国产精品久久丁香| 精品国内亚洲在观看18黄| 国产97在线视频| 亚洲尤物视频网| 亚洲精品狠狠操| 欧美成年人视频| 色综合视频一区中文字幕| 国产亚洲一区二区在线| 精品视频中文字幕| 中文字幕欧美国内| 日韩精品极品视频免费观看| 亚洲老头同性xxxxx| 国产精品一区二区三| 日韩国产精品亚洲а∨天堂免| 国产91|九色| 国外成人性视频| 久久精品久久精品亚洲人| 欧美亚洲另类在线| 欧美伊久线香蕉线新在线| 国产女精品视频网站免费| 久久久久久久一区二区| 国产拍精品一二三| 永久555www成人免费| 羞羞色国产精品| 日本韩国在线不卡| 国产日韩欧美在线视频观看| 成人激情综合网| 久久亚洲国产成人| 91精品中文在线| 国产精品久久久av| 日韩av电影手机在线观看| 国产一区二区三区在线观看视频| 国产精品69av| 成人免费黄色网| 亚洲国产精品网站| xxxxx成人.com| 91久久精品国产| 国产精品福利无圣光在线一区| 国产一区二区av| www.久久久久| 久久精品影视伊人网| 国产极品精品在线观看| 亚洲精品在线观看www| 日韩激情视频在线播放| 国产性猛交xxxx免费看久久| 日韩电影免费观看中文字幕| 最近2019年好看中文字幕视频| 亚洲尤物视频网| 91av在线播放视频| 久久久国产精彩视频美女艺术照福利| 亚洲free嫩bbb| 国产日韩在线一区| 亚洲第一区在线| 国产一区二区三区三区在线观看| 中文国产亚洲喷潮| 亚洲精品资源美女情侣酒店| 日韩成人在线视频观看| 国精产品一区一区三区有限在线| 亚洲xxxxx| 成人黄色在线免费| 日韩在线免费视频| 亚洲欧美中文另类| 成人a免费视频| 亚洲自拍中文字幕| 福利二区91精品bt7086| 国产日韩在线看| 国产精品影院在线观看| 欧美自拍大量在线观看| 欧美激情乱人伦一区| 日韩精品免费一线在线观看| 九九九热精品免费视频观看网站| 国产精品国内视频| 奇米成人av国产一区二区三区| 亚洲第一网中文字幕| 久热爱精品视频线路一| 久久亚洲国产精品| 国产精品99久久99久久久二8| 国产精品丝袜白浆摸在线| 亚洲国产女人aaa毛片在线| 精品久久久久久久中文字幕| 日韩色av导航| 欧美一级淫片aaaaaaa视频| 亚洲天堂av电影| 亚洲91精品在线| 美日韩精品免费观看视频| 在线播放亚洲激情| 免费不卡欧美自拍视频| 亚洲精品黄网在线观看| 色香阁99久久精品久久久| 久久久久免费精品国产| 亚洲欧洲偷拍精品| 91精品美女在线| 国产精品久久9| 美女扒开尿口让男人操亚洲视频网站| 国产一区视频在线| 在线日韩日本国产亚洲| 欧美极品美女视频网站在线观看免费| 亚洲三级 欧美三级| 日韩欧美国产视频| 日韩成人免费视频| 久久久999国产| 亚洲欧洲成视频免费观看| 成人黄色午夜影院| 久久夜色撩人精品| 日韩福利在线播放| 亚洲人成欧美中文字幕| 欧美国产在线视频| 亚洲qvod图片区电影| 久久天堂av综合合色| 国产欧美欧洲在线观看| 欧美日韩久久久久| 国产一区二区黄| 国产丝袜一区二区三区免费视频| 欧美洲成人男女午夜视频| 久久久之久亚州精品露出| 国产成人高清激情视频在线观看| 久青草国产97香蕉在线视频| 97超级碰碰碰久久久| 精品中文字幕在线| 免费99精品国产自在在线| 亚洲精品资源在线| 久久久免费在线观看| 成人国产精品av| 欧美精品www| 国产精品美女呻吟| 疯狂做受xxxx欧美肥白少妇| 久久亚洲一区二区三区四区五区高| 97久久超碰福利国产精品…| 97视频人免费观看| 日本高清+成人网在线观看| 色综合久久88色综合天天看泰| 国内精品美女av在线播放| 日韩精品一区二区三区第95| 成人有码视频在线播放| 精品国产精品三级精品av网址| 国产一区二区在线免费视频| 久久五月天色综合| 久久资源免费视频| 欧美成人午夜免费视在线看片| 国产精品极品美女在线观看免费| 亚洲一区二区少妇| 亚洲第一区中文字幕| 久久精品国产96久久久香蕉| 亚洲精品99久久久久| 欧美野外猛男的大粗鳮| 国产精品福利片| 91青草视频久久| 国产视频观看一区| 亚洲欧美一区二区三区四区| 日韩精品视频在线播放| 欧美在线视频在线播放完整版免费观看| 日韩中文第一页| 操91在线视频| 欧美成人剧情片在线观看|