C++打造局域网聊天室第七课: Socket编程初步2

文章目录

  • 前言
  • 一、Socket的API函数
  • 二、服务端建立Socket步骤
  • 总结


前言

C++打造局域网聊天室第七课: Socket编程初步2


一、Socket的API函数

接着上一课的内容,我们在chartroom.cpp中找到如下位置
在这里插入图片描述
插入断点,运行
在这里插入图片描述
运行到断点处后,按F11可以进入该函数内部
在这里插入图片描述
可以看到其调用了函数WSAStartup函数,进行了Socket库的初始化操作。

二、服务端建立Socket步骤

当用户点击开启服务器按钮时进行服务器端的开启,利用MFC消息映射机制建立该按钮的单击后需要的执行功能函数,同样会自动生成头文件中的函数声明,源文件中的函数实现框架,具体步骤见MFC消息映射机制
在这里插入图片描述
建立一个监听的Socket,在chartroomDlg.h头文件中声明变量。
在这里插入图片描述
然后在chartroomDlg.cpp源文件中构造函数处进行初始化,INVALID_SOCKET为一个宏,被定义为-1,表示一个不存在的Socket值。
在这里插入图片描述
之后在OnBnClickedButton3()函数实现中进行服务器端建立Socket函数实现。具体代码见如下代码块,各行代码的意义见注释。

void CchartroomDlg::OnBnClickedButton3()
{// TODO: 在此添加控件通知处理程序代码//新建:调用socket函数新建Socket,第一个参数为协议族,利用IPV4就用该参数;第二个和第三个参数为建立流式套接字;函数成功会返回一个Socket,//用作监听的Socket,用于监听某一个端口。m_ListenSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);if (m_ListenSock == INVALID_SOCKET) // 如果新建失败{AfxMessageBox(_T("新建SOCKET失败!"));return;}// 绑定:将新建的socket绑定在本机新建的一个IP和端口上,是在用户界面本地监听端口处动态获取的UINT uPort = GetDlgItemInt(IDC_EDIT7); //GetDlgItemText函数取得字符串,GetDlgItemInt函数取得整数if (uPort <= 0 || uPort > 65535) // 对端口值进行判断{AfxMessageBox(_T("请输入合适的端口:1-65535"));goto __Error_End;}sockaddr_in service;service.sin_family = AF_INET; //与新建socket第一个参数的值一样service.sin_addr.s_addr = INADDR_ANY; //获取本机所有可能得到的IP,一般有几块网卡就有几个IP//cout << service.sin_addr.s_addr;service.sin_port = htons(uPort); //将端口传递给sin_port成员,htons为字节顺序转换函数,利用该函数是因为常用的CUP字节顺序与网络字节顺序相反// 例如地址0x12345678,host:0x78 0x56 0x34 0x12; net:0x12 0x34 0x56 0x78。h为host(主机),n为network。htons即为将主机的字节顺序转化为net顺序if (bind(m_ListenSock, (sockaddr*)&service, sizeof(sockaddr_in)) == SOCKET_ERROR)// 第一个参数为需要绑定的socket;第二个参数为一个sockaddr_in结构,需要进行一个强制类型转换;第三个参数为该结构的大小{AfxMessageBox(_T("绑定端口失败!"));goto __Error_End;}// 监听:第一个参数为传递的socket,第二个参数为监听序列中允许同时存在的客户端最大数目if (listen(m_ListenSock, 5) == SOCKET_ERROR){AfxMessageBox(_T("监听失败!"));goto __Error_End;}// 接受客户端的连接:sockaddr_in clientAddr;int iLen = sizeof(sockaddr_in);// 第一个参数为socket,第二个参数为一个sockaddr_in结构,需要进行一个强制类型转换,第三个参数为该结构的大小的地址。// 返回的socket为服务端与接受的客户端通信的socket,即利用accsocket进行与其他客户端的通信,m_ListenSock只是在服务器端进行监听SOCKET accSock = accept(m_ListenSock, (struct sockaddr *)&clientAddr , &iLen);if (accSock == INVALID_SOCKET){AfxMessageBox(_T("接受客户端失败"));goto __Error_End;}//其他操作// 出现错误则关闭监听,退出函数
__Error_End:closesocket(m_ListenSock);
}

