//
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
#endif
typedef 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_DEFINED
typedef char TCHAR, * PTCHAR;
typedef unsigned char TBYTE , * PTBYTE ;
#define _TCHAR_DEFINED
#endif /* !_TCHAR_DEFINED */
#ifndef VOID
#define VOID void
typedef char CHAR;
typedef short SHORT;
typedef long LONG;
#endif
typedef 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)
#endif
class 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_)
//
/**/ //////////////////////////////////////////////////////////////////////
#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
#endif
typedef 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_DEFINED
typedef char TCHAR, * PTCHAR;
typedef unsigned char TBYTE , * PTBYTE ;
#define _TCHAR_DEFINED
#endif /* !_TCHAR_DEFINED */
#ifndef VOID
#define VOID void
typedef char CHAR;
typedef short SHORT;
typedef long LONG;
#endif
typedef 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)
#endif
class 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:Port
BOOL 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:Port
BOOL 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;
}
//
/**/ //////////////////////////////////////////////////////////////////////
#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:Port
BOOL 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:Port
BOOL 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;
}