www.pudn.com > ViewerCarry.rar > SocketSession.cpp


// SocketSession.cpp: implementation of the CSocketSession class. 
// 
////////////////////////////////////////////////////////////////////// 
 
#include "stdafx.h" 
#include "thumbviewer.h" 
#include "SocketSession.h" 
 
#ifdef _DEBUG 
#undef THIS_FILE 
static char THIS_FILE[]=__FILE__; 
#define new DEBUG_NEW 
#endif 
 
////////////////////////////////////////////////////////////////////// 
// Construction/Destruction 
////////////////////////////////////////////////////////////////////// 
 
CSocketSession::CSocketSession() 
{ 
 
} 
 
CSocketSession::~CSocketSession() 
{ 
 
} 
 
short CSocketSession::initialize(void) 
{ 
	INT iRet = 0; 
	iRet = WSAStartup(MAKEWORD(2, 0), &m_WSAData); 
	if(iRet < 0 ) 
	{ 
		CString sErrBuf; 
	    sErrBuf.Format("错误码=<%d>,错误信息=<%s>\n", WSAGetLastError(),"WSAStartup()初始化socket环境错误"); 
	    //调用异常日志类 
        AfxMessageBox(sErrBuf); 
		return -1; 
	} 
	return 0; 
} 
 
SOCKET CSocketSession::TcpSocket(void) 
{ 
	TCHAR *pszMsg=NULL; 
	int iRet = 0; 
	hostent  *pHosten=NULL; 
    pHosten = new hostent; 
 
	pszMsg = new char[512]; 
    ZeroMemory(pszMsg,512); 
 
	_ASSERT(pszMsg != NULL); 
 
	iRet = gethostname(pszMsg, 256); 
	if(iRet != 0 ) 
	{ 
	    WSACleanup(); 
		CString sErrBuf; 
		sErrBuf.Format("TCP协议:错误码=<%d>,错误信息=<%s>\n", WSAGetLastError(),"gethostname()错误"); 
	    //调用异常日志类 
        AfxMessageBox(sErrBuf); 
		return -1; 
	} 
 
	pHosten = gethostbyname(pszMsg); 
	if(pHosten == NULL) 
	{ 
	    WSACleanup(); 
		CString sErrBuf; 
	    sErrBuf.Format("TCP协议:错误码=<%d>,错误信息=<%s>\n", WSAGetLastError(),"gethostbyname()错误"); 
	    //调用异常日志类 
		AfxMessageBox(sErrBuf); 
		return -1; 
	} 
	 
	m_TcpSck = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 
	if(m_TcpSck == INVALID_SOCKET) 
	{ 
		WSACleanup(); 
		CString sErrBuf; 
	    sErrBuf.Format("TCP协议:错误码=<%d>,错误信息=<%s>\n", WSAGetLastError(),"socket()错误"); 
	    //调用异常日志类 
	    AfxMessageBox(sErrBuf); 
		return -1; 
	} 
	 
	return m_TcpSck; 
} 
 
