📄 clientdlg.cpp
字号:
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 + -