【Linux C | 网络编程】入门知识:TCP协议、TCP客户端、TCP服务端

news2024/10/1 15:30:03

😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀
🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C++、数据结构、音视频🍭
🤣本文内容🤣:🍭介绍网络编程入门知识:TCP协议、TCP客户端、TCP服务端 🍭
😎金句分享😎:🍭你不能选择最好的,但最好的会来选择你——泰戈尔🍭

本文未经允许,不得转发!!!

目录

  • 🎄一、TCP协议概述
  • 🎄二、一个最简单的TCP客户端
    • ✨2.1 tcp客户端步骤和代码
    • ✨2.2 tcp客户端相关函数
  • 🎄三、一个最简单的TCP服务端
    • ✨2.1 tcp服务端步骤和代码
    • ✨2.2 tcp服务端相关函数
  • 🎄四、总结


在这里插入图片描述

🎄一、TCP协议概述

TCP协议的全称是传输控制协议(Transmission Control Protocol)。TCP是一个面向连接的协议,为用户进程提供可靠的全双工字节流。TCP套接字是一种流套接字( streamsocket)。TCP关心确认、超时和重传之类的细节。大多数因特网应用程序使用TCP。注意,TCP既可以使用IPv4,也可以使用IPv6。


TCP协议的几个特点:

  • 1、TCP是通过连接(connection)来通信的。TCP客户端与某个TCP服务端建立连接,然后通过这个连接与服务端交互数据,最后终止这个连接。
  • 2、TCP是可靠性(reliability)。当TCP向另一端发送数据时,它要求对端返回一个确认。如果没有收到确认,TCP就自动重传数据并等待更长时间。在数次重传失败后,TCP才放弃,如此在尝试发送数据上所花的总时间一般为4~10分钟(依赖于具体实现)。
    TCP会给每个分节关联一个序列号,如果接收到重复数据,可以判定数据重复并丢弃。
  • 3、TCP提供流量控制(flow control)。TCP总是会告诉对端,它一次能够从对端接收多少个字节的数据,这成为通告窗口(advertised window)。该窗口指出接收缓冲区的当前可用字节。
  • 4、TCP是全双工的(full-duplex)。表示在同一个TCP连接上,同一时刻可以同时发送、接收数据。

在这里插入图片描述

🎄二、一个最简单的TCP客户端

✨2.1 tcp客户端步骤和代码

编写TCP客户端的步骤:

  • 1、创建TCP套接字socket
  • 2、指定TCP服务端ip和端口,bzero、inet_pton
  • 3、建立与TCP服务端的连接,connect
  • 4、交互数据
  • 5、关闭套接字
#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>

int main()
{
	// 1、创建TCP套接字socket
	int sockfd = socket(AF_INET, SOCK_STREAM, 0);
	if(sockfd<0)
		perror("socket error" );
	
	// 2、准备服务端ip和端口
	struct sockaddr_in servaddr;
	bzero(&servaddr, sizeof(servaddr));
	servaddr.sin_family = AF_INET;
	servaddr.sin_port = htons (10086);
	if (inet_pton(AF_INET, "127.0.0.1", &servaddr.sin_addr) <= 0) // 设置本机IP为服务端IP
		perror("inet_pton error");
	
	// 3、连接 connect
	if (connect(sockfd,(struct sockaddr*)&servaddr, sizeof(servaddr)) < 0)
		perror("connect error" );
	
	// 4、交换数据
	printf("TcpCli sockfd=%d, send msg\n",sockfd);
	write(sockfd, "Hello,I am tcp client", strlen("Hello,I am tcp client"));
	
	char recvline[256];
	int n = 0;
	while ( (n = read (sockfd, recvline, sizeof(recvline))) > 0)
	{
		recvline[n] = 0 ;/*null terminate */
		printf("recv[%s]\n",recvline);
	}
	
	if (n < 0)
		perror("read error" );
	
	// 5、关闭
	close(sockfd);

	return 0;
}

