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相关推荐

  1. 拉勾网《32个Java面试必考点》学习笔记之二------操作系统与网络知识

    本文为拉勾网<32个Java面试必考点>学习笔记.只是对视频内容进行简单整理,详细内容还请自行观看视频<32个Java面试必考点>.若本文侵犯了相关所有者的权益,请联系:txz ...

  2. 训练日志 2019.1.26

    上午补了道 2-sat 的题,这类问题还是不太熟练,不是很能准确的找到条件 下午打比赛,立的 flag 成功崩了...数组没开小但把精度爆了..+= 把 + 忘了...一道巨水的题把输入看错了...大 ...

  3. 18天精读掌握《费曼物理学讲义卷一》 第10天 2019/6/26

    18天精读掌握<费曼物理学讲义卷一> 第10天 2019/6/26 1. 18日掌握<费曼物理学讲义>卷一计划概览 2. 今日学习成果 3. 今日时间表 4.Atimelogg ...

  4. linux网卡断流测试,Windows XP SP2操作系统下网络非完全断流的再分析(转)

    Windows XP SP2操作系统下网络非完全断流的再分析(转)[@more@] 在升级到WindowsSP2系统后,本人的电脑经常出现这种怪毛病,具体情况为:在上网时网关能够PING通,用Bitc ...

  5. EMQ 加入VMware 创新网络“威睿加速计划” 并将参加 VMware 创新网络 2019 高峰论坛

    伴随 AIoT & 5G 时代到来,数字化转型进程的深⼊推进,和 ICT 融合.边缘计算.多云架构的产业趋势,开源创新生态的重要性变的越来越明显. VMware 作为全球领先的企业软件创新者, ...

  6. 2019.10.26

    2019.10.26 void Level::keyPressEvent(QKeyEvent *event){switch(event->key()){case Qt::Key_A:goingL ...

  7. 服务器操作系统就是网络操作系统,下列网络系统软件中,最重要的是()。A. 服务器操作系统B. 网络操作系统C. 工作站重定向软件D....

    下列网络系统软件中,最重要的是().A. 服务器操作系统B. 网络操作系统C. 工作站重定向软件D. 更多相关问题 [单选] 套管可分为表层套管.()和油层套管. [单选] 硅酸盐水泥中,对强度贡献最 ...

  8. 棒棒糖-小学数学出题机v1.4.2【更新2019/12/26】

    [推荐]2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 今年儿子刚上一年级,现在每天要做口算题,每次都要打印100题随机题目让他做,网上找了很多出题器,不是操作太繁琐 ...

  9. STM32CubeMX+LAN8720+LWIP不带操作系统实现网络通讯

    STM32CubeMX+LAN8720+LWIP不带操作系统实现网络通讯 使用STM32CubeMX可以非常方便的将LWIP移植到工程中,本文就是介绍如何利用STM32CubeMX移植LWIP到STM ...

  10. ROS2网络课程资料分享2019.10.26

    目前,网络上主要的ROS2课程主要有: Constructsim:https://www.theconstructsim.com/robotigniteacademy_learnros/ros-cou ...

最新文章

  1. 中央纪委网站:​深度关注 | 元宇宙如何改写人类社会生活
  2. Window 消息大全使用详解(无聊没事做)
  3. JS如何监听动画结束
  4. (王道408考研数据结构)第八章排序-第五节:归并排序
  5. html5 canvas画布上合成
  6. 【Python】实现最大最小距离算法
  7. QT【001】- 基础写在前面的话
  8. IntelliJ IDEA 设置Output (输出窗口)窗口字体大小
  9. 对象数组根据某属性列的灵活排序
  10. mysql主库从库在同一台服务器_mysql数据库从一台服务器迁移到另一台服务器上...
  11. Java try-catch示例
  12. App测试中ios和Android的区别2
  13. html的字母u代表什么意思,html元素 u 标签的使用方法及作用
  14. leetcode刷题日记- 超级次方
  15. RFID应急物资管理系统
  16. 把抽奖活动写成一篇技术博客是怎样一种体验
  17. 010项目沟通管理和干系人管理
  18. 有效预防xss_预防XSS攻击的一些方法整理
  19. Office2007页眉有横线
  20. pyqtgraph文档笔记(五)总结:几个类的理解( GraphicsView, GraphicsItem ,GraphicsObject, PlotWidget等)

热门文章

  1. 音频基础 DAI:Digital Audio Interfaces
  2. 32位win10如何装64位win10?
  3. 2006世界杯32强人体彩绘队服样式(美国)
  4. IDEA背景色设置为黑色界面
  5. IGBT优缺点及其特性
  6. Android轮播换背景,Android 轮播图的实现方法总结
  7. YGG 公会进阶项目介绍
  8. EditPlus 3.5 注册码
  9. 密码学中常用的人物角色名称--Alice, Bob,etc
  10. Unity Shader · 科技感矩阵效果