您的位置:首页 > 其它

跨平台Socket封装

2011-09-21 12:06 369 查看
odsocket.h:

/*

* define file about portable socketclass.

* description:this sock is suit bothwindows and linux

* design:odison

* e-mail:odison@126.com>

*

*/

#ifndef _ODSOCKET_H_

#define _ODSOCKET_H_

#ifdef WIN32

#include<winsock.h>

typedefint socklen_t;

#else

#include<sys/socket.h>

#include <netinet/in.h>

#include<netdb.h>

#include<fcntl.h>

#include <unistd.h>

#include<sys/stat.h>

#include<sys/types.h>

#include<arpa/inet.h>

typedefint SOCKET;

//#pragma region define win32const variable inlinux

#defineINVALID_SOCKET -1

#defineSOCKET_ERROR -1

//#pragmaendregion

#endif

class ODSocket {

public:

ODSocket(SOCKET sock =INVALID_SOCKET);

~ODSocket();

// Create socket object forsnd/recv data

bool Create(int af, int type,int protocol =0);

// Connectsocket

bool Connect(const char* ip,unsigned shortport);

#regionserver

// Bindsocket

bool Bind(unsigned short port);

// Listensocket

bool Listen(int backlog = 5);

// Accept socket

bool Accept(ODSocket& s,char* fromip =NULL);

#endregion

// Sendsocket

int Send(const char* buf, intlen, int flags =0);

// Recvsocket

int Recv(char* buf, int len,int flags =0);

// Closesocket

int Close();

// Geterrno

intGetError();

//#pragma region just forwin32

// Init winsock DLL

static intInit();

// Clean winsockDLL

static intClean();

//#pragmaendregion

// Domain parse

static bool DnsParse(constchar* domain, char*ip);

ODSocket& operator =(SOCKET s);

operator SOCKET();

protected:

SOCKETm_sock;

};

#endif

odsocket.cpp

/*

* Source file about portable socketclass.

*

* design:odison

* e-mail:odison@126.com>

*

*/

#include

#include

#include "odsocket.h"

#ifdef WIN32

#pragma comment(lib,"wsock32")

#endif

ODSocket::ODSocket(SOCKETsock)

{

m_sock =sock;

}

ODSocket::~ODSocket()

{

}

int ODSocket::Init()

{

#ifdefWIN32

/*

http://msdn.microsoft.com/zh-cn/vstudio/ms741563(en-us,VS.85).aspx

typedef struct WSAData {

WORDwVersion; //winsockversion

WORDwHighVersion; //Thehighest version of the Windows Sockets specification that the Ws2_32.dll cansupport

charszDescription[WSADESCRIPTION_LEN+1];

charszSystemStatus[WSASYSSTATUS_LEN+1];

unsignedshort iMaxSockets;

unsignedshort iMaxUdpDg;

charFAR * lpVendorInfo;

}WSADATA, *LPWSADATA;

*/

WSADATAwsaData;

//#define MAKEWORD(a,b) ((WORD)(((BYTE) (a)) | ((WORD) ((BYTE) (b))) << 8))

WORD version = MAKEWORD(2,0);

int ret = WSAStartup(version,&wsaData);//win sock startup

if ( ret ){

cerr<< "Initilize winsock error !" <<endl;

return-1;

}

#endif

return 0;

}

//this is just for windows

int ODSocket::Clean()

{

#ifdef WIN32

return(WSACleanup());

#endif

return0;

}

ODSocket& ODSocket::operator = (SOCKETs)

{

m_sock =s;

return(*this);

}

ODSocket::operator SOCKET ()

{

returnm_sock;

}

//create a socket object win/lin is the same

// af:

bool ODSocket::Create(int af, int type, intprotocol)

{

m_sock = socket(af, type,protocol);

if ( m_sock == INVALID_SOCKET ){

returnfalse;

}

returntrue;

}

bool ODSocket::Connect(const char* ip, unsigned shortport)

{

struct sockaddr_insvraddr;

svraddr.sin_family =AF_INET;

svraddr.sin_addr.s_addr =inet_addr(ip);

svraddr.sin_port = htons(port);

int ret = connect(m_sock,(struct sockaddr*)&svraddr,sizeof(svraddr));

if ( ret == SOCKET_ERROR ){

returnfalse;

}

returntrue;

}

bool ODSocket::Bind(unsigned short port)

{

struct sockaddr_insvraddr;

svraddr.sin_family =AF_INET;

svraddr.sin_addr.s_addr = INADDR_ANY;

svraddr.sin_port =htons(port);

int opt = 1;

if ( setsockopt(m_sock,SOL_SOCKET, SO_REUSEADDR, (char*)&opt, sizeof(opt)) < 0 )

returnfalse;

int ret = bind(m_sock, (structsockaddr*)&svraddr,sizeof(svraddr));

if ( ret == SOCKET_ERROR ){

returnfalse;

}

return true;

}

//for server

bool ODSocket::Listen(int backlog)

{

int ret = listen(m_sock,backlog);

if ( ret == SOCKET_ERROR ){

returnfalse;

}

returntrue;

}

bool ODSocket::Accept(ODSocket& s, char*fromip)

{

struct sockaddr_incliaddr;

socklen_t addrlen =sizeof(cliaddr);

SOCKET sock = accept(m_sock,(struct sockaddr*)&cliaddr, &addrlen);

if ( sock == SOCKET_ERROR ){

returnfalse;

}

s =sock;

if ( fromip != NULL)

sprintf(fromip,"%s",inet_ntoa(cliaddr.sin_addr));

returntrue;

}

int ODSocket::Send(const char* buf, int len, intflags)

{

intbytes;

int count =0;

while ( count < len ){

bytes= send(m_sock, buf + count, len - count,flags);

if( bytes == -1 || bytes == 0 )

return-1;

count+= bytes;

}

returncount;

}

int ODSocket::Recv(char* buf, int len, intflags)

{

return (recv(m_sock, buf, len,flags));

}

int ODSocket::Close()

{

#ifdef WIN32

return(closesocket(m_sock));

#else

return (close(m_sock));

#endif

}

int ODSocket::GetError()

{

#ifdef WIN32

return(WSAGetLastError());

#else

return (errno);

#endif

}

bool ODSocket::DnsParse(const char* domain, char*ip)

{

struct hostent*p;

if ( (p =gethostbyname(domain)) == NULL )

returnfalse;

sprintf(ip,

"%u.%u.%u.%u",

(unsignedchar)p->h_addr_list[0][0],

(unsignedchar)p->h_addr_list[0][1],

(unsignedchar)p->h_addr_list[0][2],

(unsignedchar)p->h_addr_list[0][3]);

return true;

}

其实,说是封装,只是简单的把两个类库糅合在一起,主要是为了自己用到的时候可以方便的调用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: