操作系统与网络 2019-3-26
1.FeiQ项目
1.1 登录的时候给当前所在局域网内所有IP发送一个广播
- 1.发送广播是应该在主对话框的初始化时进行的;
- 2.发送的数据是上线请求数据;
- 3.IP 是本机的 IP ,可以通过 Net 的 GetLocalIPAddr 函数获得;
- 4.通过中介者调用 SendData 来进行发送数据;
BOOL CFeiQProjDlg::OnInitDialog()
{... ...// =====================3-26发送广播========================// 定义一个登陆的数据包STRU_ONLINE_RQ soRQ;soRQ.pack_type = PROTOCL_ONLINE_RQ;// 把IP装到包里sockaddr_in addr;addr.sin_addr.S_un.S_addr = theApp.m_p_mediator->p_net->GetLocalIPAddr();strcpy_s(soRQ.sz_user_name, NAME_SIZE, inet_ntoa(addr.sin_addr));// 发送广播theApp.m_p_mediator->SendData(INADDR_BROADCAST, (const char*)&soRQ, sizeof(soRQ));// =====================3-26发送广播========================return TRUE;
}
1.2 我们在创建主对话框时发送了一条广播,那么其他人接受到这条广播数据之后应该如何进行处理,我们在中介者的 DealData 函数中给出
- 1.接受到数据包后, DealData 函数首先将数据包的包头取出来,判断是哪种数据类型,在进行进一步的判断;
- 2.若是上线请求数据包,我们给主窗口发送一个消息,这个消息用来给主对话框添加IP,之后我们发送一个确认上线的数据包;
bool CUDPMediator::DealData(ULONG uIP, char* pszSendBuffer, int nSendLen)
{// 解析数据包PackType* p_type = (PackType*)pszSendBuffer;switch (*p_type){// 上线发送广播的消息case PROTOCL_ONLINE_RQ:{STRU_ONLINE_RQ* soRQ = (STRU_ONLINE_RQ*)pszSendBuffer;// 1.把对方发来的IP插入到本地窗口上(通过给主对话框发送消息来进行)theApp.m_pMainWnd->SendMessage(UM_ONLINE, 0, (LPARAM)(soRQ->sz_user_name));// 2.给对方发送一个上线回复包STRU_ONLINE_RS soRS;soRS.pack_type = PROTOCL_ONLINE_RS;sockaddr_in addr;addr.sin_addr.S_un.S_addr = p_net->GetLocalIPAddr();strcpy_s(soRS.sz_user_name, NAME_SIZE, inet_ntoa(addr.sin_addr));this->SendData(inet_addr(soRQ->sz_user_name), (const char*)&soRS, sizeof(soRS));}break;}return true;
}
- 3.在 PackDef.h 中定义一个消息用来映射将IP写到主对话框上的函数,定义的宏为 UM_ONLINE_RQ ;
- 4.在主对话框类中定义一个自定义消息处理函数,在该函数中调用 m_lb_IPAddr 对象的 InsertIP 函数;
BEGIN_MESSAGE_MAP(CFeiQProjDlg, CDialogEx)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_MESSAGE(UM_ONLINE_RQ, &CFeiQProjDlg::OnOnLineRQ)
END_MESSAGE_MAP()LRESULT CFeiQProjDlg::OnOnLineRQ(WPARAM wParam, LPARAM lParam)
{char* psz_user_name = (char*)lParam;m_lb_IPAddr.InsertIP(psz_user_name);return 0;
}
1.3 在中介者的上线回复包中给主窗口发送一个自定义消息,用来将接收到的回复包中的IP插入到主对话框中
bool CUDPMediator::DealData(ULONG uIP, char* pszSendBuffer, int nSendLen)
{// 解析数据包PackType* p_type = (PackType*)pszSendBuffer;switch (*p_type){... ...case PROTOCL_ONLINE_RS:{STRU_ONLINE_RS* soRS = (STRU_ONLINE_RS*)pszSendBuffer;theApp.m_pMainWnd->SendMessage(UM_ONLINE_RS, 0, (LPARAM)(soRS->sz_user_name));}break;}return true;
}
- 1.再在主对话框中添加一个与 OnOnLineRQ 函数类似的函数,用来处理 UM_ONLINE_RS 消息;
BEGIN_MESSAGE_MAP(CFeiQProjDlg, CDialogEx)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_MESSAGE(UM_ONLINE_RQ, &CFeiQProjDlg::OnOnLineRQ)ON_MESSAGE(UM_ONLINE_RS, &CFeiQProjDlg::OnOnLineRS)
END_MESSAGE_MAP()LRESULT CFeiQProjDlg::OnOnLineRS(WPARAM wParam, LPARAM lParam)
{char* psz_user_name = (char*)lParam;m_lb_IPAddr.InsertIP(psz_user_name);return 0;
}
1.4 关闭主对话框时也需给当前局域网中所有的IP发送一个广播
- 1.与初始化对话框的发送广播基本一样,不同之处在于发送的数据包的类型不同;
- 2.给主对话框类添加一个 WM_CLOSE 消息,在该消息处理函数中发送广播;
void CFeiQProjDlg::OnClose()
{// 关闭的时候发送一个广播STRU_OFFLINE_RQ soRQ;soRQ.pack_type = PROTOCL_OFFLINE_RQ;// 把IP装到包里sockaddr_in addr;addr.sin_addr.S_un.S_addr = theApp.m_p_mediator->p_net->GetLocalIPAddr();strcpy_s(soRQ.sz_user_name, NAME_SIZE, inet_ntoa(addr.sin_addr));// 发送广播theApp.m_p_mediator->SendData(INADDR_BROADCAST, (const char*)&soRQ, sizeof(soRQ));CDialogEx::OnClose();
}
1.5 当别的客户端下线的时候,我们会收到一个 STRU_OFFLINE_RQ 消息,在中介者中进行处理
bool CUDPMediator::DealData(ULONG uIP, char* pszSendBuffer, int nSendLen)
{// 解析数据包PackType* p_type = (PackType*)pszSendBuffer;switch (*p_type){... ...case PROTOCL_OFFLINE_RQ:{STRU_OFFLINE_RQ* soRQ = (STRU_OFFLINE_RQ*)pszSendBuffer;// 收到下线请求之后给主对话框发送一个消息theApp.m_pMainWnd->SendMessage(UM_OFFLINE_RQ, 0, (LPARAM)soRQ->sz_user_name);}break;}return true;
}
- 1.再在主对话框中添加一个消息处理函数: OnOffLineRQ ;
- 2.首先查找 listbox 控件中的IP,存在的话就删除;
- 3.再在map中查找,有的话就删除map中的值;
LRESULT CFeiQProjDlg::OnOffLineRQ(WPARAM wParam, LPARAM lParam)
{char* psz_user_name = (char*)lParam;//bool b_flag = false;// 先删除列表控件中的字符串for(int i=0; i<m_lb_IPAddr.GetCount(); i++){CString strIP;m_lb_IPAddr.GetText(i, strIP);if(strIP == psz_user_name){m_lb_IPAddr.DeleteString(i);//b_flag = true;break;}}if(m_lb_IPAddr.m_mp_sayDlg.count(psz_user_name) == 1){// 删除map中的节点map<CString, CSayDlg*>::iterator ite = m_lb_IPAddr.m_mp_sayDlg.find(psz_user_name);delete ite->second;m_lb_IPAddr.m_mp_sayDlg.erase(ite);}return 0;
}
操作系统与网络 2019-3-26相关推荐
- 拉勾网《32个Java面试必考点》学习笔记之二------操作系统与网络知识
本文为拉勾网<32个Java面试必考点>学习笔记.只是对视频内容进行简单整理,详细内容还请自行观看视频<32个Java面试必考点>.若本文侵犯了相关所有者的权益,请联系:txz ...
- 训练日志 2019.1.26
上午补了道 2-sat 的题,这类问题还是不太熟练,不是很能准确的找到条件 下午打比赛,立的 flag 成功崩了...数组没开小但把精度爆了..+= 把 + 忘了...一道巨水的题把输入看错了...大 ...
- 18天精读掌握《费曼物理学讲义卷一》 第10天 2019/6/26
18天精读掌握<费曼物理学讲义卷一> 第10天 2019/6/26 1. 18日掌握<费曼物理学讲义>卷一计划概览 2. 今日学习成果 3. 今日时间表 4.Atimelogg ...
- linux网卡断流测试,Windows XP SP2操作系统下网络非完全断流的再分析(转)
Windows XP SP2操作系统下网络非完全断流的再分析(转)[@more@] 在升级到WindowsSP2系统后,本人的电脑经常出现这种怪毛病,具体情况为:在上网时网关能够PING通,用Bitc ...
- EMQ 加入VMware 创新网络“威睿加速计划” 并将参加 VMware 创新网络 2019 高峰论坛
伴随 AIoT & 5G 时代到来,数字化转型进程的深⼊推进,和 ICT 融合.边缘计算.多云架构的产业趋势,开源创新生态的重要性变的越来越明显. VMware 作为全球领先的企业软件创新者, ...
- 2019.10.26
2019.10.26 void Level::keyPressEvent(QKeyEvent *event){switch(event->key()){case Qt::Key_A:goingL ...
- 服务器操作系统就是网络操作系统,下列网络系统软件中,最重要的是()。A. 服务器操作系统B. 网络操作系统C. 工作站重定向软件D....
下列网络系统软件中,最重要的是().A. 服务器操作系统B. 网络操作系统C. 工作站重定向软件D. 更多相关问题 [单选] 套管可分为表层套管.()和油层套管. [单选] 硅酸盐水泥中,对强度贡献最 ...
- 棒棒糖-小学数学出题机v1.4.2【更新2019/12/26】
[推荐]2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 今年儿子刚上一年级,现在每天要做口算题,每次都要打印100题随机题目让他做,网上找了很多出题器,不是操作太繁琐 ...
- STM32CubeMX+LAN8720+LWIP不带操作系统实现网络通讯
STM32CubeMX+LAN8720+LWIP不带操作系统实现网络通讯 使用STM32CubeMX可以非常方便的将LWIP移植到工程中,本文就是介绍如何利用STM32CubeMX移植LWIP到STM ...
- ROS2网络课程资料分享2019.10.26
目前,网络上主要的ROS2课程主要有: Constructsim:https://www.theconstructsim.com/robotigniteacademy_learnros/ros-cou ...
最新文章
- 中央纪委网站:​深度关注 | 元宇宙如何改写人类社会生活
- Window 消息大全使用详解(无聊没事做)
- JS如何监听动画结束
- (王道408考研数据结构)第八章排序-第五节:归并排序
- html5 canvas画布上合成
- 【Python】实现最大最小距离算法
- QT【001】- 基础写在前面的话
- IntelliJ IDEA 设置Output (输出窗口)窗口字体大小
- 对象数组根据某属性列的灵活排序
- mysql主库从库在同一台服务器_mysql数据库从一台服务器迁移到另一台服务器上...
- Java try-catch示例
- App测试中ios和Android的区别2
- html的字母u代表什么意思,html元素 u 标签的使用方法及作用
- leetcode刷题日记- 超级次方
- RFID应急物资管理系统
- 把抽奖活动写成一篇技术博客是怎样一种体验
- 010项目沟通管理和干系人管理
- 有效预防xss_预防XSS攻击的一些方法整理
- Office2007页眉有横线
- pyqtgraph文档笔记(五)总结:几个类的理解( GraphicsView, GraphicsItem ,GraphicsObject, PlotWidget等)