short CSocketSession::TcpBind(int iPort) 
{ 
	INT iRet = 0; 
	m_addr.sin_family = AF_INET; 
	m_addr.sin_port = htons(iPort); 
	m_addr.sin_addr.S_un.S_addr = INADDR_ANY; 
	 
	iRet = bind(m_TcpSck, (struct sockaddr*)&m_addr, sizeof(m_addr)); 
	if(iRet == SOCKET_ERROR) 
	{ 
	  CString sErrBuf; 
	  sErrBuf.Format("TCP协议:错误码=<%d>,错误信息=<%s>\n", WSAGetLastError(),"bind()错误"); 
	  //调用异常日志类 
	  AfxMessageBox(sErrBuf); 
 
	  WSACleanup(); 
	  return -1;  
    } 
	return 0; 
} 
 
 
short CSocketSession::TcpListen(void) 
{ 
    INT iRet = 0; 
	iRet = listen(m_TcpSck, 5); 
	if(iRet==SOCKET_ERROR) 
	{ 
		closesocket(m_TcpSck); 
	    WSACleanup(); 
		CString sErrBuf; 
	    sErrBuf.Format("TCP协议:错误码=<%d>,错误信息=<%s>\n", WSAGetLastError(),"listen()错误"); 
	    //调用异常日志类 
	    AfxMessageBox(sErrBuf); 
		return -1; 
	} 
    return 0; 
} 
 
 
SOCKET CSocketSession::TcpAccept(void) 
{ 
    INT addrlen = sizeof(m_tcpremoteaddr); 
	SOCKET sckAccept = accept(m_TcpSck, (struct sockaddr*)&m_tcpremoteaddr, &addrlen); 
	if(sckAccept == INVALID_SOCKET ) 
	{ 
	    TcpListenClose(); 
		WSACleanup(); 
 
		CString sErrBuf; 
	    sErrBuf.Format("TCP协议:错误码=<%d>,错误信息=<%s>\n", WSAGetLastError(),"accept()错误"); 
	    //调用异常日志类 
	    AfxMessageBox(sErrBuf); 
 
		return -1; 
	} 
    return sckAccept; 
} 
//重载TcpAccept(),输出源地址 
SOCKET CSocketSession::TcpAccept(CString &sSrcAddr) 
{ 
    INT addrlen = sizeof(m_tcpremoteaddr); 
	SOCKET sckAccept = accept(m_sckTcpListen, (struct sockaddr*)&m_tcpremoteaddr, &addrlen); 
	if(sckAccept == INVALID_SOCKET ) 
	{ 
	    TcpListenClose(); 
		WSACleanup(); 
 
		CString sErrBuf; 
	    sErrBuf.Format("TCP协议:错误码=<%d>,错误信息=<%s>\n", WSAGetLastError(),"accept()错误"); 
	    //调用异常日志类 
	    AfxMessageBox(sErrBuf); 
         
		return -1; 
	} 
	sSrcAddr.Empty(); 
	sSrcAddr = inet_ntoa(m_tcpremoteaddr.sin_addr); 
 
    return sckAccept; 
} 
short CSocketSession::TcpSetSocket(SOCKET sck,long iTimeOut) 
{ 
    iTimeOut = 1000*60*iTimeOut;//超时时间以分钟计数 
	if(setsockopt(sck,SOL_SOCKET,SO_SNDTIMEO,(char *)&iTimeOut, 
	             sizeof(iTimeOut)) == SOCKET_ERROR) 
	{	 
		CString sErrBuf; 
	    sErrBuf.Format("TCP协议:错误码=<%d>,错误信息=<%s>\n", WSAGetLastError(),"setsockopt()设置发送时间超时错误"); 
	    //调用异常日志类 
	    AfxMessageBox(sErrBuf); 
		return -1; 
	} 
		 
	if(setsockopt(sck,SOL_SOCKET,SO_RCVTIMEO,(char *)&iTimeOut, 
		          sizeof(iTimeOut)) == SOCKET_ERROR) 
	{ 
		CString sErrBuf; 
	    sErrBuf.Format("TCP协议:错误码=<%d>,错误信息=<%s>\n", WSAGetLastError(),"setsockopt()设置接收时间超时错误"); 
	    //调用异常日志类 
	    AfxMessageBox(sErrBuf); 
		return -1; 
	} 
   return 0; 
} 
 
short CSocketSession::TcpConnect(int iPort,const TCHAR *szDestIp) 
{        
	short iRet = 0; 
	sockaddr_in  destaddr; 
 
	_ASSERT( szDestIp != NULL ); 
     
	destaddr.sin_family=AF_INET; 
	destaddr.sin_port=htons(iPort); 
	destaddr.sin_addr.S_un.S_addr=inet_addr(szDestIp); 
     
	if((iRet = connect(m_TcpSck,(struct sockaddr *)&destaddr,sizeof(destaddr)) ) 
		     == SOCKET_ERROR ) 
	{ 
	    WSACleanup(); 
		CString sErrBuf; 
	    sErrBuf.Format("TCP协议:错误码=<%d>,错误信息=<%s>\n", WSAGetLastError(),"connect()错误"); 
	    //调用异常日志类 
	    AfxMessageBox(sErrBuf); 
 
		return -1; 
	} 
    return 0; 
} 
 
