Linux网络通信

news2024/11/20 7:13:15

网络模型

七层模型

在这里插入图片描述

四层模型

在这里插入图片描述

TCP : 面向连接,可靠的,面向字节流,支持点对点通信。
UDP : 无连接,不可靠,面向数据报文,支持一对一,一对多,多对多。

通信原理

在这里插入图片描述

常用函数

#include <sys/socket.h>
//创建套接字
int socket (int domain, int type, int protocol);
/*
domain : 地址族
	AF_UNIX/AF_LOCAL/AF_FILE: 本地通信(进程间通信);
    AF_INET: 基于TCP/IPv4(32位IP地址)的网络通信;
    AF_INET6: 基于TCP/IPv6(128位IP地址)的网络通信;
    AF_PACKET: 基于底层包接口的网络通信。

type : 通信协议,取值:
    SOCK_STREAM: 数据流协议,即TCP协议;
    SOCK_DGRAM: 数据报协议,即UDP协议。
 
 protocol : 一般不使用,置为0.
*/

//准备通信地址
//A. 基本地址类型
struct sockaddr 
{
    sa_family_t sa_family;   // 地址族
    char        sa_data[14]; // 地址值
};

//B. 本地地址类型
#include <sys/un.h>
struct sockaddr_un 
{
    sa_family_t sun_family; // 地址族
    char        sun_path[]; // 套接字文件路径
};

//C. 网络地址类型
#include <netinet/in.h>
struct sockaddr_in 
{
    // 地址族
    sa_family_t sin_family;
    in_port_t sin_port;
    // IP地址
	struct in_addr sin_addr;
};

//绑定套接字
int bind (int sockfd, const struct sockaddr* addr,socklen_t addrlen);
/*
sockfd : 套接字
addr   : 通信地址
addrlen : 通信地址字节长度
*/

//监听
int listen (int sockfd, int backlog);
/*
sockfd : 套接字
backlog : 最大连接请求
*/
//接收请求
int accept (int sockfd, struct sockaddr* addr,socklen_t* addrlen);
//成功返回套接字

//建立连接
int connect (int sockfd, const struct sockaddr* addr,socklen_t addrlen);

例子

server

int server_run(){
	pthread_mutex_init(&lock,NULL);//初始化互斥锁
	list = slink_create();			//创建链表
	file_read(list);				//读取文件
//创建套接字
	sockfd = socket(AF_INET,SOCK_STREAM,0);
	if(sockfd == -1){
		perror("socket");
		return -1;
	}
//准备通信地址
	struct sockaddr_in addr;
	addr.sin_family = AF_INET;
	addr.sin_port = htons(PORT);
	addr.sin_addr.s_addr = inet_addr(IP);
	socklen_t len = sizeof(addr);
//捆绑通信地址和套接字
	int ret = bind(sockfd,(const struct sockaddr *)&addr,len);
	if(ret == -1){
		perror("bind");
		return -1;
	}
//监听
	ret = listen(sockfd,MAX);
	if(ret == -1){
		perror("listen");
		return -1;
	}
//接收连接请求
	while(1){
		signal(SIGINT,myexit);
		struct sockaddr_in caddr = {};
		socklen_t clen = sizeof(caddr);
		int cfd = accept(sockfd,(struct sockaddr *)&caddr,&clen);
			//有新的连接时,产生新的文件套接字,作为纽带
		if(cfd == -1){
			perror("accept");
			return -1;
		}
		pthread_t id;
		int ret = pthread_create(&id,NULL,run,(void*)&cfd);
		assert(ret == 0);
		ret = pthread_detach(id);
		assert(ret == 0);

	}
}

client

int client_run(){
//创建套接字
	int sockfd = socket(AF_INET,SOCK_STREAM,0);
	if(sockfd == -1){
		perror("socket");
		return -1;
	}
//准备通信地址
	struct sockaddr_in addr = {};
	addr.sin_family = AF_INET;
	addr.sin_port = htons(PORT);
	addr.sin_addr.s_addr = inet_addr(IP);
	socklen_t len = sizeof(addr);
//连接通信	
	int ret = connect(sockfd,(const struct sockaddr *)&addr,len);
	if(ret == -1){
		perror("connect");
		return -1;
	}
}

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

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

