www.pudn.com > HttpServerusingWinSocket.rar > MyBlockSocket.cpp


// MyBlockSocket.cpp: implementation of the CMyBlockSocket class. 
// 
////////////////////////////////////////////////////////////////////// 
 
#include "stdafx.h" 
#include "HttpServer.h" 
#include "MyBlockSocket.h" 
#include "MyBlockSocketException.h" 
 
 
#ifdef _DEBUG 
#undef THIS_FILE 
static char THIS_FILE[]=__FILE__; 
#define new DEBUG_NEW 
#endif 
 
////////////////////////////////////////////////////////////////////// 
// Construction/Destruction 
////////////////////////////////////////////////////////////////////// 
 
/*********************************************** 
	通过DECLARE_DYNCREATE宏来使用IMPLEMENT_DYNCREATE宏, 
	以允许CObject派生类对象在运行时自动建立。主机使用此功能自动建立对象, 
	例如,但它在串行化过程中从磁盘读去一个对象时, 
	他在类工具里加入IMPLEMENT_DYNCREATE宏。 
	若用户使用DECLARE_DYNCREATE和IMPLEMENT_DYNCREATE宏, 
	那么接着使用RUNTIME_CLASS宏和CObject::IsKindOf成员函数以在运行时确定对象类。 
	若declare_dyncreate包含在定义中,那么IMPLEMENT_DYNCREATE必须包含在类工具中。 
*****************************************************/ 
IMPLEMENT_DYNAMIC(CMyBlockSocket,CObject); 
 
CMyBlockSocket::CMyBlockSocket() 
{ 
	m_hSocket=NULL; 
} 
void CMyBlockSocket::Cleanup(){ 
	if(m_hSocket==NULL){ 
		return; 
	} 
	VERIFY(closesocket(m_hSocket)!=SOCKET_ERROR); 
	m_hSocket=NULL; 
} 
 
void CMyBlockSocket::Create(int nType/*=SOCK_STREAM*/){ 
	ASSERT(m_hSocket==NULL); 
	if(m_hSocket=socket(AF_INET,nType,0)==INVALID_SOCKET){ 
		throw new CMyBlockSocketException("创建套接字Create"); 
	}	 
} 
 
void CMyBlockSocket::Close(){ 
	ASSERT(m_hSocket!=NULL); 
	if(closesocket(m_hSocket)==SOCKET_ERROR){ 
		throw new CMyBlockSocketException("关闭套接字Close"); 
	} 
	m_hSocket=NULL; 
} 
 
void CMyBlockSocket::Bind(LPCSOCKADDR psa){ 
	ASSERT(m_hSocket!=NULL); 
	if(bind(m_hSocket,psa,sizeof(SOCKADDR))==SOCKET_ERROR){ 
		throw new CMyBlockSocketException("绑定地址Bind"); 
	} 
} 
 
void CMyBlockSocket::Listen(){ 
	ASSERT(m_hSocket!=NULL); 
	if(listen(m_hSocket,5)==SOCKET_ERROR){ 
		throw new CMyBlockSocketException("侦听连接Listen"); 
	} 
} 
 
void CMyBlockSocket::Connect(LPCSOCKADDR psa){ 
	ASSERT(m_hSocket!=NULL); 
	if(connect(m_hSocket,psa,sizeof(SOCKADDR))==SOCKET_ERROR){ 
		throw new CMyBlockSocketException("发送连接Connect"); 
	} 
} 
 
BOOL CMyBlockSocket::Accept(CMyBlockSocket& sConnect,LPSOCKADDR psa){ 
	ASSERT(m_hSocket!=NULL); 
	ASSERT(sConnect.m_hSocket==NULL); 
	int nLengthAddr=sizeof(SOCKADDR); 
	sConnect.m_hSocket=accept(m_hSocket,psa,&nLengthAddr); 
	if(sConnect.m_hSocket==INVALID_SOCKET){ 
		if(WSAGetLastError()!=WSAEINTR){ 
			throw new CMyBlockSocketException("接受连接Connect"); 
		} 
		return FALSE; 
	} 
	return TRUE; 
} 
 
int CMyBlockSocket::Send(const char * pch,const int nSize,const int nSecs){ 
	ASSERT(m_hSocket!=NULL); 
	FD_SET fd={1,m_hSocket}; 
	TIMEVAL tv={nSecs,0}; 
	if(select(0,NULL,&fd,NULL,&tv)==0){ 
		throw new CMyBlockSocketException("发送超时Send Timeout"); 
	} 
	int nBytesSend; 
	if((nBytesSend=send(m_hSocket,pch,nSize,0))==SOCKET_ERROR){ 
		throw new CMyBlockSocketException("发送数据Send"); 
	} 
	return nBytesSend; 
} 
 
int CMyBlockSocket::Write(const char * pch,const int nSize,const int nSecs){ 
	 
	int nBytesSend; 
	int nBytesThisTime; 
	const char * pch1=pch; 
	do{ 
		nBytesThisTime=Send(pch1,nSize-nBytesSend,nSecs); 
		nBytesSend+=nBytesThisTime; 
		pch1+=nBytesThisTime; 
	}while(nBytesSendh_addr_list[0]; 
	SOCKADDR_IN sockTemp; 
	sockTemp.sin_family=AF_INET; 
	sockTemp.sin_port=htons(ushPort); 
	sockTemp.sin_addr.s_addr=*pulAddr; 
	return sockTemp; 
} 
 
const char * CMyBlockSocket::GetHostByAddr(LPCSOCKADDR psa){ 
	hostent * pHostEnt=gethostbyaddr((char*)&((LPSOCKADDR_IN)psa)->sin_addr.s_addr,4,PF_INET); 
	if(pHostEnt==NULL){ 
		throw new CMyBlockSocketException("通过地址查找主机GetHostByAddr"); 
	} 
	return pHostEnt->h_name; 
} 
 
CMyBlockSocket::~CMyBlockSocket() 
{ 
 
}