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

📄 clientdlg.cpp

📁 信使小精灵,是一个简易的聊天工具。主要是演示了网络编程的主要步骤。本程序使用封装好的函数库
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		ShowMessageText("请填写用户名字!");

		return;
	}

	char *szServerAddress = strServerAddress.GetBuffer(0);
	strServerAddress.ReleaseBuffer();
	
	/*for Client, IP and Port can be 0, 
	and for Server, IP is LocalIP, and Port is Listening Port*/
	int nResult = m_tClientTunnel.net_OpenSocket(Transport_Client, 
											0,
											HandleClientNetEvent, 
											this);
	
	if( TRANSPORT_OK != nResult )
	{
		ShowMessageText("网络初始化失败!");		

		return;
	}

	DWORD dwRemoteIPValue = inet_addr(szServerAddress);
	WORD wPort = SERVER_PORT;	
	nResult = m_tClientTunnel.net_Connect(dwRemoteIPValue, wPort);
	if( TRANSPORT_OK != nResult )
	{
		m_tClientTunnel.net_CloseSocket();

		ShowMessageText("连接服务器失败!");
		//MessageBox("连接服务器失败!", "警告", MB_OK|MB_ICONSTOP);
		
		return;
	}

	m_cmbChatMessage.SetFocus();

	CEdit *pEditWnd = (CEdit *)m_cmbServerAddress.GetWindow(GW_CHILD);
	if( NULL != pEditWnd )
	{
		pEditWnd->SetReadOnly(TRUE);
	}
	pEditWnd = (CEdit *)m_cmbUserName.GetWindow(GW_CHILD);
	if( NULL != pEditWnd )
	{
		pEditWnd->SetReadOnly(TRUE);
	}
	
	if( CB_ERR == (m_cmbServerAddress.FindString(-1, strServerAddress)) )
	{
		m_cmbServerAddress.InsertString(0, strServerAddress);
	}	
	if( CB_ERR == (m_cmbUserName.FindString(-1, strUserName)) )
	{
		m_cmbUserName.InsertString(0, strUserName);
	}

	GetDlgItem(IDC_CONNECT)->EnableWindow(FALSE);
	GetDlgItem(IDC_DISCONNECT)->EnableWindow(TRUE);

	ShowMessageText("连接服务器成功!");

	ProcessLoginRequest();
}

void CClientDlg::OnDisconnect() 
{
	// TODO: Add your control notification handler code here
	CWaitCursor wait;

	int nResult = m_tClientTunnel.net_CloseSocket();
	if( TRANSPORT_OK != nResult )
	{
		return;
	}

	SetConnectionID(INVALID_SOCKET);

	CEdit *pEditWnd = (CEdit *)m_cmbServerAddress.GetWindow(GW_CHILD);
	if( NULL != pEditWnd )
	{
		pEditWnd->SetReadOnly(FALSE);
	}
	pEditWnd = (CEdit *)m_cmbUserName.GetWindow(GW_CHILD);
	if( NULL != pEditWnd )
	{
		pEditWnd->SetReadOnly(FALSE);
	}

	GetDlgItem(IDC_CONNECT)->EnableWindow(TRUE);
	GetDlgItem(IDC_DISCONNECT)->EnableWindow(FALSE);

	ShowMessageText("断开与服务器的连接!");

	m_ctrlUserList.ResetContent();
	m_ctrlUserList.EnableWindow(FALSE);

	SetWindowText((CString)WINDOW_TITLE);
}

void CClientDlg::OnSend() 
{
	// TODO: Add your control notification handler code here
	if( !UpdateData() ) return;

	CString strChatMessage = m_strChatMessage;
	strChatMessage.TrimLeft();
	strChatMessage.TrimRight();
	if( strChatMessage.IsEmpty() ) 
	{
		m_strChatMessage.Empty();
		UpdateData(FALSE);

		m_cmbChatMessage.SetFocus();

		return;
	}

	if( INVALID_SOCKET == GetConnectionID() )
	{
		ShowMessageText("请先连接服务器!");

		return;
	}
	
	const char *szDataBuf = strChatMessage.GetBuffer(0);
	strChatMessage.ReleaseBuffer();

	ProcessChatMessageRequest(szDataBuf);

	m_cmbChatMessage.SetFocus();
}