相关文章

LC 82. 删除排序链表中的重复元素 II

82. 删除排序链表中的重复元素 II 难度&#xff1a; 中等 题目大意&#xff1a; 给定一个已排序的链表的头 head &#xff0c; 删除原始链表中所有重复数字的节点&#xff0c;只留下不同的数字 。返回 已排序的链表 。 提示&#xff1a; 链表中节点数目在范围 [0, 300] 内-…

GIT SourceTree 回滚提交

步骤一&#xff1a; 步骤二&#xff1a; 步骤三&#xff1a; 在终端输入命令&#xff08;位置是项目目录下&#xff09; git push origin feature_mo2.1_r3_zhanx653 -f

#LLMOps##AIGC# Dify_构建本地知识库问答应用-生成Al应用的创新引擎 用于构建助手API和GPT的开源开发平台

github&#xff1a; https://github.com/langgenius/dify/blob/main/README_CN.md 介绍文档&#xff1a;https://docs.dify.ai/getting-started/readme Dify 介绍 Dify 笔记 Dify 是什么&#xff1f; 开源的大语言模型&#xff08;LLM&#xff09;应用开发平台融合了后端即服…

电商服务类指标分析(2)——售后管理模块指标

段时间做了一个电商服务类项目&#xff0c;与业务一起梳理了部分指标&#xff0c;这些指标便于了解电商服务&#xff0c;现在做一个整理和回顾。 电商服务类指标可以分为五大类&#xff0c;涵盖了服务从售前、履约、售后、用户反馈、监控预警这样一条链路的内容。 本篇文章来聊…

React入门 - 02(工程目录结构解析)

本章内容 目录 1 外层“文件”说明2 各个“文件夹”说明 接着上一节的内容&#xff0c;我们继续这一节的内容–工程目录文件解析。打开上一节已经建好的工程 react-demo,详细的来了解一些里面的文件。 1 外层“文件”说明 .gitignore — 当我们使用 git 的时候&#xff0c;希…

统计学习 复习(知识点+习题)

复习资料&#xff1a;https://github.com/RuijieZhu94/StatisticalLearning_USTC 第一章 线性回归 1. From one to two 最小二乘 课后题 有偏/无偏估计 加权最小二乘 2. Regularization 线性回归&#xff08;二维情况&#xff09; 求解有约束优化问题 正则化最小加权二乘…

Web3与环保:区块链如何推动可持续发展

随着气候变化和环境问题日益严峻&#xff0c;社会对可持续发展的需求变得愈发迫切。在这个背景下&#xff0c;Web3技术和区块链崭露头角&#xff0c;成为推动可持续发展的关键力量。本文将深入探讨Web3技术如何与环保理念相结合&#xff0c;引领我们迈向更加可持续的未来。 1. …

Java异常:toString()和getMessage()区别

