基于winsock的局域网通信系统的开发(5)

2025-09-26

重庆理工大学课程设计

}

if(D_dlg.DoModal()==IDOK) { }

Quit();

CDialog::OnCancel();

LRESULT CP2PClientDlg::OnSessionHeartbeat(WPARAM wParam, LPARAM lParam) {

IM_Message_Block* blk = (IM_Message_Block*)lParam; if(blk) {

unsigned int nTotalOnlineNum = 0; blk->set_cursor(sizeof(IM_Header)); blk->skip(sizeof(unsigned int));

blk->read_UINT32(&theApp.m_ClientInfo.client_ip); blk->read_UINT16(&theApp.m_ClientInfo.client_port); blk->read_UINT8(&theApp.m_ClientInfo.status); blk->read_UINT32(&nTotalOnlineNum); //如果在线人数有变化,则在即时消息框中显示 if(m_nTotalOnlineNum != nTotalOnlineNum) {

m_nTotalOnlineNum = nTotalOnlineNum; CString strMsg;

char szTemp[MAX_STRING_LEN] = \m_ctrlMsgList.GetWindowText(strMsg); strMsg = strMsg + \当前在线用户总数为:\m_ctrlMsgList.SetWindowText(strMsg); //让编辑框中的滚动条滚动到最底端 POINT pt; //取得滚动范围

CString(itoa(m_nTotalOnlineNum,szTemp,10)) + \

21

重庆理工大学课程设计

}

}

}

m_ctrlMsgList.GetScrollRange(SB_VERT, (LPINT)&pt.x, pt.x = 0;

m_ctrlMsgList.SendMessage(EM_LINESCROLL, pt.x, pt.y);

(LPINT)&pt.y);

delete blk;

//收到第一条心跳信息的回复后才发送上线信息,因为发送上线 //信息的时候需要用到自己的ip,端口等信息 if(!m_bIsLogin) { }

OnSelchangeOnlineStatus(); m_bIsLogin = TRUE;

return 1;

LRESULT CP2PClientDlg::OnContactAdd(WPARAM wParam, LPARAM lParam) {

usr_info_base* uib = (usr_info_base*)wParam;//取出好友详细信息 IM_Message_Block* blk = (IM_Message_Block*)lParam; if(!uib || !blk)

return 0;

blk->set_cursor(sizeof(IM_Header)); unsigned int uid = 0; blk->read_UINT32(&uid);

blk->skip(sizeof(unsigned char));//跳过子命令 unsigned char error_code = 0; blk->read_UINT8(&error_code);

if(error_code == IM_CONTACT_ADD_SUCCESS) {

//添加好友成功,开始添加到界面上 char szTemp[MAX_STRING_LEN] = \int nRows = m_ctrlFriendList.GetItemCount();

22

重庆理工大学课程设计

}

m_ctrlFriendList.InsertItem(nRows,itoa(uib->user_id,szTemp,10)); //用于存储将要在该好友身上发生的聊天记录 vector* data = new vector; m_ctrlFriendList.SetItemData(nRows,(DWORD)data); m_ctrlFriendList.SetItemText(nRows,1,(char*)uib->nick); m_ctrlFriendList.SetItemText(nRows,2,\离线\

m_ctrlFriendList.SetItemText(nRows,3,\现在还没有新消息 CString strTemp;

strTemp.Format(\添加好友%u[%s]成功!\AfxMessageBox(strTemp); m_friend_list.push_back(uib);

else if(error_code == IM_CONTACT_ADD_ERROR) { }

//发送获取该好友在线信息消息 IM_Header header;

header.cmd = IM_GET_ONLINE_INFO; header.id = theApp.m_ClientInfo.uid;

header.seq = CP2PClientApp::create_blk_seq(); header.reserved = 0; //开始构造数据包

IM_Message_Block* send_blk = new IM_Message_Block; send_blk->write_header(header);//构造消息头 send_blk->write_UINT32(uid);

send_blk->src_ip_ = theApp.m_ServerInfo.server_ip;//填充该消息的目的地 send_blk->src_port_ = theApp.m_ServerInfo.server_port; send_blk->length_ = send_blk->get_cursor();//填充消息长度 g_send_msg_queue.push_msg(send_blk);//将消息放入发送消息队列

CString strTemp;

strTemp.Format(\添加好友%u[%s]失败!\AfxMessageBox(strTemp); delete uib; return 0;

23

重庆理工大学课程设计

}

delete blk; return 1;

LRESULT CP2PClientDlg::OnContactAddN(WPARAM wParam, LPARAM lParam) { }

LRESULT CP2PClientDlg::OnContactDel(WPARAM wParam, LPARAM lParam) {

IM_Message_Block* blk = (IM_Message_Block*)lParam; if(!blk)

return 0;

//先读取出删除的好友的uid和错误号 blk->set_cursor(sizeof(IM_Header)); unsigned int uid = 0; unsigned char error_code = 0;

IM_Message_Block* blk = (IM_Message_Block*)lParam; if(!blk)

return 0;

blk->set_cursor(sizeof(IM_Header)); unsigned int uid = 0; blk->read_UINT32(&uid); CString strMsg;

char szTemp[MAX_STRING_LEN] = \m_ctrlMsgList.GetWindowText(strMsg);

strMsg = strMsg + CString(itoa(uid,szTemp,10)) + \加你为好友了!\\r\\n\m_ctrlMsgList.SetWindowText(strMsg); //让编辑框中的滚动条滚动到最底端 POINT pt; //取得滚动范围

m_ctrlMsgList.GetScrollRange(SB_VERT, (LPINT)&pt.x, (LPINT)&pt.y); pt.x = 0;

m_ctrlMsgList.SendMessage(EM_LINESCROLL, pt.x, pt.y); delete blk; return 1;

24

重庆理工大学课程设计

blk->read_UINT32(&uid); blk->read_UINT8(&error_code); CString strTemp;

if(error_code == IM_CONTACT_DEL_SUCCESS) {

//从好友列表中删除

vector::iterator it_f = m_friend_list.begin(); for(; it_f!=m_friend_list.end();) { }

//从在线好友列表中删除

vector::iterator it_o = m_friend_online_list.begin(); for(; it_o!=m_friend_online_list.end();) { }

//从界面上删除

int nRows = m_ctrlFriendList.GetItemCount(); CString strValue; for(int i=0; i

strValue = m_ctrlFriendList.GetItemText(i,0); if(uid == atoi(strValue.GetBuffer(0))) {

//删除跟他的聊天记录

usr_info_online* temp = (usr_info_online*)*it_o; if(temp->user_id == uid)

it_o = m_friend_online_list.erase(it_o); it_o++; else

usr_info_base* temp = (usr_info_base*)*it_f; if(temp->user_id == uid)

it_f = m_friend_list.erase(it_f); it_f++; else

25


基于winsock的局域网通信系统的开发(5).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:铁路客运专线结构物沉降观测方案

相关阅读
本类排行
× 游客快捷下载通道(下载后可以自由复制和排版)

下载本文档需要支付 7

支付方式:

开通VIP包月会员 特价:29元/月

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信:xuecool-com QQ:370150219