当前位置: 首页 > news >正文

【Linux网络编程】TCP套接字

TCP与UDP的区别:

        udp是无连接的、面向数据报(通信时以数据报为单位传输)的传输层通信协议,其中每个数据报都是独立的,通信之前不需要建立连接,bind绑定套接字后直接可以进行通信。

        tcp是面向连接的、基于字节流(通信时以字节为单位传输)的传输层通信协议,所以通信之前必须先建立连接。其中服务器是被连接的,需要等待客户端的连接。

TCP中的发送和接收函数:

        注意:在TCP套接字通信中,接收和发送数据时不能使用recvfrom和sendto函数。TCP是面向字节流的,UDP是面向数据报的,recvfrom和sendto两函数是依赖于数据包的来源地址和端口进行通信,读取和发送都是一个一个数据报的形式,是专门为UDP协议规则设计的,而TCP通信时是通过已经建立的连接进行且是字节流的形式,不需要指定目标地址和端口。因此,在设计网络应用程序时,需要根据所使用的协议(TCP或UDP)选择合适的函数。

        TCP通信时通常使用write(发送数据)和read(接收数据)或者send(发送数据)和recv(接收数据)。这两套函数都是面向字节流发送和接收数据的,用法与sendto和recvfrom用法类似,这里不做说明,具体的使用后面会做代码演示。

TCP套接字必备的函数接口:

        1,listen。该函数用于将套接字设置为监听状态,这是一种被动模式,即将其标记为用于接受客户端连接请求的套接字,以接受来自客户端的连接请求。这个函数通常在服务器程序中调用,通常是在服务器进程正在准备好接受来自客户端的连接,并在调用 bind 函数时将套接字与特定地址(IP地址和端口号)关联之后使用。

        当listen函数被调用时,它告诉内核这个套接字现在处于被动模式,并准备接受客户端的连接请求。内核会在自己的进程空间里维护一个队列来跟踪这些连接请求。当客户端尝试连接到服务器时,它们的连接请求会被放入这个队列中。服务器进程可以调用accept函数来从这个等待队列中取出连接请求并建立新的连接。

头文件:

        #include <sys/types.h>
        #include <sys/socket.h>

格式:

        int listen(int sockfd, int backlog);

参数说明:

  • sockfd:要监听套接字的文件描述符。
  • backlog:指定系统内核应为相应套接字排队的最大连接数,即最多有多少个客户端可以同时处于连接等待状态。如果接收到更多的连接请求,这些请求将被忽略。它通常是一个较小的整数,如2到4,也可以设置为系统定义的最大值:SOMAXCONN。

返回值:

        成功时,返回0;失败时,返回-1。

        2,accept。该函数是在实现基于 TCP/IP 协议的服务器端程序时,用于从监听套接字上接受一个连接请求(从等待队列中取出一个已完成的连接),并创建一个新的套接字,该套接字将用于与客户端进行通信。此函数通常在调用 listen 函数之后使用,listen 函数会使服务器套接字进入监听状态,等待客户端的连接请求。

头文件:

        #include <sys/types.h>

        #include <sys/socket.h>

格式:

        int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

参数说明:

  • sockfd:一个监听套接字的描述符,该套接字是通过 listen 函数设置为监听状态的套接字。
  • addr:指向 sockaddr 结构体的指针,该结构体用于存储接受连接的地址信息。如果不需要这些信息,可以将其设置为 NULL
  • addrlen:指向包含 addr 结构体大小的变量的指针。函数返回时,它会被更新为实际存储在 addr 地址中的实际大小。如果 addr 是 NULL,则 addrlen 也为 NULL

返回值:

        成功时,返回一个非负值,这个值是一个新的套接字描述符,用于与接收到的客户端连接进行通信。

        失败时,返回 -1。

        注意:accept返回的套接字与listen监听的套接字在TCP/IP网络通信中扮演着不同的角色。listen监听的套接字是用于服务端进入监听状态,等待来自客户端的连接请求。它不会直接用于数据的发送和接收,而是作为接受连接请求的入口。 该套接字在服务器的整个生命周期中只被创建一次且只有一个(对于每个监听的端口)。accept返回的套接字是用于与客户端进行实际的通信,即数据的发送和接收。当服务器监听到客户端的连接请求后,服务器会通过accept函数从监听套接字的等待队列中取出一个连接请求,并创建一个新的套接字(即已连接套接字,用于与客户端通信)。该套接字只存在于服务器为一个客户端服务的过程中。一旦与客户端的连接关闭,该套接字就会被销毁。

        3,connect。该函数用于TCP客户端与TCP服务器建立连接。当调用此函数时,TCP客户端会发起三次握手操作(具体细节后面理论文章说明),尝试与服务器建立连接。

