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

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【数据库】选择题+填空+简答

1.关于冗余数据的叙述中&#xff0c;不正确的是&#xff08;&#xff09; A.冗余的存在容易破坏数据库的完整新 B.冗余的存在给数据库的维护增加困难 C.不应该在数据库中存储任何冗余数据 D.冗余数据是指由基本数据导出的数据 C 2.最终用户使用的数据视图称为&#xff08;&…

unity3d—demo(实现给出图集名字和图片名字生成对应的图片)

目录 实现给出图集名字和图片名字生成对应的图片&#xff1a; 代码示例&#xff1a; dic: 键 是图集名称 值是一个字典 该字典键是图片名称 值是图片&#xff0c;结构如图&#xff1a; 测试代码&#xff1a; 结果&#xff1a; SpriteRenderer 讲解&#xff1a; Resour…

jmeter 提取数据写入文件

BeanShell PostProcessor FileWriter file new FileWriter("E:\\IOT\\cui家庭中心\\v3.8.0\\123.txt",true); BufferedWriter out new BufferedWriter(file); out.write(vars.get("localKey")"\n"); log.info("到这里了吗"); out.c…

Linux多进程开发-常用命令

进程 进程是计算机中正在运行的程序的实例。每个进程都有自己的地址空间、内存、文件和设备、线程以及其他系统资源。操作系统通过调度和管理进程来实现多任务处理&#xff0c;使得多个进程可以同时运行并与用户交互。在操作系统中&#xff0c;进程是基本的资源分配单位&#x…

Linux下nginx环境的搭建

1.Nginx的下载 nginx官网&#xff1a;nginx: download nginx的工作原理请移步&#xff1a; 2.nginx安装 2.1.上传文件 将nginx包上传到 /usr/local/src 下 如果你没有使用xftp的话&#xff0c;使用 rz -y 命令上传 下载依赖&#xff1a; yum install lrzsz 输入命令 r…

支持图像和视频理解多模态开源大模型:CogVLM2 CogVLM2-Video

CogVLM2和CogVLM2-Video是新一代的开源模型&#xff0c;支持图像和视频理解&#xff0c;具有显著的性能提升。最近发布的更新包括CogVLM2论文的发表、在线演示和对视频理解的支持&#xff0c;能够处理最多1分钟的视频。新模型支持中英文&#xff0c;文本长度可达8K&#xff0c;…

vue中验证码的实现方式

在写登录页的时候有的系统会让你也进行一下验证码绘制&#xff0c;那么验证码如何实现的呢&#xff1f;我在写登录页的时候通过将登录框&#xff0c;验证码分开页面来写&#xff0c;最后将它们变成标签来导入到我的样式页面中&#xff0c;这样写不仅方便&#xff0c;更容易修改…

Java多进程多线程处理文件

Java多进程多线程处理文件 在现代软件开发中&#xff0c;处理大量或大型文件是一个常见挑战。Java提供了多种机制来处理文件&#xff0c;包括单线程和多线程方式。本文将深入探讨如何使用Java中的多进程和多线程技术来提高文件处理的效率和性能。 目录 引言Java中的进程与线程…

网页核心页面设计(第5章)

一、登录页面 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-widt…

前端成长之路:HTML(2)

HTML中有两个非常重要的标签——表格和表单&#xff0c;在介绍之前需要先了解表格和表单的区别&#xff1a;表格是用于展示数据的&#xff1b;表单是用于提交数据的。本文主要介绍表格。 表格标签 表格主要是用于显示、展示数据的&#xff0c;并非是页面布局。它可以使本来难…

Leecode刷题C语言之骑士拨号器

执行结果:通过 执行用时和内存消耗如下&#xff1a; 代码如下&#xff1a; #define MOD 1000000007int knightDialer(int n) {int moves[10][4] {{4, 6, -1, -1},{6, 8, -1, -1},{7, 9, -1, -1},{4, 8, -1, -1},{3, 9, 0, -1},{-1, -1, -1, -1},{1, 7, 0, -1},{2, 6, -1, -…

