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

【Linux】计算机网络套接字编写

文章目录

  • 前言
  • TCP协议和UDP协议
  • 网络字节序
  • socket接口
    • sockaddr结构
    • 1.创建套接字 cs
    • 2.绑定端口号 s
    • 3.监听socket s
    • 4.接受请求 s
    • 5.建立连接 c
  • 地址转换函数
    • 字符串转in_addr
    • in_addr转字符串
  • recvfrom和sendto

前言

上篇文章我们学习了计算机网络分层,了解了网络通信的本质是进程间通信,正式通过套接字的方式进行通信。

TCP协议和UDP协议

TCP/UDP协议是工作在传输层的协议,负责数据的传输,主要提供数据传输的策略,而TCP和UDP就是两种不同的传输数据策略。

  • TCP(传输控制协议)

    • 面向连接
    • 可靠传输
    • 面向字节流
  • UDP(用户数据报协议)

    • 无连接
    • 不可靠传输
    • 面向数据报

注意,这里提到的可靠和不可靠不是说TCP好于UDP,而是他们传输的特性,在说明具体协议的时候我们再详谈。
由于UDP协议不面向连接,所以简单是他的巨大优势,今天我们先来详细学习一下简单的UDP套接字。

网络字节序

在学习C语言的时候,我们指定内存中的多字节数据相对于地址有大小端之分,网络流同样也有大端小端之分。

1、发送主机一般将发送缓冲区的数据从低到高的顺序发出
2、接收主句一般把收到的数据按照从低到高的顺序保存
3、所以,网络数据流的地址规定为:先发出的数据是低地址,后发出的是高地址
4、TCP/IP协议规定:网络数据流应当采用大端字节序,即:低地址高字节

接口:

#include <arpa/inet.h>uint16_t htons(uint16_t hostshort)
uint16_t ntohs(uint16_t netshort)

socket接口

socket接口就像我们之前用过的系统调用,是操作系统级别的接口。

sockaddr结构

1、ipv4和ipv6的地址类型分别定义为AF_INET和AF_INET6,位于netinet/in.h中,在使用socketAPI的时候,可以先把对应的sockaddr_in结构转换成sockaddr,在接口内部,会根据16位地址类型进行不同类型的操作,这是C语言早期多态性的体现

2、socket套接字不仅可以网络通信,由于sockaddr转换+16位地址类型存在,socketAPI也支持进程间通信
在这里插入图片描述

1.创建套接字 cs

int socket(int domain, int type,int protocol)

参数:

  • domain:ipv4写为AF_INET
  • type:udp为:SOCK_DGRAM;tcp为:SOCK_STREAM
  • protocol:设置为0表示默认

2.绑定端口号 s

int bind(int socket,const struct sockaddr* address,socklen_t address_len);
实例:
struct sockaddr_in local;local.sin_family = AF_INET;
local.sin_port = htons(port);
local.sin_addr.s_addr = INADDR_ANY;

顺便一提,云服务是不允许我们bind指定IP地址的,因此我们使用INADDR_ANY绑定本主机的任意IP。

3.监听socket s

int listen(int socket, int backlog);

参数:

  • socket:要监听的套接字
  • backlog:最长等待队列

4.接受请求 s

int accept(int socket, struct sockaddr* address,socklen* address_len);

参数:

  • socket :套接字
  • address :用于存储客户端的地址信息
  • address_len: 输入输出型参数,作为输入他指定了address指向缓冲区的长度,作为输出,会被设置为实际地址的长度,比如输入时有10个字节,但客户端实际传入只有8个字节,这个参数会被修改成八字节。

5.建立连接 c

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

参数:

  • sockfd:客户端创建的文件描述符
  • addr:用于指定服务器端的地址信息
  • addrlen:addr的实际大小

地址转换函数

我们习惯使用点分十进制的方式来记录ip地址,例如101.34.23.11,但网络中是用32个比特位来记录ip地址的,因此我们需要将点分十进制风格的ip地址转换为网络地址

字符串转in_addr

