Linux socket编程,对套接字进行封装
转自:http://www.cnblogs.com/-Lei/archive/2012/09/04/2670942.html
下面是对socket操作的封装,因为在Linux下写中文到了windows里面会乱码,所以注释用英文来写,有空再查下解决方法吧
socket.h
#ifndef SOCKET_H #define SOCKET_H#include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <arpa/inet.h> #include <string>const int MAXCONNECTION=5; const int MAXRECEIVE = 500;class Socket {public:Socket();//virtual destructiorvirtual ~Socket();// Server initializationbool Create(); //create a socketbool Bind(const int port);bool Listen() const;bool Accept(Socket& clientSocket) const;// Client initializationbool Connect(const std::string& host,const int port);// Data Transmissionbool Send(Socket& socket,const std::string& message) const;int Receive(Socket& socket,std::string& message) const;void SetNonBlocking(const bool flag);bool IsValid() const;private://use m_sockfd to record the result of function socketint m_sockfd;struct sockaddr_in m_address; };#endif
这里解释下为什么析构函数是虚的,如果要用到多态的话,也就是用一个指向基类的指针来处理对不同到对象
如果类的成员函数不是虚函数,只是个普通的函数,那么会出现一种静态绑定到情况,如
Base* pBase = new Derive; //这里Base的析构函数不是虚函数
delete pBase; //这里只会调用Base::~Base(),所以派生类部分的资源将得不到释放
如果析构函数是虚函数的话,那么将调用Derive::~Derive(),由于我们提供了派生类的析构函数,编译器会扩展这个析构函数,
在里面调用基类的析构函数,这样派生类和基类的资源都将得到释放
socket.cpp
#include "Socket.h" #include <stdlib.h> #include <memory.h> #include <iostream> #include <fcntl.h>Socket::Socket() :m_sockfd(-1) { }Socket::~Socket() {if(IsValid())::close(m_sockfd); }//server function bool Socket::Create() {m_sockfd=socket(AF_INET,SOCK_STREAM,0);if(!IsValid())return false;return true; }bool Socket::Bind(const int port) {if(!IsValid())return false;m_address.sin_family=AF_INET;m_address.sin_addr.s_addr = htonl(INADDR_ANY);m_address.sin_port=htons(port);int bindReturn=bind(m_sockfd,(struct sockaddr*)&m_address,sizeof(m_address));if(bindReturn==-1)return false;return true; }bool Socket::Listen()const {if(!IsValid())return false;int listenReturn=listen(m_sockfd,MAXCONNECTION);if(listenReturn ==-1)return false;return true; }bool Socket::Accept(Socket& clientSocket) const {int clientaddrLength=sizeof(clientSocket.m_address);clientSocket.m_sockfd=::accept(m_sockfd,(struct sockaddr*)&clientSocket.m_address,(socklen_t *)&clientaddrLength);if(clientSocket.m_sockfd==-1)return false;return true; } //end server functionsbool Socket::Connect(const std::string& host,const int port) {if(!IsValid())return false;m_address.sin_family=AF_INET;m_address.sin_port=htons(port);m_address.sin_addr.s_addr=inet_addr(host.c_str());int connectReturn=::connect(m_sockfd,(struct sockaddr*)&m_address,sizeof(m_address));if(connectReturn==-1)return false;return true;}// Data Transmission bool Socket::Send(Socket& socket,const std::string& message) const {int result=::send(socket.m_sockfd,message.c_str(),message.length(),MSG_NOSIGNAL);if(result==-1)return false;return true; }int Socket::Receive(Socket& socket,std::string& message) const {char buffer[MAXRECEIVE+1];message.clear();memset(buffer,0,MAXRECEIVE+1);int numberRead=::recv(socket.m_sockfd,buffer,MAXRECEIVE,0);if(numberRead==-1){std::cout<<"error in Socket::Receive\n";return 0;}else if(numberRead==0)return 0;else{message=buffer;return numberRead;}}void Socket::SetNonBlocking(const bool flag) {if(IsValid()) { int opts; opts = fcntl ( m_sockfd, F_GETFL ); if ( opts < 0 ) { return; } if ( flag ) opts = ( opts | O_NONBLOCK ); else opts = ( opts & ~O_NONBLOCK ); fcntl ( m_sockfd, F_SETFL,opts ); }}bool Socket::IsValid() const {//if call function socket fail,it returns -1return m_sockfd!=-1; }
接下来是异常处理到类
#ifndef SocketException_H #define SocketException_H#include <string>class SocketException {public:SocketException ( std::string description ) : m_description( description ) {};~SocketException (){};std::string Description() { return m_description; }private:std::string m_description; };#endif
Linux socket编程,对套接字进行封装相关推荐
- Linux网络编程——原始套接字编程
Linux网络编程--原始套接字编程 转自:http://blog.csdn.net/tennysonsky/article/details/44676377 原始套接字编程和之前的 UDP 编程差不 ...
- Linux网络编程之套接字基础
Linux网络编程之套接字基础 1.套接字的基本结构 struct sockaddr 这个结构用来存储套接字地址. 数据定义: struct sockaddr { unsigned short sa_ ...
- JAVA socket编程 Datagram套接字 UDP协议(转)
查看文章 JAVA socket编程 Datagram套接字 UDP协议 2009-05-13 09:35 1 UDP套接字 数据报(Datagram)是网络层数据单元在介质上传输信息的一 ...
- 【Linux网络编程】套接字简介
00. 目录 文章目录 00. 目录 01. 概述 02. 套接字属性 03. socket函数 04. 套接字地址结构 05. 附录 01. 概述 Socket套接字由远景研究规划局(Advance ...
- 【Linux网络编程】套接字的介绍
套接字是一种通信机制(通信的两方的一种约定),凭借这种机制,不同主机之间的进程可以进行通信.我们可以用套接字中的相关函数来完成通信过程. 套接字的特性有三个属性确定,它们是:域(domain),类型( ...
- Linux网络编程 之 套接字(四)
目录 1. 套接字的定义 2. 套接字的创建方法 3. 套接字的地址 本地套接字 网络套接字 1. 套接字的定义 套接字是一种通信机制(通信的两方的一种约定),凭借这种机制,不同主机之间的进程可以进行 ...
- linux网络编程 华清,Linux网络编程之套接字
一 :套接字属性 套接字由域(domain),类型(type)和协议(protocol)三个属性确定其特性. 1)套接字的域 域指定套接字通信中使用的网络 介质,常见的套接字域是AF_INET,它指的 ...
- Linux 网络编程——原始套接字实例:MAC 地址扫描器
如果 A (192.168.1.1 )向 B (192.168.1.2 )发送一个数据包,那么需要的条件有 ip.port.使用的协议(TCP/UDP)之外还需要 MAC 地址,因为在以太网数据包中 ...
- Linux网络编程(套接字编程)
socket套接字编程 udp协议与tcp协议区别 udp协议: udp协议:用户数据报协议 特性:无连接,不可靠,面向数据报 应用场景:实时性要求大于安全性(类似于短信发送)eg.视频传输 tcp协 ...
- Linux网络编程——原始套接字能干什么?
一.知识回顾: 通常情况下程序员接所接触到的套接字(Socket)为两类: (1)流式套接字(SOCK_STREAM):一种面向连接的 Socket,针对于面向连接的TCP 服务应用: (2)数据报式 ...
最新文章
- 绿色版mysql使用方法
- jquery.each读取json数据
- 2021-10-15 红黑树 概念和平衡操作理解以及与AVL对比分析 恋上数据结构笔记
- 软件安全测试报告模板_软件测试工程师经典面试题
- mac nginx php7 配置,mac os下配置nginx+php7.1+fastcgi
- 京东炸年兽活动一键做任务工具v1.7
- vue-cli(vue脚手架)搭建
- windows 下 nginx 的反向代理学习整理
- smtp邮件服务器的作用,smtp服务器是什么意思(smtp服务器作用及使用指南)
- pinphp3.0后台系统权限管理的bug
- t-SNE算法解析与简单代码实现
- 保姆式手把手教你接入易班开放平台接入个人外部网站
- 华中科技大学网络教材
- PHP面试经常被问到的问题(附答案)
- 浅谈对工厂方法模式的理解
- Jquery如何去掉复选框的勾
- 无主之地3重型武器节奏评分榜(9.25) 枪械名 红字效果 元素属性 清图评分 Boss战评分 泛用性评分 特殊性评分 最终评级 掉落点 掉率 图片 瘟疫传播
- 云机器被渗透了怎么办以及解决方法!
- 推荐一款牛逼的Windows神器!功能很强大!
- java五子棋棋盘_java绘制五子棋棋盘代码示例
热门文章
- centos 6.9 NTP基准时间服务器配置
- 数据库抽象类PDOStatement对象使用
- c# 多线程异步demo
- oracle 安装ora 27102,ORA-27102 解决办法
- python逆向什么意思_如何理解python逆向切片
- mvc如何嵌套第三方页面_长文观点丨为什么我不再使用MVC框架?
- 安卓app开发工具_怎么开发app软件需要多少钱?主流app开发工具盘点
- java任务分支和合并_合并/分支战略
- MySQL的主动优化和被动优化_MySQL“被动”性能优化汇总!
- java property_property在Java中的用法