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
- Socket类自封装的实现
- 封装自己的socket类
- C++封装的SOCKET类
- Socket编程封装的类
- c++实现封装socket
- 近期在制作QSocket类,实现对Linux、unix 下的Socket的封装
- Android 自封装的各种类
- Gnugk的Socket封装类yasocket
- 自己封装的Socket类-Socket_Zmy
- 别人封装的socket
- 类的封装实现
- socket 非阻塞模式下的connect封装实现
- Socket编程实现文件的传输II(封装)
- TCP SOCKET封装类
- 利用CAsyncSocket类实现Socket编程 选择自 yuguanglou 的 Blog
- 自己封装的Socket组件,实现服务端多进程共享Socket对象,协同处理客户端请求
- 自封装的链表
- 一个简单的socket封装
- 消息队列的应用及自己封装的消息队列类
- C++预编译头文件
- 19 套最佳 HTML/CSS 定价表模板及教程
- linux下SVN服务器如何搭建和使用
- C++句柄的理解
- Socket类自封装的实现
- shell中的循环语句和条件语句
- Toast.LENGTH_LONG和Toast.LENGTH_SHORT分别对应多长时间
- Android 系统 强制 禁用 距离传感器 方法
- 基于CSerialPort修改类的串口调试助手编写过程中遇到的问题总结
- java整合opencv
- bitmap 上面两个圆角
- Linux查询CPU、内存、网卡等信息
- hdu 2062 Subset sequence