long CSocketSession::TcpSend(SOCKET sck,const TCHAR *szSendBuf,long iSendLen) 
{ 
    short iRet = 0; 
	 
	_ASSERT(szSendBuf != NULL); 
 
	iRet = send(sck, szSendBuf , iSendLen, 0);  
	if((iRet==SOCKET_ERROR) || (iRet == 0)) 
	{ 
	   closesocket(sck); 
	   shutdown(sck,0); 
	    
	   CString sErrBuf; 
	   sErrBuf.Format("TCP协议:错误码=<%d>,错误信息=<%s>\n", WSAGetLastError(),"send()错误"); 
	   //调用异常日志类 
	   AfxMessageBox(sErrBuf); 
	   return -1; 
	}//if 
    return iRet;   
} 
 
long CSocketSession::TcpRecv(SOCKET sck,TCHAR *szRecvBuf,long iRecvLen) 
{ 
    short iRet = 0; 
	 
	_ASSERT(szRecvBuf != NULL); 
 
	iRet = recv(sck, szRecvBuf ,iRecvLen, 0);  
	if(iRet == 0) 
	{ 
	   closesocket(sck); 
	   shutdown(sck,0); 
        
	   return 0; 
	} 
	if(iRet == SOCKET_ERROR) 
	{ 
	   closesocket(sck); 
	   shutdown(sck,0); 
 
	   CString sErrBuf; 
	   sErrBuf.Format("TCP协议:错误码=<%d>,错误信息=<%s>\n", WSAGetLastError(),"recv()错误"); 
	   //调用异常日志类 
	   AfxMessageBox(sErrBuf); 
 
	   return -1; 
	}//end if 
	 
	return iRet;   
} 
 
short CSocketSession::TcpListenClose(void) 
{ 
     short iRet = 0;  
	iRet = closesocket(m_TcpSck); 
	if(iRet == SOCKET_ERROR) 
	{ 
	    WSACleanup(); 
 
		CString sErrBuf; 
	    sErrBuf.Format("TCP协议:错误码=<%d>,错误信息=<%s>\n", WSAGetLastError(),"closesocket()错误,关闭listen()套节字错误"); 
	    //调用异常日志类 
	    AfxMessageBox(sErrBuf); 
		 
		return -1; 
	} 
	return 0; 
} 
 
short CSocketSession::TcpClose(SOCKET sck) 
{ 
     short iRet = 0;  
	iRet = closesocket(sck); 
	if(iRet == SOCKET_ERROR) 
	{ 
	  CString sErrBuf; 
	  sErrBuf.Format("TCP协议:错误码=<%d>,错误信息=<%s>\n", WSAGetLastError(),"closesocket()错误,关闭accept()套节字错误"); 
	  //调用异常日志类 
	  AfxMessageBox(sErrBuf); 
	  return -1; 
	} 
	return 0; 
} 
 
short CSocketSession::TcpAcceptClose(SOCKET &sck) 
{ 
    short iRet = 0;  
	iRet = closesocket(sck); 
	if(iRet == SOCKET_ERROR) 
	{ 
	  CString sErrBuf; 
	  sErrBuf.Format("TCP协议:错误码=<%d>,错误信息=<%s>\n", WSAGetLastError(),"closesocket()错误,关闭accept()套节字错误"); 
	  //调用异常日志类 
	  AfxMessageBox(sErrBuf); 
	  return -1; 
	} 
	return 0; 
} 
 
void CSocketSession::destory() 
{ 
    WSACleanup(); 
}