头文件:

        #include <sys/types.h>

        #include <sys/socket.h>

格式:

        int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
参数说明:

  • sockfd:由socket函数返回的套接字描述符,代表客户端的套接字。
  • addr:一个指向包含服务器IP地址和端口号的地址结构的指针。
  • addrlenaddr地址的大小。

返回值:

        如果连接成功,函数返回0;如果连接失败,函数返回-1。

TCP服务端的连接处理:

        由于TCP通信是建立在客户端连接上进行的,而这里的连接服务器如同 “排队买饭,一次一人” 道理,所以,TCP通信的服务端一次只能处理一个客户端的连接请求,其它客户端的连接请求需要被服务器等待处理,直到当前连接的客户端断开为止其它客户端才能连接,即多个客户端不会同时绑定一个服务器连接。为了实现多个客户端与服务器的同时通信,服务器通常需要使用多线程、多进程(不推荐)、进程池(不推荐)、线程池或异步处理机制(这里可理解为一个执行流不能在相同时间内绑定多个连接)等。这样,服务器可以同时处理多个客户端的请求,而不会造成阻塞或延迟。

close关闭套接字:

        close函数用于关闭套接字且释放其资源。

        对于TCP套接字,close函数的调用是非常重要的。在TCP中,套接字的建立与连接是一个有序的过程,保证其可靠性,如果不关闭TCP套接字,可能会导致资源泄漏(如文件描述符、内存等),并且服务器可能会认为客户端仍然连接着,从而保持不必要的状态信息。

        对于UDP套接字,情况有所不同。由于UDP是无连接的协议,每个数据报都是独立的,并且不保证顺序或可靠性,因此没有像TCP那样的连接状态需要维护。这意味着UDP套接字不需要像TCP套接字那样经历一个有序的关闭过程。但是,调用close函数仍然是一个好习惯,因为它会释放由套接字占用的系统资源。这些资源包括文件描述符、内存缓冲区等。如果不关闭UDP套接字,这些资源将不会被释放,将会导致资源泄露。

TCP套接字代码示例:

        TCP套接字这里设计了单进程单线程、多进程、多线程版本,相关代码请在此链接下观看:TCP套接字的代码实现

相关文章:

【Linux网络编程】TCP套接字

TCP与UDP的区别&#xff1a; udp是无连接的、面向数据报&#xff08;通信时以数据报为单位传输&#xff09;的传输层通信协议&#xff0c;其中每个数据报都是独立的&#xff0c;通信之前不需要建立连接&#xff0c;bind绑定套接字后直接可以进行通信。 tcp是面向连接的、基于字…...

在Manjaro Gnome桌面的基础上安装Budgie桌面环境

在Manjaro上安装Budgie桌面环境 Budgie是Solus团队开发的一种简单而优雅的桌面环境。 Budgie是由Solus项目主要开发的流行桌面环境&#xff0c;与GNOME堆栈紧密集成。它提供了简单而优雅的用户体验&#xff0c;并且可用于大多数发行版&#xff0c;如Arch、Debian、Manjaro等。…...

vscode可以编译通过c++项目,但头文件有红色波浪线的问题

1、打开 VSCode 的设置&#xff0c;可以通过快捷键 Ctrl Shift P 打开命令面板&#xff0c;然后搜索并选择 “C/C: Edit Configurations (JSON)” 命令&#xff0c;这将在 .vscode 文件夹中创建或修改 c_cpp_properties.json 文件 {"configurations": [{"name…...

前后端中Json数据的简单处理

很多时候因为数据库中不想创建中间表去存一些数据&#xff0c;所以在一个实体表中用一个json字段去存储并处理这些数据。本人倾向在前端js部分直接处理json数据&#xff0c;后端只做存储&#xff0c;不做处理。 前端在获取表单的时候解析 toEdit(row) {this.editForm { ...ro…...

