【C/C++套接字编程】TCP通信实验

news2024/12/23 22:33:48

一、实验目的:

通过本实验使学员了解和掌握编写基于TCP协议的网络应用程序。任务是开发一个基于TCP Socket API的网络聊天程序。

二、实验内容简要描述

用所学的TCP Socket API知识来开发基于TCP协议的网络。通过编程实现服务端和客户端的信息通信。TCP协议建立交互的流程如下图所示。通过编写C/C++程序,调用windows提供的Socket API,模拟下述流程,建立客户端与服务端的远程TCP通信。使得彼此双方能够接收彼此信息、发送信息。

三、实验步骤与结果分析

基于TCP协议的面向客户/服务器的工作流程是:

  • 服务器端:

Ⅰ 服务器首先启动,调用 socket( )创建套接字;

Ⅱ 然后调用bind( )指定服务器socket地址(IP地址+端口号);

Ⅲ 再调用listen( )让服务器做好侦听准备,并规定好请求队列的长度,然后服务器进入阻塞状态,等待客户的连接请求;

Ⅳ 最后通过accept( )来接收连接请求,并获得客户的socket地址。

  •  客户端

Ⅰ 客户在创建套接字并指定客户 socket地址

Ⅱ 然后就调用connect( )和服务器建立连接。

Ⅲ 一旦连接建立成功,客户和服务器之间就可以通过调用read( )和write( )来接收和发送数据

Ⅳ 一旦数据传输结束,服务器和客户通过调用close( )来关 闭套接字。

服务端:

  1. 启动,调用socket()创建套接字

  1. 在创建套接字之后,套接字作为网络端口的抽象,需要与具体的IP/端口进行绑定,之后我们才可以通过套接字这一层抽象简便地实现通信。我们先设置好地址,然后调用bind()函数将套接字与地址绑定。

这里与本地地20000端口进行绑定。在实际的两台主机之间通信时,将回环地址修改为自己的IPv4地址即可(如果套接字参数选择IPv6,则相应的使用IPv6地址);端口号的选择只需要确保和已有的端口不冲突即可。

  1. TCP协议是面向连接的通信协议,因此首先要确保服务端与用户端的联系紧密,尔后再进行稳定可靠的通信。建立联系的过程,需要服务端进行监听,等待用户端的连接、通信请求。这个监听的过程,通过listen()、阻塞来实现。

  1. 当服务端在监听时收到了来自客户端的通信请求(连接),就通过accept()获取客户端的Socket地址,进而建立TCP联系。然后就可以通过套接字与客户端进行交互。

  1. 交互过程分为接收发送两个阶段,由于程序的单线程下,接收和发送均存在阻塞状态,因此只能实现接受和发送的交替轮流通信。对于交互过程,我将它封装在interactive()函数中,通过传入客户端的套接字信息,实现本机(服务端)与客户端的信息交流。实际上,对于交互过程的封装,是为了之后进一步的“多线程”互联所作的准备;多线程实现通信将放在本节内容最后进行阐述。

可以注意到其中有一些函数如print_time()等,是为了控制界面的打印。由于这些细节与TCP协议实现并无太大关联,故具体这些控制函数将放在后面进行“结论”的收获部分进行汇报。

  1. 最后,当通信完毕,就通过close来关闭套接字、断开连接。

        客户端:

  1. TCP协议不同于UDP协议,是更为可靠的,因此客户端和服务端一样,都需要建立套接字对本机端口进行抽象。客户端也通过socket()函数。

  1. 然后,根据服务端的地址和端口数据,通过connect()主动连接服务端程序。

  1. 连接建立成功之后,便可以和服务端进行通信交互,方式和服务端相同,只不过约定首先发送信息。

  1. 同样的,在通信完毕之后,断开连接,与服务端方式相同,这里就不赘述。

基于以上连接策略实现的简易TCP通信结果如下:

可见,达成了TCP简易通信的基本目标。

        基于多线程的TCP通信服务

   由于TCP自身的特性以及收发信息的阻塞状态,单个线程无法实现多主机互联。因此这里尝试采用服务端多线程的方式,实现多台客户端与服务端交互而客户端之间互相屏蔽的TCP交互功能。

        相对于上述服务端代码,主要的区别在于,主线程循环接收连接,子线程进行服务端与客户端的交互。

        最终实现效果如下:

四、结论

此次实验,让我更加了解了TCP协议的过程,同时也初步掌握了C++ Socket编程的基础技能,更让我在实际的应用中,尝试使用多线程、利用控制字符美化交互环境等等,受益匪浅。

此次实验完成了基本的TCP通信交互任务,还扩展了多台客户端与服务端交互的实现。接下来我将尝试加入可视化界面,同时更加优化字符打印的交互界面。

对于控制打印的函数,自己通过摸索,也有了很大的收获:

打印时间

         通过套接字获取地址

                回退到黑窗口上一行并覆写

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

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

相关文章

【MySQL】之索引与索引优化

目录 一、索引介绍二、MySQL索引结构二、索引优化 一、索引介绍 1、索引简介 MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。 可以得到索引的本质:索引是数据结构。索引的目的在于提高查询效率&…

高考状元、通用语言和轰趴-UMLChina建模知识竞赛第4赛季第4轮

DDD领域驱动设计批评文集 欢迎加入“软件方法建模师”群 《软件方法》各章合集 参考潘加宇在《软件方法》和UMLChina公众号文章中发表的内容作答。在本文下留言回答。 只要最先答对前3题,即可获得本轮优胜。第4题为附加题,对错不影响获奖&#xff0c…

Springboot使用pdfbox提取PDF图片

Springboot使用pdfbox提取PDF图片 PDFBox的介绍Springboot集成PDFBox一、提取pdf首页为图像1. 实现需求2. 项目代码3. 执行结果 二、将pdf内容全部转换为图像1. 实现需求2. 项目代码3. 执行结果4.注意事项1.优化项目代码2.提升Java heap size PDFBox的介绍 PDFBox是一个用于创…

FDM3D打印系列——1、愉快的给自己打印一个手办

大家好,我是阿赵。 我日常的个人爱好,除了写博客,还有弹吉他打鼓电子琴,还有3D打印。 3D打印只是我的一个业余,不过由于经常把做好的作品发朋友圈,也带动了身边一些朋友买了和我一样型号的打印机&#xff0…

一种说法:哲学是研究真善美的

一种说法:哲学是研究真、善、美的 今天在工作中谈到了真善美 确定一个企业价值观:求真,求善,求美 我觉得挺好,起码无需解释能懂意思 趣讲大白话:真善美是基本问题 【趣讲信息科技199期】 *****************…

用Python做一个下载器,从获取数据到编写GUI界面

本片文章目录 前言案例基本实现思路?代码实现一、单张小说下载二、整本小说下载三、多线程采集四、采集排行榜所有小说五、搜索小说功能六、GUI界面 尾语 前言 嗨喽,大家好呀~这里是爱看美女的茜茜呐 对于广大书虫而言,没有小说看是最痛苦的&#xff0…

English Learning - L3 作业打卡 Lesson6 Day42 2023.6.15 周四

English Learning - L3 作业打卡 Lesson6 Day42 2023.6.15 周四 引言🍉句1: In towns that are near the sea, the tiny lanterns which had been hung in the streets the night before, are placed into the water when the festival is over.成分划分弱读连读爆破…

(二叉树) 129. 求根节点到叶节点数字之和 ——【Leetcode每日一题】

❓129. 求根节点到叶节点数字之和 难度:中等 给你一个二叉树的根节点 root ,树中每个节点都存放有一个 0 到 9 之间的数字。 每条从根节点到叶节点的路径都代表一个数字: 例如,从根节点到叶节点的路径 1 -> 2 -> 3 表示数…

CSS- 横向和纵向时间轴