✨2.2 tcp客户端相关函数

  • socket 函数

    #include <sys/types.h>          /* See NOTES */
    #include <sys/socket.h>
    int socket(int domain, int type, int protocol);
    

    socket函数创建一个套接字描述符。man手册描述,socket创建一个通信端点并返回一个描述符。

    • 参数domain指定通信域,使用了AF_INET,表示是IPv4 Internet protocols协议的。
    • 参数type指定套接字类型,使用``,表示TCP协议的套接字(提供有序、可靠、双向、基于连接的字节流。可以支持带外数据传输机制)。
    • 参数protocol指定了要与套接字一起使用的特定协议。通常,在给定的协议族中,只有一个协议支持特定的套接字类型,在这种情况下,协议可以指定为0。
  • connect 函数

    #include <sys/types.h>          /* See NOTES */
    #include <sys/socket.h>
    int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
    

    connect 函数将文件描述符sockfd引用的套接字连接到addr指定的地址。addrlen参数指定addr的大小。addr中地址的格式由套接字sockfd的地址空间决定;

在这里插入图片描述

🎄三、一个最简单的TCP服务端

✨2.1 tcp服务端步骤和代码

编写TCP服务端的步骤:

  • 1、创建TCP套接字socket
  • 2、准备服务端ip和端口;
  • 3、绑定,bind
  • 4、监听,listen
  • 5、接受客户端连接,accept
  • 6、与客户端进行数据交互
  • 7、关闭套接字
#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>

int main()
{
	// 1、创建TCP套接字socket
	int sockfd = socket(AF_INET, SOCK_STREAM, 0);
	if(sockfd<0)
		perror("socket error" );
	
	// 2、准备服务端ip和端口
	struct sockaddr_in servaddr;
	bzero(&servaddr, sizeof(servaddr));
	servaddr.sin_family = AF_INET;
	servaddr.sin_port = htons (10086);
	servaddr.sin_addr.s_addr = INADDR_ANY; // 指定ip地址为 INADDR_ANY,这样要是服务器主机有多个网络接口,服务器进程就可以在任一网络接口上接受客户端的连接
	
	// 3、绑定 bind
	if (bind(sockfd,(struct sockaddr*)&servaddr, sizeof(servaddr)) < 0)
		perror("bind error" );
	
	// 4、监听 listen
	if(listen(sockfd, 10) != 0)
		perror("listen error");
	
	printf("TcpSer sockfd=%d, start listening\n",sockfd);
	char recvline[256];
	while(1)
	{
		// 5、接受客户端连接
		int connfd = accept(sockfd, NULL, NULL);
		
		// 6、与客户端交换数据
		int n = read(connfd, recvline, sizeof(recvline));
		if(n>0)
		{
			recvline[n] = 0 ;/*null terminate */
			printf("recv connfd=%d [%s]\n",connfd,recvline);
		}
		write(connfd, "Hello,I am tcp server", strlen("Hello,I am tcp server"));
		close(connfd);
	}
	
	// 7、关闭
	close(sockfd);

	return 0;
}

socketbindlisten这3个调用步骤是任何TCP服务器准备所谓的监听描述符(listening descriptor)的正常步骤。


✨2.2 tcp服务端相关函数

tcp服务端相关函数有:socket、bind、listen、accept。socket函数可以参照上面 2.2 小节。

  • bind 函数
    #include <sys/types.h>          /* See NOTES */
    #include <sys/socket.h>
    int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
    
    bind函数将addr指定的地址分配给文件描述符sockfd引用的套接字。addrlen指定addr指向的地址结构的大小。
  • listen 函数
    #include <sys/types.h>          /* See NOTES */
    #include <sys/socket.h>
    int listen(int sockfd, int backlog);
    
    listen函数将sockfd引用的套接字标记为被动套接字,标记后,可以使用accept函数接受传入连接请求的套接字。
    • backlog参数定义了sockfd的挂起连接队列可能增长到的最大长度。如果连接请求在队列已满时到达,则客户端可能会接收到带有ECONNREFUSED指示的错误,或者,如果底层协议支持重传,则可以忽略该请求,以便稍后重新尝试连接成功。
  • accept 函数
    #include <sys/types.h>          /* See NOTES */
    #include <sys/socket.h>
    int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
    
    accept函数用于基于连接的套接字类型(SOCK_STREAM、SOCK_SEQPACKET)。它提取侦听套接字的挂起连接队列中的第一个连接请求sockfd,创建一个新的连接套接字,并返回一个引用该套接字的新文件描述符。新创建的套接字未处于侦听状态。原始套接字sockfd不受此调用的影响。