Java爬虫:深入解析商品详情的利器

在数字化时代&#xff0c;信息的获取与处理能力成为了企业竞争力的关键。特别是在电商领域&#xff0c;商品详情的获取与分析对于市场趋势的把握、竞争对手的分析以及消费者行为的研究至关重要。Java作为一种成熟且功能强大的编程语言&#xff0c;其在爬虫技术中的应用尤为广泛…...

新型大语言模型的预训练与后训练范式,阿里Qwen

前言&#xff1a;大型语言模型&#xff08;LLMs&#xff09;的发展历程可以说是非常长&#xff0c;从早期的GPT模型一路走到了今天这些复杂的、公开权重的大型语言模型。最初&#xff0c;LLM的训练过程只关注预训练&#xff0c;但后来逐步扩展到了包括预训练和后训练在内的完整…...

深入理解 Dubbo 如何动态感知服务下线

在现代分布式系统中&#xff0c;服务的上下线管理是非常重要的功能&#xff0c;尤其是服务动态扩展与缩减的需求日益频繁。在这种环境中&#xff0c;如何确保消费者能够实时感知到服务的状态变化&#xff0c;减少因服务失效导致的调用失败&#xff0c;直接影响系统的可用性和用…...

VSCode 下载 安装

VSCode【下载】【安装】【汉化】【配置C环境&#xff08;超快&#xff09;】&#xff08;Windows环境&#xff09;-CSDN博客 Download Visual Studio Code - Mac, Linux, Windowshttps://code.visualstudio.com/Downloadhttps://code.visualstudio.com/Download 注意&#xff0…...

局域网的网络安全

网络安全 局域网基本上都采用以广播为技术基础的以太网&#xff0c;任何两个节点之间的通信数据包&#xff0c;不仅为这两个节点的网卡所接收&#xff0c;也同时为处在同一以太网上的任何一个节点的网卡所截取。因此&#xff0c;黑客只要接入以太网上的任一节点进行侦听&#…...

VMware ubuntu创建共享文件夹与Windows互传文件

1.如图1所示&#xff0c;点击虚拟机&#xff0c;点击设置&#xff1b; 图1 2.如图2所示&#xff0c;点击选项&#xff0c;点击共享文件夹&#xff0c;如图3所示&#xff0c;点击总是启用&#xff0c;点击添加&#xff1b; 图2 图3 3.如图4所示&#xff0c;出现命名共享文件夹…...

TCP/IP网络编程-C++(上)

TCP/IP网络编程-C &#xff08;上&#xff09; 一、基于TCP的服务端/客户端1、server端代码2、client端代码3、socket() 函数3.1、函数原型3.2、参数解析3.2.1、协议族&#xff08;domain参数&#xff09;3.2.2、套接字类型&#xff08;type参数&#xff09;3.2.3、最终使用的协…...

React Hooks中use的细节

文档 useState useState如果是以函数作为参数&#xff0c;那要求是一个纯函数&#xff0c;不接受任何参数&#xff0c;同时需要一个任意类型的返回值作为初始值。 useState可以传入任何类型的参数作为初始值&#xff0c;当以一个函数作为参数进行传入的时候需要注意&#xff…...

通信网络安全分层及关键技术解决

要实现信息化&#xff0c;就必须重视信息网络安全。信息网络安全绝不仅是IT行业的问题&#xff0c;而是一个社会问题&#xff0c;是一个包括多学科的系统安全工程问题&#xff0c;并直接关系到国家安全。因此&#xff0c;知名安全专家沈昌祥院士呼吁&#xff0c;要像重视两弹一…...

C++ 面向对象包含哪些设计原则

设计模式是由设计原则迭代出来的 开闭原则&#xff1a;一个类应该对扩展开放&#xff0c;对修改关闭 稳定的部分稳定住&#xff0c;变化的部分扩展 扩展可以通过继承和组合 相关原则&#xff1a;单一职责原则、里氏替换原则、接口隔离原则 单一职责原则&#xff1a;一个类应该…...

微信小程序首页搜索框的实现教程