#include <arpa/inet.h>int inet_aton(const char* strptr,struct in_addr* addrptr);struct in_addr 
{in_addr_t s_addr; // 存储32位的IPv4地址
};

参数:

  • strptr:要转换的ip字符串
  • addrptr:存取转换后的32位地址

返回值:

  • 转换成功返回1,失败返回0

int inet_pton(int family,const char* strptr,void* addrptr);

参数:

  • family:要转换的协议族
  • strptr:要转换的ip字符串(4、6都支持)
  • addrptr:转换后放入的缓冲区

返回值:

  • 成功返回1
  • 失败返回0
  • 无效返回-1,并设置errno

in_addr_t inet_addr(const char* strptr);

参数:

  • strptr:要转换的ip字符串

返回值:

  • 成功返回32位ip地址
  • 失败返回INADDR_NONE

in_addr转字符串

char* inet_ntoa(struct in_addr inaddr);

参数:

  • inaddr :把32位的ip地址转化为点分十进制

int inet_pton(int family,const void* addrptr,char* strptr);

参数:

  • family:协议族
  • addrptr:存放字符串ip的指针
  • strptr:存放转换后二进制的缓冲区

返回值:

  • 成功返回1,失败返回-1

recvfrom和sendto

#include <sys/types.h>
#include <sys/socket.h>ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,struct sockaddr *src_addr, socklen_t *addrlen);

参数:

  • sockfd:接收数据的套接字
  • buf:缓冲区指针,指向存放接收到的数据
  • len:缓冲区的大小,期望收到的最大字节
  • flags:接收数据的标志,可以为0或者特定接收选项
  • src_addr:存放发送方套接字地址的结构体指针,可以为NULL
  • addrlen:指定对方结构体的大小

注意:recv里是不带后两个参数的,因为TCP是面向连接的,不需要读取后面两个参数。


#include <sys/types.h>
#include <sys/socket.h>ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,const struct sockaddr *dest_addr, socklen_t addrlen);

参数:

  • sockfd:套接字描述符
  • buf:要发送的数据
  • len:发送的大小
  • flags:发送的方式
  • dest_addr:目标主机的套接字信息
  • addrlen:大小

同样的,send不需要后面两个参数。

相关文章:

【Linux】计算机网络套接字编写

文章目录 前言TCP协议和UDP协议网络字节序socket接口sockaddr结构1.创建套接字 cs2.绑定端口号 s3.监听socket s4.接受请求 s5.建立连接 c 地址转换函数字符串转in_addrin_addr转字符串 recvfrom和sendto 前言 上篇文章我们学习了计算机网络分层&#xff0c;了解了网络通信的本…...

Maven-学习笔记

文章目录 1. Maven简介2.Maven安装和基础配置3.Maven基本使用4.Maven坐标介绍 1. Maven简介 概念 Maven是专门用于管理和构建Java项目的工具 主要功能有: 提供了一套标准化的项目结构提供了一套标准化的构建流程&#xff08;编译&#xff0c;测试&#xff0c;打包&#xff0c;…...

WebGL Shader着色器GLSL语言

在2D绘图中的坐标系统&#xff0c;默认情况下是与窗口坐标系统相同&#xff0c;它以canvas的左上角为坐标原点&#xff0c;沿X轴向右为正值&#xff0c;沿Y轴向下为正值。其中canvas坐标的单位都是’px’。 WebGL使用的是正交右手坐标系&#xff0c;且每个方向都有可使用的值的…...

【Codeforces】 CF468C Hack it!

题目链接 CF方向 Luogu方向 题目解法 令 ∑ i 1 1 e 18 f ( i ) ≡ g ( g < a ) ( m o d a ) \sum_{i1}^{1e18}f(i)\equiv g(g<a)(mod \;a) ∑i11e18​f(i)≡g(g<a)(moda) 那么 ∑ i 2 1 e 18 1 f ( i ) ≡ g 1 \sum_{i2}^{1e181}f(i)\equiv g1 ∑i21e181​f…...

