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()
{
}