微信小程序首页搜索框的实现教程 前言 在现代移动应用中,搜索功能是用户获取信息的主要方式之一。对于购物小程序而言,提供一个美观且高效的搜索框,可以显著提升用户体验,帮助用户快速找到他们想要的商品。本文将详细介绍如何在微信小程序中实现一个样式优美的搜索框,包…...

android集成FFmpeg步骤以及常用命令,踩坑经历

1、入坑第一步&#xff1a;首先集成的库必须正确。最好是有ndk的&#xff0c;FFmpeg有许多个版本&#xff0c;我才开始接触的时候随便选了一个&#xff0c;一般的 方法没有问题。但是涉及到需要使用libx264等条件进行编码时&#xff0c;老是报错&#xff0c;网上搜索资料也没有…...

Go错误与日志处理—推荐实践

错误的分类 在 Go 语言中&#xff0c;错误是通过实现 error 接口的类型表示的&#xff0c;但不同场景下的错误可以按性质和用途进行分类。以下是 Go 语言错误的常见分类&#xff0c;以及每类错误的解释和示例&#xff1a; 标准错误类型 标准库中定义了许多常见的错误类型&…...

Android 13 Aosp Settings Android Studio版本

Android 13 Aosp Settings Android Studio版本 Settings相关源码 Settings https://android.googlesource.com/platform/packages/apps/Settings/+/refs/heads/android13-release SettingsIntelligence https://android.googlesource.com/platform/packages/apps/SettingsIn…...

Jedis存储一个以byte[]的形式的对象到Redis