void CClientDlg::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default
	if( DISCONNECT_TIMER == nIDEvent )
	{
		KillTimer(nIDEvent);

		ShowMessageText("服务器已经关闭!");

		OnDisconnect();
	}
	else if( LOGINFAILED_TIMER == nIDEvent )
	{
		KillTimer(nIDEvent);

		OnDisconnect();
	}
	
	CDialog::OnTimer(nIDEvent);
}

///////////////////////////////////////////////////////////////////////////////
DWORD CClientDlg::GetConnectionID()
{
	return m_dwConnectionID;
}

void CClientDlg::SetConnectionID(DWORD dwConnection)
{
	m_dwConnectionID = dwConnection;
}
///////////////////////////////////////////////////////////////////////////////
void CClientDlg::ProcessLoginRequest()
{
	WORD wMessageId = MSG_LOGIN_REQ;
	TLOGIN_STRU tLogonInfo = {0};
	tLogonInfo.tCommonMsg.dwConnectionID = GetConnectionID();
	tLogonInfo.tCommonMsg.wMessageId = wMessageId;

	CString strUserName = m_strUserName;
	strUserName.TrimLeft();
	strUserName.TrimRight();
	strcpy(tLogonInfo.tUserInfo.szUserName, strUserName);
	
	DWORD dwDataLen = sizeof(TLOGIN_STRU);
	TMessageHeader tHeader = {0};
	tHeader.wMessageId = wMessageId;
	tHeader.dwDataLen = dwDataLen;

	unsigned long ulSendLen = m_tClientTunnel.net_Send(&tHeader, (void *)&tLogonInfo, dwDataLen);
	if( ulSendLen == SOCKET_ERROR )
	{
		ShowMessageText("发送登录请求失败!");	
	}
}

void CClientDlg::ProcessLoginResponse(void *pLoginResult)
{
	if( NULL == pLoginResult ) return;

	LOGIN_RESULT_STRU *ptLoginResult = (LOGIN_RESULT_STRU *)pLoginResult;

	DWORD dwConnectionID = ptLoginResult->tCommonMsg.dwConnectionID;
	SetConnectionID(dwConnectionID);

	BYTE byResult = ptLoginResult->byResult;

	if(LOGIN_RESULT_SUC == byResult)
	{
		CString strWindowText("");
		strWindowText.Format("%s -- %s", WINDOW_TITLE, m_strUserName);
		SetWindowText(strWindowText);

		m_ctrlUserList.EnableWindow(TRUE);
		
		int nIndex = m_ctrlUserList.InsertString(0, "     所有人");
		if( (LB_ERR != nIndex) && (LB_ERRSPACE != nIndex) )
		{
			m_ctrlUserList.SetItemData(nIndex, INVALID_SOCKET);
			m_ctrlUserList.SetCurSel(nIndex);
		}
	}
	else
	{
		SetTimer(LOGINFAILED_TIMER, 0, NULL);
	}

	CString strCommentInfo("");
	strCommentInfo.Format("%s. 用户代号: %ld", 
		((LOGIN_RESULT_SUC == byResult) ? "登录成功" : 
		(LOGIN_RESULT_MULTI == byResult) ? "重复登录" : 
		(LOGIN_RESULT_NAMERROR == byResult) ? "名字不存在" : 
		(LOGIN_RESULT_PWERROR == byResult) ? "密码错误" : "登录失败"),
		dwConnectionID);
	ShowMessageText((CString)strCommentInfo);
}

void CClientDlg::ProcessUserListInfoResponse(void *pUserListInfo)
{
	if( NULL == pUserListInfo ) return;

	TUSERLIST_INFO_STRU *ptUserListInfo = (TUSERLIST_INFO_STRU *)pUserListInfo;
	
	DWORD dwConnectionID = ptUserListInfo->dwConnectionID;
	if( INVALID_SOCKET == dwConnectionID ) return;
	if( dwConnectionID == GetConnectionID() ) return;	/*The owner*/

	BYTE byStatus = ptUserListInfo->byStatus;
	if( USER_STATUS_ONLINE == byStatus )
	{
		CString strUserName = ptUserListInfo->szUserName;

		int nIndex = m_ctrlUserList.AddString(strUserName);
		if( (LB_ERR != nIndex) && (LB_ERRSPACE != nIndex) )
		{
			m_ctrlUserList.SetItemData(nIndex, dwConnectionID);
		}
	}
}