HTML颜色-HTML脚本

HTML脚本 js使得HTML页面具有更强的动态和交互性 HTML<script>标签 标签用于定义客户端脚本&#xff0c;比如javascript 可包含脚本语句&#xff0c;也可以通过src属性指向外部的脚本文件 JavaScript最常用于图片操作&#xff0c;表单验证以及动态的内容更新 HTML<n…

【sgUploadImage】自定义组件:基于elementUI的el-upload封装的上传图片、相片组件,适用于上传缩略图、文章封面

sgUploadImage源码 <template><div :class"$options.name"><ul class"uploadImages"><liclass"uploadImage"v-loading"loadings[i]"v-for"(a, i) in uploadImages":key"i"click"click…

Ubuntu 22.04加Windows AD域

说明&#xff1a;   Ubuntu 22.04系统通过realmd&#xff0c;sssd加入到 Active Directory 域&#xff0c;并为域用户配置sudo权限。同时为方便用户使用为Ubuntu系统安装wps与sogou中文输入法。 1. Ubuntu 22.04加入Windows AD域 1.1 首先配置网络&#xff0c;Ubuntu系统能…

视频中的某些片段如何制作GIF表情包?

动态表情包&#xff08;GIF&#xff09;已经成为我们日常沟通中不可或缺的一部分。GIF&#xff08;Graphics Interchange Format&#xff09;&#xff0c;即图形交换格式&#xff0c;是一种支持多帧图像和透明度的位图文件格式。它最初由 CompuServe 公司在 1987 年推出&#x…

JavaWeb学习--cookie和session,实现登录的记住我和验证码功能

目录 &#xff08;一&#xff09;Cookie概述 1.什么叫Cookie 2.Cookie规范 3.Cookie的覆盖 4.cookie的最大存活时间 ​​​​​​&#xff08;Cookie的生命&#xff09; &#xff08;二&#xff09; Cookie的API 1.创建Cookie&#xff1a;new 构造方法 2.保存到客户端浏…

MySQL Binlog 日志监听与 Spring 集成实战

MySQL Binlog 日志监听与 Spring 集成实战 binlog的三种模式 MySQL 的二进制日志&#xff08;binlog&#xff09;有三种常见的格式&#xff1a;Statement 模式、Row 模式和Mixed 模式。每种模式的设计目标不同&#xff0c;适用于不同的场景&#xff0c;以下是它们的详细对比和…

Android上运行OpenCV(Android Studio)

用Android Studio的话&#xff0c;整体来说没什么难的&#xff0c;照着教程来做就好了。 【OpenCV】OpenCV库的安装 - Android与OpenCV系列教程_哔哩哔哩_bilibili 主要就是导入module&#xff0c;然后加入依赖。代码只有几行。 if(OpenCVLoader.initLocal()){Toast.makeText(…

VLDB 2024 | 时间序列(Time Series)论文总结

VLDB 2024于2024年8月26号-8月30号在中国广州举行。 本文总结了VLDB 2024有关时间序列&#xff08;time series data&#xff09;的相关论文&#xff0c;主要包含如有疏漏&#xff0c;欢迎大家补充。 时间序列Topic&#xff1a;预测&#xff0c;分类&#xff0c;异常检测&…

TongWeb7-东方通快速使用手册

TongWeb7-东方通 快速使用手册 文章目录 第1章 TongWeb7 产品介绍 1.1 概述1.2 规范支持 第2章 TongWeb7 安装 2.1 TongWeb7 安装要求 2.1.1 TongWeb7 支持的操作系统2.1.2 系统要求2.1.3 其他 2.2 安装TongWeb72.3TongWeb7 目录结构说明2.4 TongWeb7 的启动和停止 第3章 应用…