⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 clientsocket.cpp

📁 自己做的局域网聊天工具
💻 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 = "网络出错";
		break;
	case WSAEADDRINUSE:
		ret = "网络地址正在使用";
		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 + -