1.1 准备一个User实体类 import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor;import java.io.Serializable; import java.util.Date;Data NoArgsConstructor AllArgsConstructor public class User implements Serializable {private In…...

updatexml报错注入原理分析

《网络安全自学教程》 SQL注入时&#xff0c;经常利用updatexml()的报错特性来脱库。 updatexml报错原理 1、updatexml语法参数2、报错原理分析3、使用updatexml()脱库4、分割显示结果 updatexml() 的作用是修改xml文件的内容。 1、updatexml语法参数 updatexml(参数1&#x…...

蓝桥杯c++算法秒杀【6】之动态规划【上】(数字三角形、砝码称重(背包问题)、括号序列、组合数问题:::非常典型的必刷例题!!!)

下将以括号序列、组合数问题超级吧难的题为例子讲解动态规划 别忘了请点个赞收藏关注支持一下博主喵&#xff01;&#xff01;&#xff01;! ! ! ! &#xff01; 关注博主&#xff0c;更多蓝桥杯nice题目静待更新:) 动态规划 一、数字三角形 【问题描述】 上图给出了…...

【Qt】重写QComboBox下拉展示多列数据

需求 点击QComboBox时&#xff0c;下拉列表以多行多列的表格展示出来。 实现 直接上代码&#xff1a; #include <QComboBox> #include <QTableWidget> #include <QVBoxLayout> #include <QWidget> #include <QEvent> #include <QMouseEve…...

【mac】终端左边太长处理,自定义显示名称(terminal路径显示特别长)

1、打开终端 2、步骤 &#xff08;1&#xff09;修改~/.zshrc文件 nano ~/.zshrc&#xff08;2&#xff09;添加或修改PS1&#xff0c;我是自定义了名字为“macminiPro” export PS1"macminiPro$ "&#xff08;3&#xff09;使用 nano: Ctrl o &#xff08;字母…...

基于Springboot的流浪宠物管理系统

基于javaweb的流浪宠物管理系统 介绍 基于javaweb的流浪宠物管理系统的设计与实现&#xff0c;后端框架使用Springbootmybatis&#xff0c;前端框架使用Vuehrml&#xff0c;数据库使用mysql&#xff0c;使用B/S架构实现前台用户系统和后台管理员系统&#xff0c;和不同权限级别…...

web博客系统的自动化测试

目录 前言测试用例编写自动化脚本测试准备博客登录页相关测试用例登陆成功登录失败 博客首页相关测试用例登陆成功登录失败 博客详情页相关测试用例登录成功登录失败 博客编辑页相关测试用例登陆成功登录失败 编写测试文档测试类型内容 前言 本次测试是运用个人写的一个博客系…...

【论文阅读】Multi-level Semantic Feature Augmentation for One-shot Learning

用于单样本学习的多层语义特征增强 引用&#xff1a;Chen, Zitian, et al. “Multi-level semantic feature augmentation for one-shot learning.” IEEE Transactions on Image Processing 28.9 (2019): 4594-4605. 论文地址&#xff1a;下载地址 论文代码&#xff1a;https:…...

网络知识面试

1、http状态码 101: 切换请求协议 200:(请求成功)。服务器已成功处理了请求。 通常,这表示服务器提供了请求的网页。 301 : (永久移动,永久性重定向,会缓存) 请求的网页已永久移动到新位置。 服务器返回此响应(对 GET 或 HEAD 请求的响应)时,会自动将请求者转到新位置。…...

图片预览 图片上传到服务器

首先要明白 理解 multipart/form-data&#xff1a;‌multipart/form-data是一种在HTTP请求中使用的MIME类型&#xff0c;主要用于在客户端和服务器之间传输包含文件或二进制数据的表单数据。它通过一个边界&#xff08;boundary&#xff09;来分隔不同的表单字段和文件数据‌。…...

前端:base64的作用

背景 项目中发现&#xff0c;img标签中写src&#xff0c;读取一个png图片&#xff0c;只有16kb&#xff0c;速度特别慢。 解决办法&#xff0c;将图片转为base64&#xff0c;然后读取&#xff0c;速度特别快17ms就解决。 定义&#xff1a;base64是一种基于64个可打印字符(A-…...

Django在fitler过滤不等于的条件

提问 django 在API接口fitler的时候如何过滤 category 不等于6的 解答 为了在AoYuStudentFilter中设置过滤category不等于6的条件&#xff0c;需要使用django_filters库中的exclude方法。不过直接在FilterSet中使用exclude可能不那么直观&#xff0c;因为FilterSet主要设计用…...

ui交互动效 wordpress/电子商务平台有哪些

文章目录写在开头的话功能需求演示写在最后的话&#xff1a;这里是一段防爬虫文本&#xff0c;请读者忽略。 本文原创首发于CSDN&#xff0c;作者IDYS 博客首页&#xff1a;https://blog.csdn.net/weixin_41633902/ 本文链接&#xff1a;https://blog.csdn.net/weixin_41633902…...

湛江网站建设外包/seo专业实战培训

摘要&#xff1a;虚拟机Apache设置很多用户都遇到过&#xff0c;具体如何进行虚拟机Apache设置&#xff1f;怎样才能让虚拟机Apache设置达到最简单&#xff0c;最优化&#xff1f;本文为您讲解。Apache虚拟机设置有两种方法&#xff1a; 基于主机名的虚拟主机(一个IP地址&#…...

网站商业授权/5188关键词挖掘工具

作者&#xff1a;何海涛 出处&#xff1a;http://zhedahht.blog.163.com/ 题目&#xff1a;定义Fibonacci数列如下&#xff1a; / 0 n0 f(n) 1 n1 \ f(n-1)f(n-2) n2 输入n&#xff0c;用最快的方法求该数…...

在什么网站可以自承包活来做/竞价推广工具

select CONCAT(COLUMN_NAME ,’,’) from information_schema.COLUMNS where table_name ‘icloud_dictionary’ 然后&#xff0c;必须在notepad中打开 altshift选中多行&#xff0c;于是多行的光标成为一列...

男女做羞羞事动画网站免费/百度一下 你就知道首页

20172330 2017-2018-2 《程序设计与数据结构》第一周学习总结 教材学习内容总结 本周的学习内容为是软件工程&#xff0c;这是一门关于高质量软件开发的技术和理论的学科&#xff0c;用来控制开发过程&#xff0c;实现高质量的软件。 概述 软件工程的目标包括以下&#xff1a; …...

移动互联网开发找工作/武汉seo结算

综观多家企业的ERP实施情况&#xff0c;笔者发现有一个比较大的误区&#xff0c;即都忽视了计划在工作中的作用。有些企业虽然意识到计划的重要性&#xff0c;但是在实际工作中会因为种种原因无法落实到实处。笔者认为&#xff0c;计划是ERP项目中的灵魂&#xff0c;企业用户应…...