但是目前来说,点击开启服务器会使得程序崩溃,卡死。只能通过终止调试按钮停止程序。
在这里插入图片描述
在这里插入图片描述
这就涉及到了另外的知识点:阻塞与非阻塞。
阻塞是指干不完活不回来,在那里堵住了,这样的话调用阻塞函数的线程被挂起。该程序阻塞在了accept函数那里,使得主线程被挂起。比如WinSocket API中的accept、send等函数就是阻塞的。阻塞类似于C++中的cin函数,如果用户不输入的话程序不会向下执行,会卡在那里。
非阻塞是指你先干活,我先不干这个活,你干完了我再来

阻塞特点:使用简单但是效率低
非阻塞特点:使用复杂,一些socket API函数执行后总是马上返回WSAEWOULDBLOCK错误,表明请求的操作没有成功完成,如果循环检查的话知道有信息到达,效率肯定会降低,也不易于新手使用

可以使用Windows提供的各种异步I/O模型进行解决,在下节课中介绍。


总结

C++打造局域网聊天室第七课: Socket编程初步2

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/63795.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

QT(QML语法)-属性(声明,初始化,赋值,属性绑定,属性组,对象列表。属性别名(双向))

目录 1.属性&#xff08;Property&#xff09; 2. 对象列表 3. 属性组 4.代码示例 1.属性&#xff08;Property&#xff09; 基本属性声明&#xff1a;property 用于声明可绑定的属性。属性绑定&#xff1a;属性可以绑定到对象属性或函数。属性别名&#xff1a;使用 prope…

【razor】echo搭配relay功能分析

echo 要搭配relay 实现作者说relay在linux上跑,可以模拟丢包、延迟目前没看到如何模拟。relay监听9200,有俩作用 echopeer1 发relay,replay 把peer1的包给peer2 ,实现p2p能力。 接收端:采集后发送发给relay的 接收端的地址就是自己,的地址就是本地的9200,因此是让relay接…

Wallpaper壁纸制作学习记录11

操控变形动画介绍 操控变形是使用Wallpaper Engine为角色和某些对象创建复杂动画的一种高级方法。操控变形是一个多步骤过程&#xff0c;要求您有一个单独的图像图层&#xff0c;其中包含要制作动画的角色或对象的剪切图。 操控变形功能相对复杂&#xff0c;您也可以创建仅包含…

黑马程序员Java项目实战《苍穹外卖》Day12

苍穹外卖-day12 课程内容 工作台Apache POI导出运营数据Excel报表 功能实现&#xff1a;工作台、数据导出 工作台效果图&#xff1a; 数据导出效果图&#xff1a; 在数据统计页面点击数据导出&#xff1a;生成Excel报表 1. 工作台 1.1 需求分析和设计 1.1.1 产品原…

windows下Qt5自动编译配置QtMqtt环境

原文链接&#xff1a;windows下Qt5自动编译配置QtMqtt环境&#xff08;11&#xff09;-CSDN博客 1、概述 Qt默认是不包含mqtt库的&#xff0c;如果需要使用到mqtt库就只能自己编译配置&#xff1b;网络所有的QtMqtt配置的文章都是编译完成手动复制&#xff0c;非常麻烦&#x…

OpenCV相机标定与3D重建(15)计算给定图像点对应的极线(epipolar lines)函数computeCorrespondEpilines()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 计算给定图像点对应的极线&#xff08;epipolar lines&#xff09;。 对于立体图像对中一个图像的点&#xff0c;计算这些点在另一个图像中对应的…

阿里云服务器Linux(centos)系统安装nginx1.20.2

阿里云服务器Linux(centos)系统安装nginx1.20.2 1.安装依赖包 一共要安装4种依赖&#xff08;基于c语言&#xff09; yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel2.下载nginx安装包并解压安装包 nginx官网下载&#xff1a;http://nginx.org/en/do…

启智畅想集装箱箱号识别算法,2台相机即可实现较高识别率

启智畅想集装箱箱号识别算法&#xff0c;在货车通道中使用时&#xff0c;一般配备2台相机即可。启智畅想集装箱箱号识别算法&#xff0c;在货车通道中使用时&#xff0c;一般配备2台相机即可实现对集装箱箱号的精准捕捉与识别。这两台相机分别安装在货车通道的后侧和随意侧面&a…

ESP32-S3模组上跑通ES8388(24)

接前一篇文章:ESP32-S3模组上跑通ES8388(23) 二、利用ESP-ADF操作ES8388 2. 详细解析 上一回解析完了es8388_init函数中的第8段代码,本回继续往下解析。为了便于理解和回顾,再次贴出es8388_init函数源码,在components\audio_hal\driver\es8388\es8388.c中,如下: ​ …

