Socket类自封装的实现

来源:互联网 发布:linux帮助命令man 编辑:程序博客网 时间:2024/06/03 17:57
// Socket32.h: interface for the CSocket32 class.////////////////////////////////////////////////////////////////////////#if !defined(AFX_SOCKET32_H__0C5B01C7_CACD_44E5_AB92_130605BBD66B__INCLUDED_)#define AFX_SOCKET32_H__0C5B01C7_CACD_44E5_AB92_130605BBD66B__INCLUDED_#if _MSC_VER > 1000#pragma once#endif // _MSC_VER > 1000#ifdef _WIN32#include <WinSock2.h>typedef int socklen_t ;#else#include <sys/socket.h>#include <sys/types.h>#include <netinet/in.h>#include <arpa/inet.h>#include <unistd.h>#include <errno.h>#include <sys/stat.h>#include <string.h>#include <netdb.h>#ifndef CONST#define CONST               const#endiftypedef unsigned char   u_char;typedef unsigned short  u_short;typedef unsigned int    u_int;typedef unsigned long   u_long;typedef u_int           SOCKET;typedef int                 INT;typedef unsigned int        UINT;typedef unsigned int        *PUINT;typedef unsigned long       DWORD;typedef int                 BOOL;typedef unsigned char       BYTE;typedef unsigned short      WORD;typedef float               FLOAT;typedef FLOAT               *PFLOAT;typedef BOOL            *PBOOL;typedef BOOL             *LPBOOL;typedef BYTE            *PBYTE;typedef BYTE             *LPBYTE;typedef int             *PINT;typedef int              *LPINT;typedef WORD            *PWORD;typedef WORD             *LPWORD;typedef long             *LPLONG;typedef DWORD           *PDWORD;typedef DWORD            *LPDWORD;typedef void             *LPVOID;typedef CONST void       *LPCVOID;#ifndef _TCHAR_DEFINEDtypedef char TCHAR, *PTCHAR;typedef unsigned char TBYTE , *PTBYTE ;#define _TCHAR_DEFINED#endif /* !_TCHAR_DEFINED */#ifndef VOID#define VOID voidtypedef char CHAR;typedef short SHORT;typedef long LONG;#endiftypedef CHAR *PCHAR;typedef CHAR *LPCH, *PCH;typedef CONST CHAR *LPCCH, *PCCH;typedef CHAR *NPSTR;typedef CHAR *LPSTR, *PSTR;typedef CONST CHAR *LPCSTR, *PCSTR;typedef LPSTR LPTCH, PTCH;typedef LPSTR PTSTR, LPTSTR;typedef LPCSTR LPCTSTR;#ifndef FALSE#define FALSE               0#endif#ifndef TRUE#define TRUE                1#endif#define INVALID_SOCKET  (SOCKET)(~0)#define SOCKET_ERROR            (-1)typedef struct in_addr  *LPIN_ADDR;#define closesocket(x) close(x)#endifclass CSocket32  {    SOCKET m_hSocket;    public:    BOOL Create( UINT nSocketPort = 0, int nSocketType = SOCK_STREAM , LPCTSTR lpszSocketAddress = NULL );    int SendTo( const void* lpBuf, int nBufLen, UINT nHostPort, LPCSTR lpszHostAddress = NULL, int nFlags = 0 );    int ReceiveFrom( void* lpBuf, int nBufLen, char *rSocketAddress, UINT& rSocketPort, int nFlags = 0 );        BOOL Listen( int nConnectionBacklog = 5 )    {        return !listen(m_hSocket,nConnectionBacklog);    }    int Send( const void* lpBuf, int nBufLen, int nFlags = 0 )    {        return send(m_hSocket, (LPSTR)lpBuf, nBufLen, nFlags);    }    int Receive( void* lpBuf, int nBufLen, int nFlags = 0 )    {        return recv(m_hSocket, (LPSTR)lpBuf, nBufLen, nFlags);    }        void Close( )    {        closesocket(m_hSocket);    }    BOOL GetSockName( char*  rSocketAddress, UINT& rSocketPort );    BOOL GetPeerName(  char* rPeerAddress, UINT& rPeerPort );    BOOL Accept( CSocket32& rConnectedSocket,  LPSTR lpSockAddr = NULL,UINT *nPort = NULL);    BOOL Connect( LPCTSTR lpszHostAddress, UINT nHostPort );            CSocket32();    virtual ~CSocket32();    };#endif // !defined(AFX_SOCKET32_H__0C5B01C7_CACD_44E5_AB92_130605BBD66B__INCLUDED_)// Socket32.cpp: implementation of the CSocket32 class.////////////////////////////////////////////////////////////////////////#include "stdafx.h"#include "Socket32.h"#include <assert.h>//////////////////////////////////////////////////////////////////////// Construction/Destruction////////////////////////////////////////////////////////////////////////构造CSocket32::CSocket32(){#ifdef _WIN32    WSAData wsaData;    int err =WSAStartup(0x0202,&wsaData);    if ( err != 0 )                                   return;    if ( LOBYTE( wsaData.wVersion ) != 2 ||HIBYTE( wsaData.wVersion ) != 2 )    {        WSACleanup( );        return;     }#endif    m_hSocket = INVALID_SOCKET;}//析构CSocket32::~CSocket32(){    Close();}/**********************************************************************///1.创建套接字BOOL CSocket32::Create( UINT nSocketPort, int nSocketType ,LPCTSTR lpszSocketAddress ){    assert(m_hSocket == INVALID_SOCKET);//套接字必须首先初始化为空    m_hSocket = socket(AF_INET,nSocketType,IPPROTO_IP);//然后再创建    if(    m_hSocket == INVALID_SOCKET)        return FALSE;    sockaddr_in addr = {AF_INET,htons(nSocketPort)};    if (!lpszSocketAddress) //如果用户不指定,则系统分配        addr.sin_addr.s_addr = htonl(INADDR_ANY);    else        addr.sin_addr.s_addr = inet_addr(lpszSocketAddress);        if (!bind(m_hSocket,(sockaddr*)&addr,sizeof(addr)))        return TRUE;//If no error occurs, bind returns zero    Close();        return FALSE;}//2.发送(针对UDP)int CSocket32::SendTo( const void* lpBuf, int nBufLen, UINT nHostPort, LPCSTR lpszHostAddress , int nFlags){    sockaddr_in addr = {AF_INET,htons(nHostPort),};    assert(lpszHostAddress);//UDP 必须指定目的地址    addr.sin_addr.s_addr = inet_addr(lpszHostAddress);    return sendto(m_hSocket,(char*)lpBuf,nBufLen,nFlags,(sockaddr*)&addr,sizeof(addr));}//3.接收(针对UDP)int CSocket32::ReceiveFrom( void* lpBuf, int nBufLen, char *rSocketAddress, UINT& rSocketPort, int nFlags ){    sockaddr_in from;//必须设一个临时变量,分配内存,接收信息。    socklen_t fromlen = sizeof(from);//然后才能计算内存长度        int nRet = recvfrom(m_hSocket,(LPSTR)lpBuf,nBufLen,nFlags,(sockaddr*)&from,&fromlen);    if(nRet <= 0)        return nRet;    if(rSocketAddress)    {        strcpy(rSocketAddress,inet_ntoa(from.sin_addr));//out        rSocketPort = htons(from.sin_port);//out    }    return nRet;}//4.接受请求(针对TCP)BOOL CSocket32::Accept( CSocket32& rConnectedSocket, LPSTR lpSockAddr ,UINT *nPort ){    sockaddr_in addr = {AF_INET};    socklen_t nLen = sizeof(addr);    rConnectedSocket.m_hSocket = accept(m_hSocket,(sockaddr*)&addr,&nLen);    if(rConnectedSocket.m_hSocket == INVALID_SOCKET)        return FALSE;    if(lpSockAddr)    {        strcpy(lpSockAddr,inet_ntoa(addr.sin_addr));        *nPort = htons(addr.sin_port);    }    return TRUE;    }//5.请求连接(针对TCP)BOOL CSocket32::Connect( LPCTSTR lpszHostAddress, UINT nHostPort ){    sockaddr_in addr = {AF_INET,htons(nHostPort)};    addr.sin_addr.s_addr = inet_addr(lpszHostAddress);    if (addr.sin_addr.s_addr == INADDR_NONE)//若是有限广播地址,则用本机地址之一    {        hostent * lphost = gethostbyname(lpszHostAddress);        if (lphost != NULL)            addr.sin_addr.s_addr = ((LPIN_ADDR)lphost->h_addr)->s_addr;        else        {            //WSAGetLastError();        //    WSASetLastError(WSAEINVAL);            return FALSE;        }    }    return !connect(m_hSocket,(sockaddr*)&addr,sizeof(addr));}//6.得到本机套接字:IP:PortBOOL CSocket32::GetSockName( char*  rSocketAddress, UINT& rSocketPort ){    sockaddr_in addr;    socklen_t nLen = sizeof(addr);    if(SOCKET_ERROR == getsockname(m_hSocket, (sockaddr*)&addr, &nLen))        return FALSE;    if(rSocketAddress)    {        strcpy(rSocketAddress,inet_ntoa(addr.sin_addr));        rSocketPort = htons(addr.sin_port);    }    return TRUE;}//7.得到对方套接字名字:IP:PortBOOL CSocket32::GetPeerName(  char* rPeerAddress, UINT& rPeerPort ){    sockaddr_in addr;    socklen_t nLen = sizeof(addr);    if(SOCKET_ERROR == getpeername(m_hSocket, (sockaddr*)&addr, &nLen))        return FALSE;    if(rPeerAddress)    {        strcpy(rPeerAddress,inet_ntoa(addr.sin_addr));        rPeerPort = htons(addr.sin_port);    }    return TRUE;}

0 0