在这里插入图片描述

🎄四、总结

👉本文主要介绍Linux下网络编程的基础知识,先是简单介绍一下TCP协议,然后给出一个TCP客户端、TCP服务端最简单的例子,最后介绍创建TCP客户端、TCP服务端需要用到的函数。

在这里插入图片描述
如果文章有帮助的话,点赞👍、收藏⭐,支持一波,谢谢 😁😁😁

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

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

相关文章

MySQL 数据库 JDBC 简化 JDBCTemplate

JDBCTemplate编程 场景&#xff1a;使用JdbcTemplate技术向MySQL中插入一条数据 表结构如下 create table t_person(person_id int primary key auto_increment,person_name varchar(20),age tinyint,sex enum(男,女,奥特曼),height decimal(4,1),birthday datetime ) AP…

勤学苦练“prompts“,如沐春风“CodeArts Snap“

前言 CodeArts Snap 上手一段时间了&#xff0c;对编程很有帮助。但是&#xff0c;感觉代码编写的不尽人意。 我因此也感到困惑&#xff0c;想要一份完整的 CodeArts Snap 手册看看。 就在我感觉仿佛"独自彷徨在这条悠长、悠长又寂寥的雨巷"时&#xff0c;我听了大…

Ubuntu+Apache+MySQL+PHP+phpstorm+xdebug下的debug环境搭建(纯小白笔记)

关键词 一、win10双系统装Ubuntu&#xff08;Deepin&#xff09; 参考文章&#xff1a; https://www.cnblogs.com/masbay/p/11627727.html 1.1 首先需要确定自己操作系统的引导方式 1.1.1 查看BIOS模式 “winr"快捷键进入"运行”&#xff0c;输入"msinfo32…

微软 AD |域控制器 | 组件 | 域服务 | 对象解析

介绍 Active Directory&#xff08;AD&#xff09;&#xff0c;是微软的目录服务&#xff0c;提供强大的功能和管理体系&#xff0c;用于组织管理和安全存储网络上的资源和用户、计算机、服务对象等信息。 AD 功能&#xff1a; 身份验证和访问控制&#xff1a; 提供集中式的身…

2024 高级前端面试题之 CSS 「精选篇」

该内容主要整理关于 CSS 的相关面试题&#xff0c;其他内容面试题请移步至 「最新最全的前端面试题集锦」 查看。 CSS模块精选篇 1. 盒模型2. BFC3. 层叠上下文4. 居中布局5. 选择器权重计算方式6. 清除浮动7. link 与 import 的区别8. CSS3的新特性9. CSS动画和过渡10. 有哪些…

Mac中java jdk、android sdk、flutter sdk目录

1、Java JDK 目录 &#xff08;1&#xff09;官网下载的 Java JDK Java JDK下载官网 /Library/Java/JavaVirtualMachines&#xff08;2&#xff09;Android Studio下载的 Java JDK /Users/用户名/Library/Java/JavaVirtualMachines2、Android SDK 目录 /Users/用户名/Libr…

以梦为码,CodeArts Snap 缩短我与算法的距离

背景 最近一直在体验华为云的 CodeArts Snap&#xff0c;逐渐掌握了使用方法&#xff0c;代码自动生成的准确程度大大提高了。 自从上次跟着 CodeArts Snap 学习用 Python 编程&#xff0c;逐渐喜欢上了 Python。 我还给 CodeArts Snap 起了一个花名&#xff1a; 最佳智能学…

SQL注入实战:二阶注入

一、二阶注入的原理 1、二阶注入也称为SOL二次注入。 2、二次注入漏洞是一种在Web应用程序中广泛存在的安全漏洞形式:相对于一次注入漏洞而言&#xff0c;二次注入漏洞更难以被发现&#xff0c;但是它却具有与一次注入攻击漏洞相同的攻击威力。 3、简单的说&#xff0c;二次…

GitHub国内打不开(解决办法有效)

