Linux网络基础知识————网络编程

计算机网络的体系结构

网络采用分而治之的方法设计,将网络的功能划分为不同的模块,以分层的形式有机结合在一起

每层实现不同的功能,其内部实现的方法对外部其他层次来说是透明的,每层向上一层提供服务,使用下一层提供的服务;

网络体系结构即网络的层次结构和每层使用的协议的集合

两类非常重要的体系结构:

开放式系统互联(opensystem interconnection 简称 OSI)和TCP/IP

OSI系统模型(7层)

OSI系统模型是国际化标准组织(IS0)为了实现计算机网络标准化颁布的参考型,根据网络中数据传输的过程,:将该模式分为7个层,每一层都向上一层提供服务,同时使用下层提供的服务。

TCP/IP 系统模型(4层)

国际化标准组织(IS0)指定的 0SI参考模型虽然规定得十分细致和完善,但在实际中却得不到广泛应用,原因就是它过于庞大和复杂,但它仍是此后众多协议模型的基础,与oS的复杂相比,TCP/IP 协议的四层结构模型获得了更广泛的使用。TCP/IP 协议是Internet事实上的工业标准。

TCP/IP的三次握手和四次挥手

三次握手

3次握手协议:TCP 是面向连接,所谓面向连接,就是计算机双方通信时必须先建立连接,然后进行数据通信。最后断开连接。TCP在建立连接时,有以下三个步骤;

第一次握手)客户端发送一个 SYN(包含有同步序列号的标志位的数据段和通信请求)给服务器,客户端进入SYN SEND 状态,然后等待服务器的回发确认信息

第二次握手) 服务器发一个 SYN+ACK 给客户端,确认已经收到客户端发来的信息,此时服务器进入SYN RECV状态;

第三次握手) 客户端接收到服务器发来的确认信息后,再反馈一个 ACK给服务器,完成三次握手,客户端和服务器进入ESTABLISHED状态,到此一个TCP连接就完成了。

四次挥手

因为TCP/IP 的连接是双向的,所以每个方向都要单独进行关闭。

每当TCP单方向的数据传输结束后,都会再发送一个 FIN 过去,告诉对方我这个方向上的数据要关闭了,当双方接收到FIN后,就会通知应用层,TCP连接已经终止了数据传输。

第一次断开:客户端向服务器端发送数据后,将 FIN置1,告诉它要关闭这一方向上的数据传输。

第二次断开:服务器接收到FIN后,将 ACK置1发送客户端

第三次断开:向客户端申请反方向的数据断开,将FIN置1。

第四次断开:客户端接收到服务器端发来的请求,将 ACK置1,双方同时关闭连接

套接字(Socket)

Socket是独立于具体协议的网络编程接口,在OSI模型中,主要位于会话层和传输层之间在Linux 下,套接字是一种特殊的IO接口,也是一种文件描述符。

Socket类型

流式套接字(SOCK STREAM)

提供了一个面向连接、可靠的数据传输服务,数据无差错、无重复的发送且按发送顺序接收。内设置流量控制,避免数据流淹没慢的接收方。数据被看作是字节流,无长度限制。

数据报套接字(SOCK DGRAM)

提供无连接服务。数据包以独立数据包的形式被发送,不提供无差错保证,数据可能丢失或重复,顺序发送,可能乱序接收。

原始套接字(SOCK RAW)

可以对较低层次协议,如IP、ICMP直接访问。功能强大但使用较为不便主要用于一些协议的开发

套接字相关函数

socket:创建一个套接字

函数

socket

头文件

#include <sys/socket.h>

#include <sys/types.h>

函数原型

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

功能

创建一个套接字

参数

1.domain:协议族。

   AF_INET

   AF_INET6 

2.type:协议类型

   SOCK_DGRAM,SOCK_STREAM,SOCK_RAW

3.protocol:指定应用程序使用的通讯协议,一般取值为0,让系统决定使用的协议。

返回值

成功:返回新建的套接字描述符;失败:返回-1。并将错误码放入 errno

bind:绑定一个套接字

函数

bind

头文件

#include <sys/socket.h>

#include <sys/types.h>

#inclue <netinet/in.h>

函数原型

int bind(int sockfd, struct sockaddr* addr, int addlen);

功能

绑定一个套接字

参数

1.sockfd:套接字描述符。  

2.addr:指向sockaddr结构体的指针,标识绑定的IP,端口,协议族等信息,

通常情况下使用另一个 结构体sockaddr_in

3.addlen:sockaddr结构体长度。

返回值

成功:返回0,  失败:返回 -1 错误存放在errno

htons,htonl,ntohs,ntohl:从主机字节序转换成网络字节序,或者相反

函数

htons,htonl,ntohs,ntohl

头文件

#include <netinet/in.h>

函数原型