void CClientDlg::ProcessLogoutResponse(void *pLogoutInfo)
{
	TUSERLIST_INFO_STRU *ptUserListInfo = (TUSERLIST_INFO_STRU *)pLogoutInfo;
	
	DWORD dwConnectionID = ptUserListInfo->dwConnectionID;
	if( INVALID_SOCKET == dwConnectionID ) return;
	if( dwConnectionID == GetConnectionID() ) return;	/*The owner*/

	BYTE byStatus = ptUserListInfo->byStatus;
	if( USER_STATUS_OFFLINE == byStatus )
	{
		int nCount = m_ctrlUserList.GetCount();
		for(int nIndex = 0; nIndex < nCount; nIndex++)
		{
			DWORD dwItemData = m_ctrlUserList.GetItemData(nIndex);
			if( dwConnectionID == dwItemData )
			{
				m_ctrlUserList.DeleteString(nIndex);

				break;
			}
		}
	}
}

void CClientDlg::ProcessChatMessageRequest(const char *szChatMessage)
{
	const char *szDataBuf = szChatMessage;
	int nDataLen = strlen(szDataBuf) + 1;	//characters should +1

	DWORD dwFromUserID = GetConnectionID();

	int nSelIndex = m_ctrlUserList.GetCurSel();
	if( LB_ERR == nSelIndex )
	{
		ShowMessageText("请在用户列表中选择一个目标用户!");

		return;
	}
	DWORD dwToUserID = m_ctrlUserList.GetItemData(nSelIndex);

	WORD wMessageId = MSG_CHATMESSAGE_REQ;
	DWORD dwDataLen = sizeof(TCHAT_MESSAGE_STRU) + nDataLen;
	TCHAT_MESSAGE_STRU *pChatMessage = new TCHAT_MESSAGE_STRU[dwDataLen];
	memset(pChatMessage, 0x00, dwDataLen);
	pChatMessage->tCommonMsg.dwConnectionID = GetConnectionID();
	pChatMessage->tCommonMsg.wMessageId = wMessageId;
	pChatMessage->dwFromUserID = dwFromUserID;
	pChatMessage->dwToUserID = dwToUserID;
	strcpy(pChatMessage->szFromUserName, m_strUserName);
	pChatMessage->wMessageLen = nDataLen;
	memcpy(pChatMessage->byFileContent, szDataBuf, nDataLen);
		
	TMessageHeader tHeader = {0};
	tHeader.wMessageId = wMessageId;
	tHeader.dwDataLen = dwDataLen;

	unsigned long ulSendLen = m_tClientTunnel.net_Send(&tHeader, (void *)pChatMessage, dwDataLen);
	if( ulSendLen != SOCKET_ERROR )
	{
		CString strChatMessage = (CString)szChatMessage;
		if( CB_ERR == (m_cmbChatMessage.FindString(-1, strChatMessage)) )
		{
			m_cmbChatMessage.InsertString(0, strChatMessage);
		}

		m_strChatMessage.Empty();
		UpdateData(FALSE);
	}
	else
	{
		ShowMessageText("发送信息失败!");
	}

	delete [] pChatMessage;
	pChatMessage = NULL;
}

void CClientDlg::ProcessChatMessageResponse(void *pResponse)
{
	if( NULL == pResponse ) return;

	TCHAT_MESSAGE_STRU *pChatMessage = (TCHAT_MESSAGE_STRU *)pResponse;				
	
	int nMessageLen = pChatMessage->wMessageLen;
	if( nMessageLen > 0 )
	{
		char *szChatMessage = new char[nMessageLen];
		memset(szChatMessage, 0x00, nMessageLen);
		memcpy(szChatMessage, pChatMessage->byFileContent, nMessageLen);

		DWORD dwConnectionID = pChatMessage->tCommonMsg.dwConnectionID;
		
		CString strChatMessageInfo("");
		strChatMessageInfo.Format("[%s] 说道: %s", pChatMessage->szFromUserName, szChatMessage);
		ShowMessageText(strChatMessageInfo);
		
		delete [] szChatMessage;
		szChatMessage = NULL;
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -