⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 socket.cpp

📁 一个HTTP协议的封装类
💻 CPP
字号:
#include "StdAfx.h"
#include "Socket.h"
#include <stdio.h>
#include "..\error\FaultCenter.h"
using namespace fs::error;

namespace fs
{
	namespace socket
	{
		/************************************************************************/
		/* 构造函数                                                                     */
		/************************************************************************/
		Socket::Socket(BOOL create)
		{
			if (create)
			{
				CreateSocket();
			}
			else
			{
				m_socket=INVALID_SOCKET;
			}
		}

		Socket::Socket( Address& address )
		{
			CreateSocket();
			SetAddress(address);
		}

		Socket::Socket( LPCSTR ip,UINT port )
		{
			CreateSocket();
			SetAddress(ip,port);
		}

		Socket::Socket( UINT port )
		{
			CreateSocket();
			SetAddressPort(port);
		}

		Socket::~Socket( void )
		{
			if (m_socket!=-1)
			{
				closesocket(m_socket);
			}
		}
		
		/************************************************************************/
		/* socket发送信息                                                                     */
		/************************************************************************/
		BOOL Socket::Send(CONST char* pBuf,UINT len )
		{
			return Send(this, pBuf,len );
		}

		BOOL Socket::Send( string message )
		{
			return Send((char*)message.c_str(),message.length());
		}

		BOOL Socket::Send(Socket* pTo,CONST char* pBuf,UINT len )
		{
			int retval=send(pTo->m_socket,pBuf,len,0);
			return FaultCenter::TryCatch(_T("socket"),_T("send"),retval);
		}

		/************************************************************************/
		/* 设置socket地址信息                                                                    */
		/************************************************************************/
		void Socket::SetAddress( Address& address )
		{
			m_address=address;
		}
		BOOL Socket::SetAddress(const LPCSTR ip,UINT port,BOOL isDomainName )
		{
			return m_address.Set(ip,port,isDomainName);
		}
		void Socket::SetAddressPort( UINT port )
		{
			m_address.SetPort(port);
		}

		/************************************************************************/
		/* 接收数据,len设置为希望接收到的数据长度,返回实际接收到的数据长度                                                                 */
		/************************************************************************/
		BOOL Socket::Receive(CHAR* pBuf,UINT& len )
		{
			len=recv(m_socket,pBuf,len,0);

			if (len==0) //the connection has been gracefully closed
				return FALSE;
			else
				return FaultCenter::TryCatch(_T("socket"),_T("recv"),len);

		}

		CHAR* Socket::ReceiveD( UINT& size )
		{	
			INT MAX=1024;

			UINT jump = MAX;
			UINT len = 0;//接收数据的总长度
			UINT retval=jump;//一次接收的最大长度,和一次实际接收的长度

			CHAR* pBuf = new CHAR[retval+1];
			memset(pBuf,'\0',retval);

			BOOL bRet=Receive(pBuf,retval);
			if (!bRet)
			{
				delete [] pBuf;
				pBuf=NULL;
				return NULL;
			}
			len+=retval;

			while( retval >0 )//直到接收量为0
			{
				//创建更大的临时缓存,并将原数据拷贝到这里
				CHAR* pTemp = new CHAR[ len + jump ];
				memset(pTemp,'\0',len + jump);
				memcpy( pTemp,pBuf,len );
				delete[] pBuf;
				pBuf=pTemp;

				//继续接收
				Receive(pBuf+len,retval);
				len+=retval;				
			}

			if (len%MAX==0)
			{
				CHAR*  pTemp = new CHAR[ len +1 ];
				memcpy( pTemp,pBuf, len);
				delete[] pBuf;
				pBuf = pTemp;
				pBuf[len]='\0';
			}

			size=len;
			return pBuf;
		}
		/************************************************************************/
		/* private                                                                     */
		/************************************************************************/
		VOID Socket::CreateSocket()
		{
			//socket函数与socket名字空间相同,所以要加上域操作符::
			m_socket=::socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
			FaultCenter::TryCatch(_T("socket"),_T("socket"),m_socket);
		}

		VOID Socket::SetSocket( SOCKET sock )
		{
			m_socket=sock;
		}

		VOID Socket::OnReceive(CHAR* pBuf,UINT len )
		{
			//printf("received message:%s\n",pBuf);

			delete[] pBuf;
			pBuf=NULL;
		}

		VOID Socket::Run()
		{
			while (isRun)
			{
				UINT len=0;
				CHAR* pBuf=ReceiveD(len);

				if (!pBuf)
				{
					OnPassiveDisconnect();
					break;
				}

				OnReceive(pBuf,len);
			}
			Stop();
		}

		CONST Address& Socket::GetAddress()
		{
			return m_address;
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -