?? clientsocket.cpp
字號:
// ClientSocket.cpp : implementation file
//
#include "stdafx.h"
#include "ChatRoom2.h"
#include "ClientSocket.h"
#include "ChatRoom2Dlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CClientSocket
CClientSocket::CClientSocket()
{
m_aSessionIn = NULL;
m_aSessionOut = NULL;
m_sfSockFile = NULL;
m_bInit = false;
m_bClose = false;
}
CClientSocket::~CClientSocket()
{
if(m_aSessionIn)
delete m_aSessionIn;
if(m_aSessionOut)
delete m_aSessionOut;
if (m_sfSockFile)
delete m_sfSockFile;
}
// Do not edit the following lines, which are needed by ClassWizard.
#if 0
BEGIN_MESSAGE_MAP(CClientSocket, CSocket)
//{{AFX_MSG_MAP(CClientSocket)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
#endif // 0
/////////////////////////////////////////////////////////////////////////////
// CClientSocket member functions
void CClientSocket::Init(CChatRoom2Dlg * dlg)
{
m_sfSockFile = new CSocketFile(this);
m_aSessionIn = new CArchive(m_sfSockFile,CArchive::load);
m_aSessionOut = new CArchive(m_sfSockFile,CArchive::store);
m_bClose =false;
m_bFirst = TRUE;
this->m_dlg = dlg;
}
BOOL CClientSocket::SendMsg(CMessage * msg)
{
if (m_aSessionOut!=NULL)
{
msg->Serialize(*m_aSessionOut);
m_aSessionOut->Flush();
return TRUE;
}
else
{
m_bClose = true;
CloseSocket();
m_dlg->CloseSessionScoket();
return FALSE;
}
}
void CClientSocket::CloseSocket()
{
if (m_aSessionIn)
{
delete m_aSessionIn;
m_aSessionIn = NULL;
}
if (m_aSessionOut)
{
delete m_aSessionOut;
m_aSessionOut = NULL;
}
if (m_sfSockFile)
{
delete m_sfSockFile ;
m_sfSockFile = NULL;
}
Close();
m_bClose = true;
m_bInit = false;
}
int CClientSocket::GetLocalHostName(CString &sHostName)
{
char szHostName[256];
int nRetCode;
nRetCode = gethostname(szHostName,sizeof(szHostName));
if (nRetCode!=0)
{
sHostName = _T("沒有取得");
return GetLastError();
}
sHostName = szHostName;
return 0;
}
int CClientSocket::GetIpAddress(const CString &sHostName,CString &sIpAddress)
{
struct hostent FAR *lpHostEnt = gethostbyname(sHostName);
if (lpHostEnt==NULL)
{
sIpAddress = _T("");
return GetLastError();
}
LPSTR lpAddr = lpHostEnt->h_addr_list[0];
if (lpAddr)
{
struct in_addr inaddr;
memmove(&inaddr,lpAddr,4);
sIpAddress = inet_ntoa(inaddr);
if (sIpAddress.IsEmpty())
sIpAddress = _T("沒有取得");
}
return 0;
}
int CClientSocket::GetIpAddress(const CString &sHostName,BYTE &f0,BYTE &f1,BYTE &f2,BYTE &f3)
{
struct hostent FAR * lpHostEnt = gethostbyname(sHostName);
if (lpHostEnt==NULL)
{
f0 = f1 = f2 = f3 = 0;
return GetLastError();
}
LPSTR lpAddr = lpHostEnt->h_addr_list[0];
if (lpAddr)
{
struct in_addr inAddr;
memmove(&inAddr,lpAddr,4);
f0 = inAddr.S_un.S_un_b.s_b1;
f1 = inAddr.S_un.S_un_b.s_b2;
f2 = inAddr.S_un.S_un_b.s_b3;
f3 = inAddr.S_un.S_un_b.s_b4;
}
return 0;
}
CString CClientSocket::ErrorReason(int tag)
{
CString ret;
switch(tag)
{
case WSANOTINITIALISED:
ret = "沒有初始化";
break;
case WSAENETDOWN:
ret = "網(wǎng)絡(luò)出錯";
break;
case WSAEADDRINUSE:
ret = "網(wǎng)絡(luò)地址正在使用";
break;
case WSAEINPROGRESS:
ret = "堵塞窗口套接字正在運行";
break;
case WSAEADDRNOTAVAIL:
ret = "該地址不允許本地機器訪問";
break;
default:
ret = "不知名錯誤";
break;
}
return ret;
}
void CClientSocket::OnReceive(int nErrorCode)
{
CSocket::OnReceive(nErrorCode);
do
{
CMessage temp;
temp.Serialize(*m_aSessionIn);
if ((!m_dlg->m_bClient)&&(!m_bInit))
{
if (temp.m_strText.Left(4)=="ffff")
{
//CClientSocket *s;
//if (s->m_hSocket==this->m_hSocket)
//{
CMessage tt;
tt.m_strText = "ffffok";
this->SendMsg(&tt);
m_dlg->m_strMsgList = "";
m_dlg->SetDlgItemText(IDC_MSG,m_dlg->m_strMsgList);
return;
// }
}
}
if ((m_dlg->m_bClient)&&(!m_bInit))
{
if(temp.m_strText.Left(6)=="ffffok")
{
m_bInit = TRUE;
m_dlg->m_strMsgList = "";
m_dlg->SetDlgItemText(IDC_MSG,m_dlg->m_strMsgList);
return;
}
}
if(m_bFirst)
{
m_dlg->m_strMsgList += "\r\n";
m_bFirst = FALSE;
}
m_dlg->m_strMsgList += m_dlg->m_strShow;
m_dlg->m_strMsgList += "\r\n";
m_dlg->m_strMsgList += temp.m_strText;
m_dlg->SetDlgItemText(IDC_MSG,m_dlg->m_strMsgList);
int linenum = ((CEdit *)(m_dlg->GetDlgItem(IDC_MSG)))->GetLineCount();
((CEdit *)(m_dlg->GetDlgItem(IDC_MSG)))->LineScroll(linenum+1);
if (!m_dlg->m_bClient)
{
for (POSITION pos=m_dlg->m_ConnetionList.GetHeadPosition();pos!=NULL;)
{
CClientSocket *t = (CClientSocket *)m_dlg->m_ConnetionList.GetNext(pos);
if (t->m_hSocket!=this->m_hSocket)
{
t->SendMsg(&temp);
}
}
}
}
while(!m_aSessionIn->IsBufferEmpty());
}
void CClientSocket::OnClose(int nErrorCode)
{
m_bClose = true;
CloseSocket();
m_dlg->CloseSessionScoket();
CSocket::OnClose(nErrorCode);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -