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