uint32_t htonl(uint32_t hostlong);

uint16_t htons(uint16_t hostshort);

uint32_t ntohl(uint32_t netlong);

uint16_t ntohs(uint16_t netshort);

功能

htonl:把32位值从主机字节序转换成网络字节序;

htons:把16位值从主机字节序转换成网络字节序;

ntohl:把32位值从网络字节序转换成主机字节序;

ntohs:把16位值从网络字节序转换成主机字节序。

参数

1.hostlong:32位主机字节序的数据。

2.hostshort:16位主机字节序的数据。

3.netlong:32位网络字节序的数据。

4.netshort:16位网络字节序的数据。

返回值

已经转换好的数据

inet_addr,inet_ntoa:字符串转换为网络字节序,或者相反

函数

inet_addr,inet_ntoa

头文件

#include <netinet/in.h>

#include <arpa/inet.h>

函数原型

uint32_t    inet_addr(const char * cp);

char *       inet_ntoa(struct in_addr  in);

功能

inet_addr: 点分十进制地址字符串转换为32位网络字节序;

inet_ntoa:  将32位值从网络字节序转换成主机字节序的点分

                    十进制IP字符串;

参数

1.inet_addr的参数为点分十进制地址字符串方式IP信息;

执行成功,返回32位IP地址,并且是网络存储顺序;

2.inet_ntoa的参数为网络字节序的IP信息;

执行成功,返回主机字节序的点分十进制IP字符串;

返回值

已经转换好的数据

recvfrom:接收对方主机传送来的数据

函数

recvfrom

头文件

#include <sys/types.h>  

#include <sys/socket.h>

函数原型

int recvfrom(int sockfd, void *buf, int len,

        unsigned int flags, struct sockaddr *from, int *fromlen);

功能

用来由指定的socket接收对方主机传送来的数据.

参数

1.sockfd:标识一个套接字的描述符。

2.buf:接收数据缓冲区。

3.len:缓冲区长度。

4.flags:调用操作方式,一般设0。

5.from:[OUT]对方主机的网络地址

6.fromlen:对方主机地址sockaddr 的结构长度

返回值

成功:返回实际传送的字符数;失败:返回-1,错误原因存于errno 中

sendto:将数据由指定的socket传给对方

函数

sendto

头文件

#include <sys/types.h>  

#include <sys/socket.h>

函数原型

int sendto(int sockfd, void *buf, int len, unsigned int flags, struct sockaddr *to, int tolen);

功能

用来将数据由指定的socket传给对方主机

参数

1.sockfd:标识一个套接字的描述符。

2.buf:发送数据缓冲区。

3.len:实际发送的数据长度。

4.flags:调用操作方式,一般设0。

5.to:欲传送的网络地址,

6.tolen:sockaddr 的结构长度

返回值

成功:返回实际传送的字符数;失败:返回-1,错误原因存于errno 中。

setsockopt:设置套接字选项

函数

setsockopt

头文件

#include <sys/types.h>  

#include <sys/socket.h>

函数原型

int setsockopt(int sockfd, int level, int optname,

                      const void *optval, socklen_t optlen);

功能

设置套接字选项

参数

1.sockfd:标识一个套接字的描述符。

2.level指定控制套接字的层次.可以取三种值:
    1) SOL_SOCKET:   
通用(应用层)套接字选项.
    2) IPPROTO_IP:      IP
选项(网络层). 
    3) IPPROTO_TCP:  TCP
选项(传输层).

3. optname待设置套接字选项的名称。(取决于level)

4. optval选项的取值。(注意传递变量地址,变量中存储取值)

5. optlen选项值的长度

返回值

成功:0;失败:返回-1,错误原因存于errno

listen:监听,等待客户端连接

函数

listen

头文件

#include <sys/socket.h>

#include <sys/types.h>

函数原型

int listen(int sockfd, int backlog);

功能

监听,等待客户端连接

参数

1.sockfd:要监听的套接字描述符。

2.backlog:可排队连接的最大连接数

返回值

成功:返回0;失败:返回-1。并将错误码放入 errno

connect:建立与TCP 服务器的连接。

函数

connect

头文件

#include <sys/socket.h>

#include <sys/types.h>

函数原型

int connect((int sockfd, struct sockaddr* addr, int addlen));

功能

建立与TCP 服务器的连接。

参数

1.sockfd:客户端套接字描述符。

2.addr:服务器端的地址信息;

3.addlen:sockaddr结构的长度

返回值

成功:返回0;

失败:返回-1。并将错误码放入 errno

 accept:TCP 服务器接受客户端的连接请求。

函数

accept

头文件

#include <sys/socket.h>

#include <sys/types.h>

函数原型

int accept(int sockfd, struct sockaddr* addr, int* addlen);

功能

TCP 服务器接受客户端的连接请求。

参数

