📄 socket.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 + -