【C++】三角形校验和算法优化的深入分析

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;题目描述&#x1f4af;老师的解法实现代码解法分析优势缺点 &#x1f4af;我的解法实现代码解法分析优势缺点 &#x1f4af;数学解释&#xff1a;为什么新增条件是冗余的&a…

【C++软件调试技术】dump文件类型与dump文件生成方法详解

目录 1、概述 2、dump文件的分类 2.1、dump按大小分类 2.2、查看dump文件中函数调用堆栈中变量的值 3、调用SetUnhandledExceptionFilter设置异常处理回调函数&#xff0c;然后调用MiniDumpWriteDump生成dump文件 4、使用Google开源库CrashRpt捕获异常&#xff0c;并自动…

持有CSPM证书可以用于评职称吗?

CSPM的诞生背景 CSPM&#xff08;Certified Strategic Project Manager&#xff09;即项目管理专业人员能力评价等级证书&#xff0c;是由中国标准化协会&#xff08;CAS&#xff09;根据国标《项目管理专业人员能力评价要求》&#xff08;GB/T 41831-2022&#xff09;推出的项…

SpringBoot左脚进门之常用注解

类级别注解 SpringBootApplication Configuration //表明这是一个配置类 EnableAutoConfiguration //开启自动配置 ComponentScan() //开启组件扫描1、Configuration&#xff1a; 当一个类被 Configuration 注解…

【时时三省】(NIT计算机考试)Word的使用方法

山不在高&#xff0c;有仙则名。水不在深&#xff0c;有龙则灵。 ----CSDN 时时三省 一、软件简介 Microsoft Word&#xff0c;简称Word&#xff0c;是微软公司开发的一款文字处理软件&#xff0c;广泛应用于文档编辑、排版、打印等领域。无论是撰写论文、报告、简历&#xf…

刷题日志【4】

目录 1、猜数字大小 1、猜数字大小 题意有点抽象&#xff0c;我大概讲一下&#xff0c;就是在1——n里面会有一个目标数&#xff0c;我们通过猜数字的方式逼近这个数字&#xff0c;直到解出这个数&#xff0c;之前我们是用二分法求最快达到求解的问题&#xff0c;这道题多了每…

【数据结构——栈与队列】环形队列的基本运算(头歌实践教学平台习题)【合集】

目录&#x1f60b; 任务描述 相关知识 测试说明 我的通关代码: 测试结果&#xff1a; 任务描述 本关任务&#xff1a;编写一个程序实现环形队列的基本运算。 相关知识 为了完成本关任务&#xff0c;你需要掌握&#xff1a; 初始化队列、销毁队列、判断队列是否为空、进队列…

一个简单带颜色的Map

越简单 越实用。越少设计&#xff0c;越易懂。 需求背景&#xff1a; 创建方法&#xff0c;声明一个hashset&#xff0c; 元素为 {“#DE3200”, “#FA8C00”, “#027B00”, “#27B600”, “#5EB600”} 。 对应的key为 key1 、key2、key3、key4、key5。 封装该方法&#xff0c…

【橘子ES】熔断器Circuit breaker

一、相关概念 我们在日常的开发中&#xff0c;关于服务之间的熔断操作似乎很常见&#xff0c;当请求超过了我们服务所认为可以承受的一个上限阈值的时候&#xff0c;我们为了保护服务不会被进一步的高负载压崩溃&#xff0c;我们有时候会选择熔断请求&#xff0c;此时服务不再…

恋爱脑学Rust之并行之旅:Rayon介绍和使用

文章目录 一、开启爱情的依赖之旅&#xff08;安装 Rayon&#xff09;二、甜蜜瞬间的并行享受&#xff08;基本数据并行操作&#xff09;&#xff08;一&#xff09;共享美好时光&#xff08;par_iter 方法&#xff09;&#xff08;二&#xff09;分块珍藏回忆&#xff08;par_…

素数对

素数对 C语言代码C 代码Java代码Python代码 &#x1f490;The Begin&#x1f490;点点关注&#xff0c;收藏不迷路&#x1f490; 两个相差为2的素数称为素数对&#xff0c;如5和7&#xff0c;17和19等&#xff0c;本题目要求找出所有两个数均不大于n的素数对。 输入 一个正整…