Linux socket编程,对套接字进行封装
轉(zhuǎn)自:http://www.cnblogs.com/-Lei/archive/2012/09/04/2670942.html
下面是對(duì)socket操作的封裝,因?yàn)樵贚inux下寫中文到了windows里面會(huì)亂碼,所以注釋用英文來(lái)寫,有空再查下解決方法吧
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這里解釋下為什么析構(gòu)函數(shù)是虛的,如果要用到多態(tài)的話,也就是用一個(gè)指向基類的指針來(lái)處理對(duì)不同到對(duì)象
如果類的成員函數(shù)不是虛函數(shù),只是個(gè)普通的函數(shù),那么會(huì)出現(xiàn)一種靜態(tài)綁定到情況,如
Base* pBase = new Derive; //這里Base的析構(gòu)函數(shù)不是虛函數(shù)
delete pBase; //這里只會(huì)調(diào)用Base::~Base(),所以派生類部分的資源將得不到釋放
如果析構(gòu)函數(shù)是虛函數(shù)的話,那么將調(diào)用Derive::~Derive(),由于我們提供了派生類的析構(gòu)函數(shù),編譯器會(huì)擴(kuò)展這個(gè)析構(gòu)函數(shù),
在里面調(diào)用基類的析構(gòu)函數(shù),這樣派生類和基類的資源都將得到釋放
?
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; }
接下來(lái)是異常處理到類
#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總結(jié)
以上是生活随笔為你收集整理的Linux socket编程,对套接字进行封装的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 基于Linux的SOCKET编程之TCP
- 下一篇: linux网络编程:使用多进程实现soc