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. 一步一步学习ASP.NET MVC 1.0创建NerdDinner 范例程序 - 强烈推荐!!!
  2. 点击拖动放大该图片大小
  3. 给终端装上宝可梦主题!小姐姐路过都爱上了!
  4. Go gin参数绑定
  5. SQLServer中批量插入数据方式的性能对比 (转)
  6. Storm编程模型总结
  7. 软件工程师你应该知道的100个原则
  8. php函数查询sprintf,PHPsprintf函数用例解析
  9. C++---STL中迭代器失效的总结
  10. 中介者模式android,Android[高级教程] 设计模式之六 中介者模式(二)
  11. UNIX环境高级编程之第9章:进程关系
  12. 垂直的SeekBar:VerticalSeekBar
  13. mysql设置59分59秒会自动加一秒
  14. 最新版X-Helios、X-Medusa、X-Ladon、X-Argus逆向与风控分析
  15. android 通知栏授权,Android 消息通知栏Notification使用和权限
  16. java 静态 非静态_Java中的静态类和非静态类
  17. 熬夜整理的vue面试题
  18. r9 5900x配什么主板、显卡、散热
  19. 对抗网易相册不能贴图(解决)
  20. 大象做梦传媒:做好企业年会策划活动执行方案

热门文章

  1. mysql创建学生情况表(xs)结构,20年秋东财《MySQL数据库系统及应用》单元作业二...
  2. win32剪贴板操作
  3. 浅谈可重复访问城市的TSP问题(最短距离 + 具体走法)
  4. 16.第六章 非参数假设检验(2)
  5. 教育期刊《牡丹江教育学院学报》简介及投稿要求
  6. 本人擅长Ai、Fw、Fl、Br、Ae、Pr、Id、Ps等
  7. C#每日一课(二十五)
  8. PAT L1-020 帅到没朋友
  9. 千千静听V5.1.0 印心DJ舞曲 电台 卡拉OK DFX 8.360 圣诞绿色 全音效插件 增强版
  10. Unity实现2D平面游戏角色跳跃