1.sockfd:服务器端套接字描述符。

2.addr:指向sockaddr结构指针,接收客户端IP信息;

3.addlen:sockaddr结构的长度

返回值

成功:返回一个新的套接字描述符,用它来和客户端通信

失败:返回-1。并将错误码放入 errno

send:向一个已经连接的套接字发送数据。

函数

send

头文件

#include <sys/socket.h>

#include <sys/types.h>

函数原型

size_t send(int sockfd, const void* buf, size_t len,int flags);

功能

向一个已经连接的套接字发送数据。

参数

1.sockfd:已连接套接字描述符。  

2.buf:数据缓冲区指针,用于存放要发送的数据

3.len:要发送数据的长度。

4.flags:调用执行方式,一般设为0

返回值

成功:返回发送的数据总数,

失败: -1 并将错误码放入 errno

recv:从一个已经连接的套接字接收数据。

函数

recv

头文件

#include <sys/socket.h>

#include <sys/types.h>

函数原型

size_t recv(int sockfd,  void* buf, size_t len,int flags);

功能

从一个已经连接的套接字接收数据。

参数

1.sockfd:已连接套接字描述符。  

2.buf:数据缓冲区指针,用于存放接收到的数据

3.len:数据缓冲区的长度。

4.flags:调用执行方式,一般设为0

返回值

成功:返回接收的数据总数,

            0: 代表客户端断开连接

失败: -1 并将错误码放入 errno

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

微信小程序跳转其他小程序以及跳转网站