/*横向时间轴*/.time-horizontal {list-style-type: none;border-top: 1px solid #707070;max-width: 800px;padding: 0px;margin: 0px;}.text-horizontal {list-style-type: none;max-width: 800px;padding: 0px;margin: 0px;}.text-horizontal li {float: left;position: rel…

数据中心网络的电路交换域

buffer 的意义在用带宽平滑统计突发: 流量波动越大,统计复用能效越高。假设没有 buffer,将大量溢出和空载并存。但如果流量是可预期的,也可以转向相反的方向,比如虚电路。 数据中心与 Internet 不同,流量…

90后Android程序员杨国民的羊粪肥创业故事:从社恐到销售奇迹

90后Android程序员杨国民的羊粪肥创业故事:从社恐到销售奇迹 最近一位90后程序员杨国民的创业故事在社交媒体上引起了轰动。他回到了内蒙古老家,并以羊粪肥为主要产品,取得了惊人的销售成绩。据报道,他的羊粪肥月销量达到了120万…

Java选择题刷题记录2

Java集合的关系 图片来自原文链接:https://blog.csdn.net/weixin_45861283/article/details/116201140 HashMap的键可以为null Java基本数据类型,注意String不是基本数据类型 NIO 全称java non-blocking IO ,是指 Java 一系列改进的输入…

一篇文章docker-compose安装使用全解

提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 关于docker composedocker compose安装Linux安装docker-composeWindows安装docker-compose docker-compose YMAL常用配置项综合配置示例 docker compose常用命令启动…

设计模式(二十):行为型之迭代器模式

设计模式系列文章 设计模式(一):创建型之单例模式 设计模式(二、三):创建型之工厂方法和抽象工厂模式 设计模式(四):创建型之原型模式 设计模式(五):创建型之建造者模式 设计模式(六):结构型之代理模式 设计模式…

LabVIEW开发移动车辆的识别和特征提取

LabVIEW开发移动车辆的识别和特征提取 闭路电视摄像机在高速公路上变得越来越普遍,并用于交通管理;摄像机允许操作员直观地监控交通状况。随着摄像机数量的增加,操作员监控每个摄像机成为一项艰巨的任务,因此录制视频,并且通常仅…

Hack The Box - Web - Phonebook

玩一会儿htb的challenge,最近找工作,所以先玩玩web类型的。 这道题目的类型有人说是LDAP注入、有人说是like注入。LDAP这玩意08年的时候估计可能比较流行,但是现在应该没多少人用了吧,比较小众。其实LDAP这个特殊的数据库是比较契…

LwIP RAW API 实现UDP多播收发

LwIP RAW API 实现UDP多播收发实现 1、初始化 static struct udp_pcb *multicast_pcb NULL; static ip_addr_t mutlcast_send_ip; static ip_addr_t mutlcast_recv_ip;static void udp_recv_multicast(void *arg, struct udp_pcb *pcb, struct pbuf *p,const ip_addr_t *add…

安装cv2库时出现错误的一般解决方法

问题描述: 安装cv2库时出现错误 补充:cv2库的简单介绍 cv2是Python中常用的计算机视觉库OpenCV的Python接口模块。通过使用cv2模块,您可以方便地进行图像和视频的读取、处理和显示等操作。它提供了许多常用的图像处理函数和工具&#xff0…

WPF基础学习笔记3-文本控件

1.文本控件 文本控件System.Windows.Controls,TextBox继承自System.Windows.Controls.TextBoxBase类System.Windows.Controls.RichTextBox继承自System.Windows.Controls.TextBoxBase类 1.1 TextBox 表示一个控件&#xff0c;该控件可用于显示或编辑无格式文本 <Grid>&l…

Python算法练习6.17

leetcode 1768 交替合并字符串 给你两个字符串 word1 和 word2 。请你从 word1 开始&#xff0c;通过交替添加字母来合并字符串。如果一个字符串比另一个字符串长&#xff0c;就将多出来的字母追加到合并后字符串的末尾。 返回 合并后的字符串 。 输入&#xff1a;word1 &qu…