首先写了两个错误 Controller public class DemoController {RequestMapping("/show1")public String showInfo(){String str null;str.length();return "index";}RequestMapping("/show2")public String showInfo2(){int a 10/0;return &quo…

postman上传文件文件名有黄色图标

问题&#xff1a; 解决方案 步骤一&#xff1a;设置处打开settings 步骤二&#xff1a;打开location&#xff0c;选择文件所在磁盘目录 步骤三&#xff1a;关闭选项框 文件报错问题解决

VS 中调用调试DLL库的方法

前提条件&#xff1a; 1、当前代码是最新的&#xff0c;并且编译成dll的库有程序使用。 2、打开运行dll库的程序。 配置步骤&#xff1a; 1、使用VS打开要调试的dll库项目。 2、点击调试菜单展开调试菜单。 3、点击附加到进程&#xff0c;弹出配置框。 4、在配置框中选…

第十周:CV视觉内容深入(可选)

到这里基本AI需要准备的一些基础内容都已经ready了&#xff0c;我本人是视觉出身&#xff0c;所以还是想走老路子&#xff0c;不花费大量时间去往别的方向走了&#xff0c;所以针对视觉部分的内容我自己会单独拓展补充一些内容&#xff0c;选择性享用即可&#xff0c;欢迎交流&…

使用CLIP和LLM构建多模态RAG系统

在本文中我们将探讨使用开源大型语言多模态模型(Large Language Multi-Modal)构建检索增强生成(RAG)系统。本文的重点是在不依赖LangChain或LLlama index的情况下实现这一目标&#xff0c;这样可以避免更多的框架依赖。 什么是RAG 在人工智能领域&#xff0c;检索增强生成(re…

云端部署与本地部署:哪个最适合您的业务?

云端部署与本地部署&#xff1a;哪个最适合您的业务? 云的广泛采用导致许多供应商将重点从本地解决方案转移到云交付模型&#xff0c;从而引发了一个问题&#xff1a;“哪种方式最适合我的业务?”如果您想知道哪个选项更安全、更方便且更实惠&#xff0c;请探索我们方便的比较…

什么是WhatsApp Business?WhatsApp和WhatsApp Business区别?

什么是WhatsApp Business&#xff1f; WhatsApp Business账号是Meta专为企业设计的WhatsApp账号。不同于消费者层次的应用&#xff0c;WhatsApp Business旨在为企业提供更好的服务支持&#xff0c;方便企业与消费者建立更好的双向沟通渠道。 WhatsApp和WhatsApp Business有什…

CLion、IDEA设置编码为utf-8,防乱码

其实只要是JetBrains的软件都是通用的&#xff0c;下面以IDEA为例 1.设置项目文件编码 2.设置控制台的字符编码

保姆级Arduino开发环境搭建

Arduino&#xff0c;一个易于上手且功能丰富的开源平台&#xff0c;不仅包含了各种型号的Arduino开发板等硬件部分&#xff0c;还囊括了Arduino IDE等软件部分。更重要的是&#xff0c;它还拥有由广大爱好者和专业人员共同搭建和维护的互联网社区和资源&#xff0c;为创客们提供…

C语言经典算法之冒泡排序算法

目录 前言 建议&#xff1a; 简介&#xff1a; 一、代码实现 二、时空复杂度 时间复杂度&#xff1a; 空间复杂度&#xff1a; 总结&#xff1a; 前言 建议&#xff1a; 1.学习算法最重要的是理解算法的每一步&#xff0c;而不是记住算法。 2.建议读者学习算法的时候…

微调您的Embedding模型以最大限度地提高RAG管道中的相关性检索

英文原文地址&#xff1a;https://betterprogramming.pub/fine-tuning-your-embedding-model-to-maximize-relevance-retrieval-in-rag-pipeline-2ea3fa231149 微调您的Embedding模型以最大限度地提高RAG管道中的相关性检索 微调嵌入前后的 NVIDIA SEC 10-K 文件分析 2023 年…

C#灵活控制多线程的状态(开始暂停继续取消)

ManualResetEvent类 ManualResetEvent是一个同步基元&#xff0c;用于在多线程环境中协调线程的执行。它提供了两种状态&#xff1a;终止状态和非终止状态。 在终止状态下&#xff0c;ManualResetEvent允许线程继续执行。而在非终止状态下&#xff0c;ManualResetEvent会阻塞线…

智能助手的巅峰对决:ChatGPT对阵文心一言

在人工智能的世界里&#xff0c;ChatGPT与文心一言都是备受瞩目的明星产品。它们凭借先进的技术和强大的性能&#xff0c;吸引了大量用户的关注。但究竟哪一个在智能回复、语言准确性、知识库丰富度等方面更胜一筹呢&#xff1f;下面就让我们一探究竟。 首先来谈谈智能回复能力…