一、跳转其他小程序 1.1 知道appid和页面路径 wx.navigateToMiniProgram({appId: appid, // 替换为目标小程序 AppIDpath: pathWithParams, // 小程序路径envVersion: release, // 开发版、体验版或正式版success(res) {console.log("跳转到其他小程序成功&#xff01;&q…

3D 生成重建030-SV3D合成环绕视频以生成3D

3D 生成重建030-SV3D合成环绕视频以生成3D 文章目录 0 论文工作1 论文方法2 实验结果 0 论文工作 论文提出了Stable Video 3D (SV3D)——一个用于生成围绕三维物体的高分辨率图像到多视角视频的潜在视频扩散模型。最近关于三维生成的文献提出了将二维生成模型应用于新视图合成…

AR眼镜_消费级工业AR智能眼镜主板硬件解决方案

AR眼镜的研发是一项复杂的软硬件集成工程&#xff0c;它需要在摄影、音频、交互和连接等多个方面提供卓越的基础体验&#xff0c;因此产品的每个细节都显得尤为重要。 在设计AR眼镜时&#xff0c;重量、体积和散热性能都是必须认真考量的关键因素。在芯片平台的选择上&#xff…

类和对象一

目录 1.类的引入 2.类的定义 3.访问限定符 4.类的作用域 5.类对象模型 6.类的大小 1.类的引入 C语言结构体中只能定义变量&#xff0c;在C中&#xff0c;结构体不仅可以定义变量&#xff0c;也可以定义函数。 C兼容C语言&#xff0c;结构用法可以继续使用 同时sruct也升…

AcWing 906. 区间分组

文章目录 前言代码思路 前言 前面两个都是右端点排序&#xff0c;这个我又是无脑右端点排序&#xff0c;直接 wa 了。哭。感觉反正做什么事情都不要太着急&#xff0c;心平气和地做还是比较好。没什么大不了的。考点统计 代码 #include<bits/stdc.h> using namespace …

用拉普拉斯变换的方差算法实现相机自动对焦

使用拉普拉斯变换的方差来计算图像的清晰度的主要原因是拉普拉斯算子可以有效检测图像的边缘和高频细节。图像的清晰度与边缘强度和高频分量的丰富程度密切相关,以下是更详细的解释: 1. 拉普拉斯算子的作用 拉普拉斯算子是一种二阶导数算子,定义为: 它可以在图像中检测快…

非文件形式的内存动态函数库调用接口

使用memfd的系统调用接口将动态库加载到proc虚拟文件系统&#xff0c;提供的fd为进程持有的句柄&#xff0c;通过dlopen的path指向此句柄&#xff0c;即可实现非文件系统加载动态链接库。 文章目录 一、memfd_create二、dl_open三、示例参考 一、memfd_create 接口名称int mem…

SpringBoot 开源停车场管理收费系统

一、下载项目文件 下载源码项目文件口令&#xff1a; 【前端小程序地址】(3.0)&#xff1a;伏脂火器白泽知洞座/~6f8d356LNL~:/【后台管理地址】(3.0)&#xff1a;伏脂火器仇恨篆洞座/~0f4a356Ks2~:/【岗亭端地址】(3.0)&#xff1a;动作火器智汇堂多好/~dd69356K6r~:/复制口令…

计算生成报价单小程序系统开发方案

计算生成报价单小程序报价系统&#xff0c;是根据商品品牌、类型、型号、规格、芯数、特性、颜色、分类进行选择不同的参数进行生成报价单&#xff0c;要求报价单支持生成图片、pdf、excel表格。 计算生成报价单小程序系统的主要功能模块有&#xff1a; 1、在线生成报价单&…

当 webclient 返回复杂json, 但是我只需要其中几个字段的解决方案

当 webclient 返回复杂json, 但是我只需要其中几个字段的解决方案: Spring 的 WebClient 使用 Jackson 作为默认的 JSON 序列化和反序列化工具&#xff0c;可以轻松将 JSON 映射为对象。

【C/C++】指针相关题目(个人笔记)

我们来详细分析这个C程序的执行流程&#xff0c;并预测它的输出结果。 首先&#xff0c;看一下程序的代码&#xff1a; #include <stdio.h>void main() {int a {1, 2, 3, 4};int *p;p &a;printf("%d ", *p);printf("%d\n", *--p); } 接下来&a…

在算网云平台云端在线部署stable diffusion (0基础小白超详细教程)

Stable Diffusion无疑是AIGC领域中的AI绘画利器&#xff0c;具有以下显著优势&#xff1a; 1、开源性质&#xff0c;支持本地部署 2、能够实现对图像生成过程的精确控制 虽然SD在使用上有很多的有点&#xff0c;但缺点也是不言而喻的&#xff0c;由于AI绘画的整个过程以及现…

初次使用uniapp编译到微信小程序编辑器页面空白,真机预览有内容

uniapp微信小程序页面结构 首页页面代码 微信小程序模拟器 模拟器页面为空白时查了下&#xff0c;有几个说是“Hbuilder编译的时候应该编译出来一个app.js文件 但是却编译出了App.js”&#xff0c;但是我的小程序结构没问题&#xff0c;并且真机预览没有问题 真机调试 根据defi…

【工业机器视觉】基于深度学习的仪表盘识读(读数识别)(1)

前言 本文旨在详述机器视觉技术在水表自动化读数领域的应用&#xff0c;具体聚焦于通过深度学习与传统图像处理方法相结合的方式&#xff0c;实现对仪表盘上字轮数字及指针位置的精准识别。在此基础上&#xff0c;通过对指针角度的分析进行初次读数校正&#xff0c;并利…

C语言数据结构作业

一、在堆区空间连续申请5个int类型大小空间&#xff0c;用来存放从终端输入的5个学生成绩&#xff0c;然后显示5个学生成绩。再将学生成绩升序排序&#xff0c;排序后&#xff0c;再次显示学生成绩。显示和排序分别用函数完成。 要求&#xff1a;用malloc和free完成。 二、课程…

C—指针初阶(2)

如果看完阁下满意的话&#xff0c;能否一键三连呢&#xff0c;我的动力就是大家的支持与肯定&#xff0c;冲&#xff01; 二级指针 我们先看概念以及作用&#xff1a;用来存放一级指针的地址的指针 先看例子&#xff0c;我们逐一分析 我们先分析上面那个“1” 标注那里&#x…

成立北京高途公益基金会,陈向东用爱点亮教育公益新征程

12月10日&#xff0c;北京高途公益基金会正式成立。本次成立仪式在京举办&#xff0c;以“用爱点亮”为主题&#xff0c;吸引了来自教育、公益慈善、媒体等领域的200多名嘉宾参加。 活动中&#xff0c;北京高途公益基金会与北京师范大学教育基金会签署了战略合作协议&#xff…

C# winfrom 窗体简单加载框实现详解

文章目录 前言一、为什么需要加载框&#xff1f;二、简单加载框的实现方式2.1 使用模态对话框作为加载框2.2 结合BackgroundWorker和加载框实现更好的效果2.3 加载动画 三、延伸内容3.1 自定义加载框样式3.2 使用第三方控件实现加载框 结束语优质源码分享 C# winfrom 窗体简单加…

第三十九篇——条件概率和贝叶斯公式:机器翻译是怎么工作的?

目录 一、背景介绍二、思路&方案三、过程1.思维导图2.文章中经典的句子理解3.学习之后对于投资市场的理解4.通过这篇文章结合我知道的东西我能想到什么&#xff1f; 四、总结五、升华 一、背景介绍 数学中的概率&#xff0c;看似和我们的生活没关系&#xff0c;其实它却是…

Leetcode 每日一题 202.快乐数

目录 题意 算法思路 过题图片 算法实现 代码解析 复杂度分析 题目链接 结论 题意 判断正整数 n 是不是快乐数。 快乐数定义&#xff1a; &#xff08;1&#xff09;每次将正整数替换为它每个位置上的数字的平方和。 &#xff08;2&#xff09;重复这个过程直到这个数…