FFmpeg常见命令行(一):FFmpeg工具使用基础

前言 在Android音视频开发中&#xff0c;网上知识点过于零碎&#xff0c;自学起来难度非常大&#xff0c;不过音视频大牛Jhuster提出了《Android 音视频从入门到提高 - 任务列表》。本文是Android音视频任务列表的其中一个&#xff0c; 对应的要学习的内容是&#xff1a;FFmpe…...

Mock.js的基本使用方法

官网网址&#xff1a;Mock.js (mockjs.com) 当前端工程师需要独立于后端并行开发时&#xff0c;后端接口还没有完成&#xff0c;那么前端怎么获取数据&#xff1f; 这时可以考虑前端搭建web server自己模拟假数据&#xff0c;这里我们选第三方库mockjs用来生成随机数据&#xf…...

TiDB 源码编译之 PD/TiDB Dashboard 篇

作者&#xff1a; ShawnYan 原文来源&#xff1a; https://tidb.net/blog/a16b1d46 TiDB TiDB 是 PingCAP 公司自主设计、研发的开源分布式关系型数据库&#xff0c;是一款同时支持在线事务处理与在线分析处理 (Hybrid Transactional and Analytical Processing, HTAP) 的融…...

Vue3描述列表(Descriptions)

&#x1f601; 整体功能效果与 ant design vue 保持高度一致 &#x1f601; 包含两种组件&#xff1a;Descriptions 和 DescriptionsItem&#xff08;必须搭配使用&#xff01;&#xff09; 效果如下图&#xff1a;在线预览 APIs Descriptions 参数说明类型默认值必传title…...

【驱动开发day8作业】

作业1&#xff1a; 应用层代码 #include <stdlib.h> #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #include <string.h> #include <sys/ioctl.h>int main(int…...

yxBUG记录

1、 原因&#xff1a;前端参数method方法名写错。 2、Field ‘REC_ID‘ doesn‘t have a default value 问题是id的生成问题。 项目的表不是自增。项目有封装好的方法。调用方法即可。 params.put("rec_id",getSequence("表名")) 3、sql语句有问题 检…...

uniapp引入inconfont自定义导航栏

app,h5端引入 uniapp本身的全局设置中有个iconfontsrc属性 所以只需要 1.iconfont将需要的icon添加至项目 2.下载到本地解压后,将其中的ttf文件,放在static静态目录下 3.在page.json中对全局文件进行配置tabBar(导航图标) “iconfontSrc”: “static/font/iconfont.ttf”, …...

OSLog与NSLog对比

NSLog: NSLog的文档&#xff0c;第一句话就说&#xff1a;Logs an error message to the Apple System Log facility.&#xff0c;所以首先&#xff0c;NSLog就不是设计作为普通的debug log的&#xff0c;而是error log&#xff1b;其次&#xff0c;NSLog也并非是printf的简单…...

全网最细,Fiddler修改接口返回数据详细步骤实战,辅助接口测试...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 在测试的过程中&a…...

Mysql自动同步的详细设置步骤

以下步骤是真实的测试过程&#xff0c;将其记录下来&#xff0c;与大家共同学习。 一、环境说明&#xff1a; 1、主数据库&#xff1a; &#xff08;1&#xff09;操作系统&#xff1a;安装在虚拟机中的CentOS Linux release 7.4.1708 (Core) [rootlocalhost ~]# cat /etc/redh…...

opencv-38 形态学操作-闭运算(先膨胀,后腐蚀)cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)

闭运算是先膨胀、后腐蚀的运算&#xff0c;它有助于关闭前景物体内部的小孔&#xff0c;或去除物体上的小黑点&#xff0c;还可以将不同的前景图像进行连接。 例如&#xff0c;在图 8-17 中&#xff0c;通过先膨胀后腐蚀的闭运算去除了原始图像内部的小孔&#xff08;内部闭合的…...

jenkins gitlab多分支构建发布