最近国内访问github.com经常打不开&#xff0c;无法访问。 github网站打不开的解决方法 1.打开网站http://tool.chinaz.com/dns/ &#xff0c;在A类型的查询中输入 github.com&#xff0c;找出最快的IP地址。 2.修改hosts文件。 在hosts文件中添加&#xff1a; # localhost n…

Leetcode—2807. 在链表中插入最大公约数【中等】

2023每日刷题&#xff08;九十九&#xff09; Leetcode—2807. 在链表中插入最大公约数 实现代码 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val…

Datawhale 组队学习之大模型理论基础 Task7 分布式训练

第8章 分布式训练 8.1 为什么分布式训练越来越流行 近年来&#xff0c;模型规模越来越大&#xff0c;对硬件&#xff08;算力、内存&#xff09;的发展提出要求。因为内存墙的存在&#xff0c;单一设持续提高芯片的集成越来越困难&#xff0c;难以跟上模型扩大的需求。 为了…

力扣每日一题 ---- 1039. 多边形三角剖分的最低得分

这题的难点在哪部分呢&#xff0c;其实是怎么思考。这道题如果之前没做过类似的话&#xff0c;还是很难看出一些性质的&#xff0c;这题原本的话是没有图片把用例显示的这么详细的。这题中有个很隐晦的点没有说出来 剖出来的三角形是否有交叉&#xff0c;这题中如果加一个三角…

企业级大数据安全架构(六)数据授权和审计管理

作者&#xff1a;楼高 本节详细介绍企业级大数据架构中的第六部分&#xff0c;数据授权和审计管理 1.Ranger简介 Apache Ranger是一款被设计成全面掌管Hadoop生态系统的数据安全管理框架&#xff0c;为Hadoop生态系统众多组件提供一个统一的数据授权和管理界面&#xff0c; 管…

Redis为什么速度快:数据结构、存储及IO网络原理总结

Redis&#xff0c;作为内存数据结构存储的佼佼者&#xff0c;其高性能表现一直备受赞誉。那么&#xff0c;Redis究竟是如何实现这一点的呢&#xff1f;接下来&#xff0c;我们将更深入地探讨其背后的关键技术&#xff0c;并提供进一步的优化策略。 一、内存存储与数据结构设计…

【Linux】进程概述

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c系列专栏&#xff1a;C/C零基础到精通 &#x1f525; 给大…

FlashInternImage实战:使用FlashInternImage实现图像分类任务(一)

文章目录 摘要安装包安装timm 数据增强Cutout和MixupEMA项目结构编译安装DCNv4环境安装过程配置CUDAHOME解决权限不够的问题 按装ninja编译DCNv4 计算mean和std生成数据集 摘要 https://arxiv.org/pdf/2401.06197.pdf 论文介绍了Deformable Convolution v4&#xff08;DCNv4&…

单片机学习笔记---动态数码管显示

上一节我们得出一个结论&#xff0c;多位一体的数码管不可能在同一时刻显示多个不同数字&#xff0c;即使有多位选中的话&#xff0c;那显示的数字也会是相同的。这是由于他们共用引脚导致的这个现象。当然这也是为了节省引脚的连接方式&#xff0c;方便操作。 那这样的连接方式…

React中使用LazyBuilder实现页面懒加载方法二

前言&#xff1a; 在一个表格中&#xff0c;需要展示100条数据&#xff0c;当每条数据里面需要承载的内容很多&#xff0c;需要渲染的元素也很多的时候&#xff0c;容易造成页面加载的速度很慢&#xff0c;不能给用户提供很好的体验时&#xff0c;懒加载是优化页面加载速度的方…

NC开发客户端(前端)连接启动失败can‘t connect to server, please wait

效果图 解决方法 IP地址和端口要对应 1-IP地址中间启动&#xff0c;肯定是这个127.0.0.1 2-端口号&#xff0c;要对应中间件启动在控制台输出的端口 或者是在home目录-》bin-》sysConfig.bat这里面的服务器&#xff0c; 里面可以看到对应启动ip地址和端口

浪花 - 响应拦截器(强制登录)

1. 配置响应拦截器 import axios from axios;const myAxios axios.create({baseURL: http://localhost:8080/api/, });myAxios.defaults.withCredentials true;// 请求拦截器 myAxios.interceptors.request.use(function (config) {// Do something before request is sentc…