最后更新:2022-04-14 19:45
网络编程知识点概览
========================================
1.核心知识点
运输层的两项关键议定书。
tcp协议:
tcp理论
tcp Linux 中的通信流量和界面功能
tcp单播(点播)
tcp双向通信
tcp广播
udp协议
与乌龟有关的理论理论思想
Linux udp 通信和界面功能的流动
单向和双向乌迪通信
多路复用
Tcp对Udp 三 四 五握手
2.引入网络编程
温故知新
程序间通信:mkfifo信号管道(违约反应行动),这是第一次采取反应行动,杀戮和信号/信号/信号和吸附改变了反应。忽略信号,信号音量( semget semctl semop) 共享内存( shmget shmdt shmctl) 信件队列( msggsnd msgrecv msgctl)
以下所有通信方式只能在同一主机上进行。
网络编程是同一主机内或各主机之间各进程之间沟通的另一种方法。
网络中基本概念
========================================
1.网络模型
网络模式:为了更好地了解网络的通信进程,网络的通信进程被人为地分为多个层次。
通讯规程是电脑科学家设计的游戏规则
例如,考虑经典的战场通讯协议: 敌人来了, 烟雾。
HTTP协议是计算机网络中使用最广泛的通信协议之一。
FTP 协议。 传输文件的协议 。
电信协议 远程着陆协议
路径:确定网络数据传输的最佳方式(使用专门方法这样做)。
有两种典型的网络模式:
其中第一个是OSI七层模型。
启用应用层:一些议定书必须用来构建具体应用。
比如:HTTP协议
FTP 协议。 传输文件的协议 。
电信协议 远程着陆协议
会话层启用: 创建会话、 加密数据、 解密
显示层的效果包括数据包装和分析 http 协议(超文本传输协议)、 ftp 协议(文件传输协议) 和 Tonnet 协议(远程登录 ) 。
传输层激活:解决使用 tcp 和 udp 协议在网络中传输数据的问题。
激活网络层(平层):解决线路问题(数据传输的最佳方法)ip协议
启动数据链层:网页卡驱动器应更多地了解这一级别的协议。
物理层、网络接口和实际净卡都是网络组成部分的例子。
第二,考虑TCP/IP模式。
它以七层OSI模型为基础。
应用层(应用层、届会层、总共三层)
传输层
网际层
网络界面层(将数据连接和物理层结合起来)
2.MAC地址
您的物理互联网卡有 世界上一个独一无二的地址。
地址协议族
IP地址分为两类:IPV4和IPV6。
IPV4
例如,32位位数的IP地址:(表示小数点IP,三个小数点分为四节,每个段各一个字节,小数点不消耗存储空间,只写标签)
IPV6
为解决缺少IPV4地址、扩展号、128个地点的问题
3.端口号
作用:区分在同一主机上运行的不同网络进程。
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
程序员可以自己选择港口号,但不能在1024年内使用港口号,因为操作系统在1024年内占用了许多港口号。
误解:港口号是程序ID吗? 不,它们是两个截然不同的想法。
tcp协议的通信程序和接口功能
========================================
一. 通讯程序/tcp协议程序
客户端的流程
建立套接字, 绑定您的 IP 和端口号, 连接到服务器, 发送信件, 然后关闭软件包 。
服务器的流程
构建套件 -- 键入您自己的 IP 和端口号 -- -- 听 -- 接受客户客户端连接请求 -- -- 发送和接收数据 -- -- 退出软件包
2.相关的接口函数
(1) 创建tcp插座 -- -- 购买手机
#include <sys/socket.h>
int socket(int domain, int type, int protocol);
成功作为回报值
失败 -1
域域确定地址组的类型 。
AF_INET IPv4 地址组
AF_INET6 是一个 IPv6 地址组 。
类型 - 绑带类型
SOCK_STREAM TCP TCP 套接字/数据流套接字/ Screen 套接字
SOCK_ DGRAM udp Socketes/ 数据集
议定书 - 议定书延期,一般设置 0 忽略
(2) 连接知识产权和港口号
#include <sys/socket.h>
//pv4 或 ipv6 在 bint 中( 嵌入锁, const streaddr* addrad, socklen_t addrage_ len) ;
假设: int bint( 嵌入锁, 连接规则 stockaddr_ in * address, socklen_ t addr_ len) ); / 限制: int bint (嵌入锁, 连接规则 stockaddr_ in * address, socklen_ t addr_ len) ;
假设: int bint( 嵌入锁, 连接规则 stockaddr_ in6 * 地址, 索克伦_ t 地址_ len); / 限制: int bint( 嵌入锁, 连接规则 stockaddr_ in6 * 地址, 索克伦_ t 地址_ len) ;
0 已成功返回返回值 。
失败 -1
Socket - 随同文件描述符是一个参数 。
地址 -- -- 用于持有装订所需的IP和端口号(你自己的IP和端口号)。
IPv4和IPv6兼容通用地址结构
{
无签名短 sa_ family; / AF_ INET 或 AF_ INET 6 地址协议类型
Char sa_ data [14]; // 保存 IP 和端口号
}
创建 sockaddr_ in/ / ipv4 地址结构( 用于持有 IPv4 地址 ) 。
{
sin_ famiter; // AF_INET 仓库协议
以_addr sin_addr; // 用于存储 IPv4 地址以绑定的 IPv4 地址的结构结构
sin_port; // 保存您想要绑定的端口号 。
}
struct in_addr
{
in_addr_t s_addr; / 最终用于持有绑定所需的 pip 地址
}
创建 sockaddr_ in6 //ipv6 地址结构( 用于持有 IPv6 地址) 。
{
}
地址 - 地址结构的长度、 大小
(3) 地址和港口号转换 - 大小
字节顺序 : 这里指数据如何储存在计算机内存中, 计算机内存分为两个大小端。
各种操作系统使用的字节顺序不同。
例如,Ubuntu使用一个简单的序列。
通过计算机网络发送的数据以大端序列存储。
大顺序:高位数数据储存在低位数,低位数数据储存在高位数。
短顺序:高字节数据存储在高地址,低字节数据保存在低地址。
小顺序被称为主机字节顺序。
“网络字节顺序”一词指大端序列。
3.11 大序列序列的序列
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
in_addr_t inet_addr(const char *cp);
转换的长端序列(网络字节顺序)以返回值返回。
字符串 ip (小端序列 pp/主机字节顺序)(参数: cp-)
int inet_aton(const char *cp, struct in_addr *inp);
下列数值被返回: 成功 0 失败 - 1
Stringiip 参数: cp --)
大型端 英寸 - - - 由 英寸 - 储存转换产生的序列
代码参考:inet_aton("192.168.22.9",&(bindaddr.sin_addr));
三.2 将小端序列港号转换成大端序列港口号
uint16_t htons(uint16_t hostshort);
h -->host n -->network s -->short
返回值:转换后的大端序列端端号。
hustshort -- -- 短端口号
3.3 三个等级与小等级之间的顺序
char *inet_ntoa(struct in_addr in);
用于字符串格式的 p p,作为返回值的小端序列
参数: 英寸- " 长尾序列 "
三.4 将大端序列港号转换成小端序列港口号
uint16_t ntohs(uint16_t netshort);
(4) 联系女友 -- -- 联系服务器
#include <sys/socket.h>
int connect(int socket, const struct sockaddr *address, socklen_t address_len);
返回值: 成功 0
失败 -1
地址 - 储存彼此的(服务器) ip 和 端口号
(5)监听
int listen(int socket, int backlog);
返回值:成功 0
失败 -1
Socket - 随同文件描述符是一个参数 。
积压——有多少情侣可以同时连接我?
//允许最多5位情人(客户)同时与我(服务器)连接。
(6) 准备答复 -- -- 接受客户连接请求
int accept(int socket, struct sockaddr *address,socklen_t *address_len);
返回值( 焦点、 焦点、 焦点): 成功交付了一个新的套接字文件配置配置文件 。
新的合成是必要的, 因为服务器必须识别不同的客户端 。
一旦每个客户端连接到服务器, 接受返回新套接字 。
失败 -1
Socket - 随同文件描述符是一个参数 。
追踪对方(客户)的IP和端口号码。
地址 - len - 地址大小; 需要针头 。
概括接受函数的特性。
特性1: 如果客户端与服务器没有连接, 服务器将总是屏蔽接收位置 。
如果客户端成功连接到服务器, 接受时不会屏蔽客户端 。
特征2:客户连接成功,接受的方法将成功的客户信息(ip和端口号)自动存储到第二个参数。
(7)收发信息
tcp 使用两组功能传送信息,既可用于接收也可用于发送信息。
第一组:传统读/写
第二组:对相同的函数,使用 recrov/ send read和 reciv。
发送信息
ssize_t send(int socket, const void *buffer, size_t length, int flags);
以返回值成功交付的字节
失败 -1
参数:前三个参数与写作参数相同。
默认设置为 0 的标记 -- 默认设置为 0
接收信息
ssize_t recv(int socket, void *buffer, size_t length, int flags);
收到作为返回值的字字节数
"0 -"不再连接。
失败 -1
前三个参数与阅读参数完全相同。
默认设置为 0 的标记 -- 默认设置为 0
遇到的问题
========================================
一种.ubuntu装置不熟悉ubuntu装置
Ubuntu 配置两种最常用的 ubuntu 方法:
方法一:图形用户界面设置
详细配置见截图
方法二:更改配置配置
使用 vim/ etc/ network/ interface 打开此文件
如果使用静态 IP 地址, Linux 网络将被设置为连接模式 。
(1) 查阅/etc/网络/接口文件。
在案文后插入以下句子(静态)。
auto ens33
设置静态 IP Iface ens33 inet 状态
配置 IP 地址 / / 地址 / 地址 / 地址 / 地址 / 地址 / 地址 / 地址 / 地址 / 地址 / 地址
网关 / 网关配置
子网遮罩/Netmask
dns-nameservers//域名服务器
打开文件//etc/resolv.conf。
创建您自己的 DNS 服务器地址 。
(2)重启网络
sudo /etc/init.d/networking force-reload
sudo /etc/init.d/networking restart
如果 IP 地址是动态的, 请以 NAT 模式配置 Linux 网络 。
(1) 查阅/etc/网络/接口文件。
在本文件之后插入以下句子(事态发展)。
auto ens33
Iface ens 33 inet dhcp// 配置动态
你不再需要写它了。
两张债券断了 这个问题还在地址里
问题一:
Cannot assign requested address
原因是这无疑是你的IP地址 是不对的
解决方法:
方法一:在代码中,将ip地址改为正确的ip地址。
方法二: Linux 包含一个 INADR_ANY 宏定义, 以自动配置本地主机上的任何 IP 地址 — 使用函数 htonl () 进行自适应 。
原型函数: 昆特32_t htonl (昆特32_t hostalong);
我不知道你在说什么,sin_addr.s_addr=inet_addr (),写一个:使用指定的 ip 地址绑定 。
写入 2: 没有指定 IP 绑定 。 我不太清楚您的意思, sin_ addr. s_addr=htonl (INADR_ANY) 。
问题二:
Address already in use
其原因是Ubuntu系统有一个机制,如果您的程序意外关闭,则不会立即发布港口号(将推迟约30秒)。
解决方法:
方法一:等待30秒不是一个好主意。
方法二:修改代码(主函数交叉引用),然后修改端口号 — — 稍好一些。
方法三:使用Setsockopt () 方法告诉设置要继续重复端口号 。
int setsockopt(int socket, int level, int option_name,const void *option_value, socklen_t option_len);
比如:
int on=1;
setsockopt(tcpsock,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on));
请记住,该代码只能在套接字后和捆绑前使用。
本文由 在线网速测试 整理编辑,转载请注明出处。