内容背景介绍 这个是新手教程,普及概念为主 公司现在还使用单分支发布测试环境和生产,多人协同开发同一个项目导致测试环境占用等待等情况 测试环境占用等待问题 测试环境代码直接合并到 master,容易导致误发布到生产的情况 避免多版本同时发布测试不完善的情况出现 中间件…...

刷题笔记 day8

1004 最大连续1的个数 III 这道题要求将原数组中的0翻转成1&#xff0c;求出最大元素全是1的子数组长度&#xff0c;看这道题第一感觉还要将里面的0变成1&#xff0c;感觉这道题解决起来很麻烦&#xff0c;但是我们可以转变思路&#xff0c;找出其最大子数组&#xff0c;使得子…...

C 语言的表达式

表达式 expression 表达式由运算符和运算对象组成。 最简单的表达式是一个单独的运算对象&#xff0c;以此为基础可以建立复杂的表达式。 一些表达式由子表达式&#xff08;subexpression&#xff09;组成。子表达式即较小的表达式。 这些都是一些表达式&#xff1a; -4 a…...

C++设计模式创建型之单例模式

一、概述 单例模式也称单态模式&#xff0c;是一种创建型模式&#xff0c;用于创建只能产生一个对象实例的类。例如&#xff0c;项目中只存在一个声音管理系统、一个配置系统、一个文件管理系统、一个日志系统等&#xff0c;甚至如果吧整个Windows操作系统看成一个项目&#xf…...

杂记 | 记录一次使用Docker安装gitlab-ce的过程(含配置交换内存)

文章目录 01 准备工作02 &#xff08;可选&#xff09;配置交换内存03 编辑docker-compose.yml04 启动并修改配置05 nginx反向代理06 &#xff08;可选&#xff09;修改配置文件07 访问并登录 01 准备工作 最近想自建一个gitlab服务来保存自己的项目&#xff0c;于是找到gitla…...

【WiFi帧结构】

文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成&#xff1a;MAC头部frame bodyFCS&#xff0c;其中MAC是固定格式的&#xff0c;frame body是可变长度。 MAC头部有frame control&#xff0c;duration&#xff0c;address1&#xff0c;address2&#xff0c;addre…...

FastAPI 教程:从入门到实践

FastAPI 是一个现代、快速&#xff08;高性能&#xff09;的 Web 框架&#xff0c;用于构建 API&#xff0c;支持 Python 3.6。它基于标准 Python 类型提示&#xff0c;易于学习且功能强大。以下是一个完整的 FastAPI 入门教程&#xff0c;涵盖从环境搭建到创建并运行一个简单的…...

服务器硬防的应用场景都有哪些?

服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式&#xff0c;避免服务器受到各种恶意攻击和网络威胁&#xff0c;那么&#xff0c;服务器硬防通常都会应用在哪些场景当中呢&#xff1f; 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...

【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统

目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索&#xff08;基于物理空间 广播范围&#xff09;2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...

Element Plus 表单(el-form)中关于正整数输入的校验规则

目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入&#xff08;联动&#xff09;2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...

Mac下Android Studio扫描根目录卡死问题记录

环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中&#xff0c;提示一个依赖外部头文件的cpp源文件需要同步&#xff0c;点…...

html-<abbr> 缩写或首字母缩略词

定义与作用 <abbr> 标签用于表示缩写或首字母缩略词&#xff0c;它可以帮助用户更好地理解缩写的含义&#xff0c;尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时&#xff0c;会显示一个提示框。 示例&#x…...

在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?

uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件&#xff0c;用于在原生应用中加载 HTML 页面&#xff1a; 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

return this;返回的是谁

一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请&#xff0c;不同级别的经理有不同的审批权限&#xff1a; // 抽象处理者&#xff1a;审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...

R 语言科研绘图第 55 期 --- 网络图-聚类

在发表科研论文的过程中&#xff0c;科研绘图是必不可少的&#xff0c;一张好看的图形会是文章很大的加分项。 为了便于使用&#xff0c;本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中&#xff0c;获取方式&#xff1a; R 语言科研绘图模板 --- sciRplothttps://mp.…...