最后更新:2021-12-27 20:35:09 手机定位技术交流文章
1. 网络结构模型
2. 专业网络方案拟订术语:插座/插座/插座/插座号
3. TCP和UDP是网络方案规划通信议定书。
4. 网络编程 IO 模式包括阻塞 IO、解除阻塞 IO、多路线和信号驱动。
5. 需要很长时间的数据接受方法
一. 系统持续方案拟订过程的通信模式
1、管道
管道写入读取未命名的管道( 仅用于亲子关系)
--mkfifo 未知管道(系统中任何两个进程)
2、信号
发送要杀死的信号
-- -- -- 信号没收-信号没收-信号没收-信号没收-信号没收-信号没收-信号没收-信号没收
3、IPC对象
信件 Quue - 带有数据标记 ftok () mggsnd msgrcv msgctl msgctl msgctl msgctl msgctl msgctl msgctl msgctl msgctl msgctl msgctl msgctl msgtl msgtl msgtl
共享内存意味着两个进程可以同时读写到相同的内存 。
信号音量不是一个通讯介质, ftok semget semop semctl
特点:
我们只能在同一主机上相互沟通,无法穿越平台。
二. 网络编程(有时称为套接字编程)是一种计算机编程。
1、特点
在同一主机主机主机内和主机之间可以进行通信。
Ubuntu - Ubuntu - Ubuntu - Ubuntu - Ubuntu - Ubuntu - Ubuntu - Ubuntu - Ubuntu - Ubuntu - Ubuntu - Ubuntu - Ubuntu - Ubuntu - Ubuntu - Ubuntu - Ubuntu - Ubuntu
您自己的 Ubuntu - 同一网络上任何其他服务器, 除了您自己 。
同样的局域网是网络通信的基础。
2、协议
双方在东道国之间进行沟通时,必须遵守同一套规章。
Apanet( arpanet)
网络控制方案 网络控制方案 网络控制方案 网络控制方案 网络控制方案 网络控制方案 网络控制方案 网络控制方案 网络控制方案 网络控制方案 网络控制方案 网络控制方案 网络控制方案 网络控制方案 网络控制方案 网络控制方案 网络控制方案 网络控制方案 网络控制方案 网络控制方案 网络控制方案 网络控制方案 网络控制方案 网络控制方案 网络控制方案 网络控制方案
缺陷:无法连接到许多类型的计算机和操作系统,没有纠正功能。
互联网互联网
由于阿帕网(arpanet)的局限,所以在其基础上扩展 研发出了 互联网互联网,并且引入了TCP/IP协议。
TCP/IP(转让控制议定书/因特网议定书、转让控制议定书/因特网议定书)是指允许通过各种网络发送数据的一套议定书。
TCP/IP协议不仅包括TCP和IP协议。它汇集了资金转拨方案、SMTP、TCP、UDP、IP等等。由于TCP和IP在TCP/IP协议中最为普遍,因此,它被称为TCP/IP议定书。
三、计算机联网系统结构
1、概念
它是指主机的内建结构以及协议层层的组合。
每个主机的网络结构是相同的 。
2、作用
数据封装和数据解析
3、分类
标准化组织/OSSI
TCP/IPP参考模式
四、标准化组织/OSSI (七层)
1、概念
OSI从逻辑上,网络系统分为七个有条不紊、功能不同的子系统。因此,OSI结构由7个层次组成,一般在职能上是独立的。如下图所示。其中包括物理层、数据链接层、网络层、传输层、谈话层、表达式层和应用层。

确定应使用哪些API接口在层层一级处理这一数据。
表达层负责数据压缩和降压,以及加密和解密。
届会层负责获取验证和通信,以构建TCP会议。
控制并检测传输层、TCP协议、UDP协议的数据传输故障
网络层:主要是用于确定网络中不同主机的IP协议。
数据链层:1 - 将数据转换成数据块,即数据字符串(将数据页眉和结尾添加到数据块)
物理层:物理数据传输介质(通信渠道)、以太网接口
TCP/IP模式取代了在数据处理方面效率低下的OSI参考模式。
此外,还有其他互联网专用术语:数据、部分、包件、框架和比特。
如果去除封装:数据的最上层,数据就是应用级别协议生成的数据,例如网页、视频和音乐的存取,所有这些都可称为应用级别数据,计算机操作系统根据具体条例将应用级别数据传送到下一个传输层次。
我们所看到的传输层数据被称为“线段 ”, 意思是中文部分。 在这个层次上, 数据将被添加到 TCP 或 UDP 头上, 并转换成应用程序专用数据 。 操作系统区分了使用 TCP 或 UDP 端口号的各种应用程序 。
当数据再次向下移动时, 它会变成一个包, 意思是“ 包 ” 。 在这个级别上, 段会添加到 IP 头信息中, 然后在三楼传递, 三楼的路由器功能会发送基于目的地 IP 地址的“ 包 ” 。
在底部,数据与MAC地址信息合并,名称改为框架,即框架。在这个层次上,是开关的世界,通常寻找MAC地址列表项目传输匹配框架。
MAC地址百科全书链接:MAC地址百科全书(baidu.com),这是我们对2011年埃及抗议的特别报道的一部分。
网络的包装和拆散:


五. TCP/IP议定书范本(4楼)
1、层次
使用的图层:Telnet、FTP和HTTP。
TCP UDP是转移层。
IPCMP是互联网层使用的两项议定书。
网络接口层:以太网
2. 每个过层增加一层头数据,当数据相互连接时,处理一层头数据。
传输层议定书:TCP议定书、上一个模式中的UDP议定书(重点)
六、研究传输层协议
TCP(电话)协议
1、概念
转让控制协议(TCP)用于查明网络通信中的问题。Transmission Control Protocol)。这是一项以连接为导向的传输层议定书。它能够提供高可靠性的通信(即准确、不丢失、不顺序、不重复的数据)。
2、应用场合
(1) 需要高质量的传输质量和大量数据传输的通信
(2) 在需要可靠的数据传输时,往往采用TCP协议。
3) 基于TCP的用户登录账户管理能力,用于和其他通信工具。
UDP(写信)
1、概念
用户数据报告协议(UDP, UDP, Usepher Datagram Protocol)。这是一个不可靠和没有连接的协议。由于不需要连接,在数据传输之前,有效的数据传输是可行的。
2、应用场合
1)发送小尺寸数据
(2) 适用于通信广播/组织
3)qq 实例包括通信软件、点对点通信、文本对通信和视听通信。
七. 一些重要的网络编程构想(范围编程、套接式编程)
1、socket
有许多类型的插头、插头、插头以及许多协议,必须提前建立。
1) 是一个已编程的合成功能界面。
2) 无论您是否使用 TCP 或 UDP 协议, 您必须首先使用套接字来确定 。
例如,我们目前正在使用TCP议定书。
套接字文件描述符套接字表示套接字( TCP 协议) 。
int fd = open; -- 标准文件: int fd = open;
3) 套接字是一种文件描述符类型 。
2、IP地址
1、概念
它用于识别网络上的各种主机。通信需要IP地址。
2、分类
IPV4:32 IPV6:128
3、如何表示
网络号(Netline192)。 14+主机(2)
(4) 数据包必须包括目的地IP地址和源IP地址。
3. 港号(16位数无符号的整数)
1、概念
同一主机上有不同的应用程序。
2、字节序
1)、概念
保存数据的多字节存储器的低位址是高或低,白色,表明数据如何储存在计算机内存中。
2)、分类
小顺序:低值数据存储在低地址的内存中。
大顺序:存储在内存、高地址的低数据价值
3) 建立网络字节序列,以避免由于数据交换期间的字节序列不同而造成不同类型主机之间的错误。也就是说,所有主机都必须将整个网络的数据集传送到大顺序,即网络字节顺序。
网络字节序列必须很长 。
本地字节序列因主机 x86 是小还是大而不同。
简言之,无论您目前的电脑是大是小, 您都必须将字节序列转换成网络字节顺序, 也称为大顺序, 才能将数据传送到网络中 。
八、TCP通信过程
客户端通信:
1. 购置移动电话(合成制造)
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
int socket(int domain, int type, int protocol);
创建套接字是一个函数。
参数:
域 : 您要使用哪个地址?
IPv4 网络协议(PF_INET/AF_INET)
IPv6 网络议定书 PF_INET6/AF_INET6
你喜欢哪一种协议?
SOCK_STREAM - TCP 流流线套接字
SOCK_ DGRAM - UDP 数据子集
协议:默认设为0。
返回值:
成功返回了套接字文件描述符 。
失败 -1
2. 把自己的电话号码(连同你的IP地址和端口号)绑起来。
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
参数:
Sockfd 代表 Sockket 文件描述符 。
Addr: 您自己的 IP 地址和端口号
升温: 结构大小
返回值 :
成功则返回 0,
返回失败 - 1, 错误错误
sruct sockaddr - 上一个结构
{
空空未签名 sa_ family; / * 地址地址*/
Char sa_ data [14];/*14 字节协议地址,包括套接字的IP地址和端口号。 */
; / IPV4 结构
struct sockaddr_in
{
IPV6*//
* 端口号* /; 未签名的短号 sin_port;
* IP 地址* / Scruct in_addr sin_addr;
无符号字符sin_ zero[8]; / * 填充 0 以保持与 sruct sockadr* 相同的大小 。
};
struct in_addr {
in_addr_t s_addr; / *in_addr_t to 32-bit unt 符号, 其中有一个大字节顺序 。 */
};
3. 开始打电话(建立连接)
#include <sys/socket.h>
int connect(int socket, const struct sockaddr *address,socklen_t address_len);
参数:
Sockfd 代表 Sockket 文件描述符 。
地址:对方方的IPIP地址和端口号
地址:结构的大小。
4、聊天
#include <sys/socket.h>
ssize_t send(int socket, const void *buffer, size_t length, int flags);
参数:
Sockfd 代表 Sockket 文件描述符 。
缓冲: 这是您想要传送的数据 。
长度: 您想要发送的数据数量 。
普通 0 国旗
返回值:
所提供的字节数已正确退还。
失败返回 -1
5、关闭
close(socketfd);
服务器 :
3. 设定铃声铃响(摇摇)
#include <sys/socket.h>
int listen(int socket, int backlog);
参数:
Sockfd 代表 Sockket 文件描述符 。
积压: 同时处理尽可能多的客户端连接 。
4. 我在打电话(防止与客户联系)
#include <sys/socket.h>
int accept(int socket, struct sockaddr * address,socklen_t * address_len);
参数:
Sockfd 代表 Sockket 文件描述符 。
地址: 保存先前连接的客户端的 IP 地址和端口号, 如果 IP 地址和端口号与客户端无关, 设定为 NULL 。
地址:结构的大小。
返回值:
成功返回了一个新的用户连接的套接字文件描述符 。
失败返回 -1
扩展函数:
1. 当地IP地址应转换为网络IP地址。
in_addr_t inet_addr(const char *cp);
参数:
cp:本地IP地址
返回值:返回到网络的 IP 地址。
一、扩展函数
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
in_addr_t inet_addr(const char *cp);
函数作用:
将本地 IP 地址转换为网络 IP 地址 。
参数:
cp:本地IP地址
返回值:返回到网络 IP 地址,注意in_addr_t。
Char *inet_enta( 以_ addr 建立 struct); /n 本地网络
函数作用:
将 IP 地址从网络转换为本地 IP 地址 。
参数:
在 : 网络 IP 地址 请注意, in_addr 类型是 sruct 。
返回值:
本地IP地址
#include <arpa/inet.h>
网络 viint16_t htons ( int16_ t hosthort) 的本地 n / h 值 ;
将本地端口号转换为具有函数功能的网络端口号。
参数:
本地端口号码
返回值:
返回网络端口号
uint16_t ntohs(uint16_t netshort);
函数: 将网络端口号转换为本地端口号 。
参数:
Netshort的网络港口号
返回值:
返回本地端口号
二、端口号复用
#include <sys/types.h>
#include <sys/socket.h>
int setsockopt(int s, int level, int optname, const void * optval, , socklen_toptlen);
设定函数中要重新使用的端口号。
参数:
s: 套接字文件的配置文件
切vel 表示您想要配置的网络层, 通常为 SOL_ SONKET, 以访问嵌入层 。
SO_REUEDD 端口号重复 Openname: SO_REEADD 开关码
Poptval 提供了您想要设定的值, 例如 之一 。
奥特瓦尔的长度由奥特伦表示。
因此,可以重新使用港口号,在捆绑之前添加这两个字。
int optval = 1;
setsockopt(socketfd, SOL_SOCKET, SO_REUSEADDR,&optval, sizeof(optval));
九、UDP协议
1. 由于不需要连接,因此无法在联合民主党议定书中使用接受/持续功能。
在UDP中,你们怎么知道对方的地址?
在TCP中,首先连接(对面IP地址和端口号)/ccpe(客户IP地址和端口号)。
地址和港号和港号只能以联合民主党的数据提供,因此,在收到地址和港号及数据后,才能一并提供。
3. 区分TCP和UDP接口,不要混淆它们。
TCP:
Sock_streeam (Sock_ Climent) 组 组 组 组 组 组
Socket (SOCK_STREAM): 服务器
UDP:
客户端: SOCK_ DGRAM socket 将发送连接到从关闭恢复
套接字( SOCK_ DGRAM) 从发送至关闭处绑定矩形
十、UDP实现过程
客户端:
1. 配置( UDP 协议选择)
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
int socket(int domain, int type, int protocol);
创建套接字是一个函数。
参数:
域 : 您要使用哪个地址?
IPv4 网络协议(PF_INET/AF_INET)
IPv6 网络议定书 PF_INET6/AF_INET6
你喜欢哪一种协议?
SOCK_STREAM - TCP 流流线套接字
SOCK_ DGRAM - UDP 数据子集
协议:默认设为0。
返回值:
成功返回了套接字文件描述符 。
失败 -1
2. 将您的IPIP地址和端口号连接在一起
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
参数:
Sockfd 代表 Sockket 文件描述符 。
Addr: 您自己的 IP 地址和端口号
升温: 结构大小
返回值 :
成功则返回 0,
返回失败 - 1, 错误错误
sruct sockaddr - 上一个结构
{
空空未签名 sa_ family; / * 地址地址*/
Char sa_ data [14];/*14 字节协议地址,包括套接字的IP地址和端口号。 */
};
//IPV4结构体
struct sockaddr_in
{
IPV6*//
* 端口号* /; 未签名的短号 sin_port;
* IP 地址* / Scruct in_addr sin_addr;
无符号字符sin_ zero[8]; / * 填充 0 以保持与 sruct sockadr* 相同的大小 。
};
struct in_addr {
in_addr_t s_addr; / *in_addr_t to 32-bit unt 符号, 其中有一个大字节顺序 。 */
};
3. 立即发送(通过聊天)
#include <sys/socket.h>
ssize_t sendto(int socket, const void *message, size_t length,int flags, const struct sockaddr *dest_addr,socklen_t dest_len);
函数: 此函数用于通过 UDP 传输数据, 重要的是要记住 UDP 代表用户数据表协议 。
参数:
Socket 文件描述器: Socket 文件描述器
消息:您正在发送的信息
长度: 您要传输的数据数量; 尽量发送, Strlen 。
一般设置设置在旗帜中设置为 0 。
dest_addr:对方方的 IP 地址和端口号
Dest-len: 结构规模
返回值:
成功返回的字节数
失败返回 -1
4、关闭
close(socketfd);
服务器端:
#include <sys/socket.h>
ssize_t recvfrom(int socket, void * buffer, size_t length,int flags, struct sockaddr * address, socklen_t * address_len);
3⁄4 ̄ ̧漯B
参数:
Socket 文件描述器: Socket 文件描述器
缓冲: 这是接收数据保存的地方 。
长度:所收到数据的大小,按最大值大小()确定。
一般设置设置在旗帜中设置为 0 。
地址: 保存客户端的 IP 地址和端口号, 以确定由谁向您提供 。
地址:结构的大小。
返回值:
接收到的字节已成功返回 。
失败返回 -1
十一. 在插座编程中,有4个IO模式。
1、阻塞IO
1)read(fd) recv(socketfd) recvfrom(socketfd) ...
这些函数本身并不阻碍属性本身,而是因为文档描述符的阻塞性能导致功能被运行,从而形成阻塞效果。
(2) 默认情况下,限制使用Linux合成和文件说明。
2、非阻塞IO
(1) 此函数在文件描述中添加一个非阻塞属性 。
2) 由于无阻塞性,可以随时查询包件中的数据是否可以持续存取。
3、多路复用
1) 多个国际组织同时运作(参考描述性说明)(同时听多份合成)
2) 确定在特定时限内获得的数据是可行的。
4、信号驱动
(1) 混合通信手段
2) 当数据到达Socket时,向用户发送信号。
十二、阻塞IO
当数据缓冲栏中没有数据可读时, 调用的 recrov recevvfvfsscanf 将永远停止 。
当数据缓冲的剩余大小小于所写数据的数量(您没有足够的空间),且持续到读取缓冲区内的数据时,才会出现写阻塞。
例子: int fd = open("xxxx"); --->fd是阻塞。。
如果您使用由宏打开的 O_ ONBLOCK 文件, 文件描述不会被屏蔽 。
十三、非阻塞IO
1. 区分IO路障和IO无路障
阻塞IO
建立套接字( 套接字) - 读数据 - 在缓冲区内找不到数据
- 在缓冲区内有数据之前,没有数据,进入等待状态
请读读数据-- 读出数据到等待状态-- 直到在缓冲区里有数据。
非阻塞IO
创建套接字( 区块) -- 将套接字文件描述符属性设置为非阻塞 - 读取数据 --
- 没有数据 - "读取失败" - 接口将立即返回, 并且不会被停止 。
如果读取成功, 接口返回数据。
2. 如何配置一个非锁定文件配置器属性 - 文件控件 fcntl
#include <unistd.h>
#include <fcntl.h>
int fcntl(int fd, int cmd, ... /* arg */ );
参数:
fd: 您想要设置和传递哪个文件描述符?
cmd:控制的命令
参考:基于第二个参数的确定
第二个参数cmd:
F_GETFL: 获取文件状态和文件访问模式, 以及文件描述符状态; 第三个参数可以省略 。
F_SETFL: 更改文件描述符的状态, 但只允许更改 O_ APPEND、 O_ ONBLOCK 和 O_ ASYNC 位置; 其他位元不受影响 。
O_AAPPEND:可以配置到添加
ONONBLOCK: 未屏蔽的属性可以设置 。
返回值 :
F_GETFL - 返回文件描述符的状态或属性 。
F_SETFL -->
成功返回 0
失败返回 -1
比如:
locketfd = locket( TCP 协议); / / 默认值被禁止 。
/ 获取此套接字文件描述符的属性 。
int status = fcntl(socketfd,F_GETFL)
/ 所提供的文件描述符的完整属性之一设置为非区块。
status |= O_NONBLOCK;
ftntl( socketfd, F_SETFL, 状态); // 设置变量状态为文件配置文件状态 。
思考:为什么系统可以使用一点点或一种方法将一个品质设置为变量,而系统知道?
0000 1100 1100 0110
1000
O_NONBLOCK
1000
3、例子
设置套接字的无阻塞属性,以确定套接字是否在等待客户端时额外阻断连接 。
=============
#include<stdio.h>
#include <sys/socket.h>
#include <sys/types.h> /* See NOTES */
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
# 定义 OWNADR ""// 我自己的机器的 IP 地址
# define OwnPort200// / 这个软件在我自己的机器上的端口号
int main()
{
(“目前,服务器 IP:%s, Port:%un”, OWNADDR, OWNTP);
//1. 购置移动电话(合成制造)
int socketfd = socket(AF_INET, SOCK_STREAM, 0);
if(socketfd == -1)
{
不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,
return -1;
}
/ 因为一旦服务器终止, 端口号将无法及时发布 。
/ 如果服务器此时重新启动, 将使用端口号, 导致服务器无法指定端口号并建立连接 。
/以便可以重新使用港口号
int optval = 1;
setsockopt(socketfd, SOL_SOCKET, SO_REUSEADDR,&optval, sizeof(optval));
//2. 把自己的电话号码(连同你的IP地址和端口号)绑起来。
创建 IPV4 结构变量,并指定IP 地址和端口号。
struct sockaddr_in ownAddr;
很抱歉打扰你,b*tch之子 = AF_INET;/* 地址 IPV4*/
很抱歉打扰你,sin_port = htons(OWNPORT);//htons将当地港口号转换成网络港口号。
ownAddr.sin_addr.s_addr = inet_addr(OWNADDR); //将本地 IP 地址转换为网络 IP 地址 。
bind(socketfd, (struct sockaddr *)&ownAddr,sizeof(struct sockaddr_in));
3、3、铃声响起(电话铃声)
listen(socketfd,5);
//4. 我在打电话(防止与客户联系)
"等待客户连接""等待""客户"" "等待""
/ 创建 IPV4 结构变量以记录连接客户端的 IP 地址和端口号 。
struct sockaddr_in clientAddr;
/ 如果您想要接收对方的 IP 地址和端口, 第三个参数必须是结构的大小 。
int len = sizeof(struct sockaddr_in);
/ 设置套接字的可阻塞特性
int status = fcntl(socketfd,F_GETFL);/ 获取此套接字文件描述符的属性 。
/ 所提供的文件描述符的完整属性之一设置为非区块。
status |= O_NONBLOCK;
int ret = ftntl( socketfd, F_SETFL, 状态); // 设置变量状态为文件配置文件状态 。
if(ret == -1)
{
printf("fcntl errorn");
}
while(1)
{
在这一点上,它是不停的, 它只会变得更糟。
int newClientFd = accept(socketfd,(struct sockaddr*)&clientAddr,&len);
if(newClientFd != -1)
{
"",""
/ 以本地字节顺序输出网络连接客户端的 IP 地址和端口号 。
"连结客户 IP:%s 端口号:%un" Iint_intoa(clieentAddr.) 我不知道你在说什么, 但我不知道你在说什么, 但我不知道你在说什么,
}
//printf("11111111111n");
}
//5、关闭
close(socketfd);
//close(newClientFd);
return 0;
{
设置合成为无阻塞; 检查以检查合成是否也会在等待客户端时阻断连接..
步骤:
1、建立套接字
2、/ 因为一旦服务器终止, 端口号将无法及时发布 。
/ 如果服务器此时重新启动, 将使用端口号, 导致服务器无法指定端口号并建立连接 。
/以便可以重新使用港口号
绑定您的 IP 地址和端口号是 步骤三 。
创建 IPV4 结构变量,并指定IP 地址和端口号。
4. 安装钟声(电话)。
5. 接收客户连接受阻。
6、关闭
}
十四. 重复使用若干例行程序(重点)
1. 同时拦截几组卫星。
阻塞IO---->只能同时监听一个套接字
非阻塞IO--->一直轮询,询问IO口有没有数据到来,非常浪费CPU资源
2、什么是多路复用
这是文件说明的预发件,必须放在收藏中,然后必须按规定期限或无限期地堵住等待的时间。
如果收集中的文件描述符没有在规定的时间框架内更改数据,则表示数据是经过一段时间才收到的,并等到收集中的下一个特定时期设置描述符在规定的时间框架内不更改数据,表示数据是经过一段时间才收到的,并等到下一个特定时间。
当收藏中的文件描述符更新其数据时,不修改其数据的更多文件描述符会被启动,置于下一个等待状态。
3、特点
同时监听多个套接字
4. --选择多路化多路功能接口
/* According to POSIX.1-2001 */
#include <sys/select.h>
/* According to earlier standards */
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
int select(int nfds, fd_set *readfds, fd_set *writefds,fd_set *exceptfds, struct timeval *timeout);
参数:
nfds: 最大文件描述符加 1
Readfds:我们监测一组文件描述器,看它们是否可读,或者它们是否被99%的时间阻塞。
写法: 监视文件描述器的收藏; 我们检查文件描述器是否可写入; 如果您不想观看写入, 设置为 NULL 。
例外:用于跟踪错误
超时: 设定最长的等待时间; 一次超时后, 时间值必须重置并提供给选择的方法 。
- 如果 NULL,此函数将被停止(无限期等待数据)。
struct timeval {
tv_seec 长; / *秒 * /
tv_usec 长; / * 微秒 */
};
比如设置5秒
struct timeval timeout;
timeout.tv_sec = 5;
timeout.tv_usec = 0;
1 秒等于 100 00 微秒
返回值:
成功
数据即将到来的文件描述文件总数 - 完整
没有达到数据 -- -- 超时 -- -- 零。
失败
-1
5. 档案档案档案功能接口
文件配置配置组数据类型是 fd_set 。
(1) 从收藏 fd 中卸载文件配置程序
void FD_CLR(int fd, fd_set *set);
2) 检查文件描述符 fd 是否在集中
int FD_ISSET(int fd, fd_set *set);
(3) 在收藏中包含文件描述符 。
void FD_SET(int fd, fd_set *set);
此收藏集由“ 4” 清除 。
void FD_ZERO(fd_set *set);
使在客户与服务器之间发送和接收数据成为可行,服务器必须在5秒钟内到达,否则时间就用完了。
客户和服务器
"hai" ---> "hai"
"zouni" <---- "zouni"
使用此选项可同时聆听两个客户端文件描述符, 同时您也可以选择聆听两个服务器文件描述符 。
(STDIN_FILENO) (STDIN_FILENO) (STDIN_FILENO) (STDIN_FILENO) (STDIN_FILENO) (STDIN_FILENO) (STDIN_FILENO) (STDIN_FILENO) (STDIN_FILENO) (STDIN_FILENO) (STDIN_FILENO) (STDIN_FILENO) (STDIN_FILENO) (STDIN_FILENO) (STDIN_FILENO) (STDIN_FILENO) (STDIN_FILENO (STDIN_FILENO) (STDIN_FILENO) (STDIN_FILELENO) (STDIN_FILENO) (STDIN_FILELNO) (STDIN_FILELNO) (STDIN_FILELNO) (S(STDIN_FILIN(STDIN_FILILILILIN(S) (S(STDIN(STDIN_FILELNO) (S) (S) (STDIN_FILELNO) (S(STDIN(STDIN(STDIN(STDIN_FILELNO) (S) (S) (STDIN(ISNO) (S) (S) (S) (S) (S) (S) (S) (SDINO) (SDILILILILILILILILLIN(S) (S) (S) (S) (S) (STDIN_FILILILILE) (S) (STDIN_FILILILLELELELELELELLILIN) (S) (S) (S) (S) (S) (S) (S) (S) (STDIN
socketfd newClientFd
客户端:
#include<stdio.h>
#include <sys/socket.h>
#include <sys/types.h> /* See NOTES */
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <sys/select.h>
/* According to earlier standards */
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
//我拥有Ubuntu的IP地址。
# define OWNPORT 100 / / 本程序自己的 Ubuntu 端口号
# define SERVERADD“”// 彼此服务器的IP地址
# define Serverport 200 / 彼此服务器的端口号
//TCP客户端
int main()
{
OWNADDRED, OWNPORT; 打印f (“ TCP 客户 IP:%s Port:%un”, OWNADD, OWNPORT); 打印f (“ TCP 客户端 IP:%s Port:%un”, OWNADD, OWNPORT ) ;
//1. 购置移动电话(合成制造)
int socketfd = socket(AF_INET,SOCK_STREAM,0);
if(socketfd == -1)
{
perror("socket error");
return -1;
}
//2. 没有有约束力的规定。
//3、发起连接
struct sockaddr_in serverAddr;
请接受我的歉意,先生Addr. = AF_INET;/* 地址 IPV4*/
Sirer,请接受我的歉意。Addr.sin_port = htons (SERVERPORT);//htons 将本地港口号转换为网络港口号。
serverAddr.sin_addr.s_addr = inet_addr(SERVERADDR); //将本地 IP 地址转换为网络 IP 地址 。
connect(socketfd,(struct sockaddr *)&serverAddr,sizeof(struct sockaddr_in));
获取最大的文件配置文件作为比较 。
int maxfd = STDIN_FILENO > socketfd ? STDIN_FILENO:socketfd;
struct timeval timeout;
while(1)
{
注意:收藏的初始化必须在循环中进行。
fd_ set 集; / 定义文件配置器的收藏 。
/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
FD_ZERO(&set);
/ 将标准投入纳入组装。
FD_SET(STDIN_FILENO,&set);
// 将套接字文件配置文件插入收藏
FD_SET(socketfd,&set);
循环也有时间设置。
抱歉, 超时. tv_sec = 5; // 设定 5 秒
timeout.tv_usec = 0;
套接和 STDIN_FILENO
int ret = select(maxfd+1, &set,NULL,NULL, &timeout);
if(ret == -1)
{
printf("select errorn");
break;
}
否则,如果(ret=0)//超时
{
printf("timeout......n");
如果时间不够,请回到周期的开始,并重新开始。
}
如果执行下面的代码,它就表示情况有变化。
哪个文件有变化了?
//1 键盘输入时,标准输入变化。
if(FD_ISSET(STDIN_FILENO, &set))
{
// 键盘上的数据可以检索并传送到服务器上。
char buf[1024]={0};
scanf("%s",buf);
//发送
send(socketfd, buf, strlen(buf), 0);
}
/2 如果服务器发送数据,则套接字更改。
if(FD_ISSET(socketfd, &set))
{
char buf[1024]={0};
int ret = recv(socketfd,buf,sizeof(buf),0);
if(ret == 0)
break;
printf("recv:%sn",buf);
}
}
return 0;
}
服务器端:
#include<stdio.h>
#include <sys/socket.h>
#include <sys/types.h> /* See NOTES */
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <sys/select.h>
/* According to earlier standards */
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
//我拥有Ubuntu的IP地址。
@fifine OWNPORT 200/ 这个程序自己的 Ubuntu 端口号
//TCP服务器
int main()
{
OWNAD DDRD, OWNPORT; 打印f (“ TCP 服务器IP:%s Port:%un”, OWNADDMD, OWNPORT );
//1. 购置移动电话(合成制造)
int socketfd = socket(AF_INET,SOCK_STREAM,0);
if(socketfd == -1)
{
perror("socket error");
return -1;
}
/ 因为一旦服务器终止, 端口号将无法及时发布 。
/ 如果服务器此时重新启动, 将使用端口号, 导致服务器无法指定端口号并建立连接 。
/以便可以重新使用港口号
int optval = 1;
setsockopt(socketfd, SOL_SOCKET, SO_REUSEADDR,&optval, sizeof(optval));
//2. 把自己的电话号码(连同你的IP地址和端口号)绑起来。
创建 IPV4 结构变量,并指定IP 地址和端口号。
struct sockaddr_in ownAddr;
很抱歉打扰你,b*tch之子 = AF_INET;/* 地址 IPV4*/
很抱歉打扰你,sin_port = htons(OWNPORT);//htons将当地港口号转换成网络港口号。
ownAddr.sin_addr.s_addr = inet_addr(OWNADDR); //将本地 IP 地址转换为网络 IP 地址 。
bind(socketfd, (struct sockaddr *)&ownAddr,sizeof(struct sockaddr_in));
3、3、铃声响起(电话铃声)
listen(socketfd,5);
//4. 我在打电话(防止与客户联系)
"等待客户连接""等待""客户"" "等待""
/ 创建 IPV4 结构变量以记录连接客户端的 IP 地址和端口号 。
struct sockaddr_in clientAddr;
/ 如果您想要接收对方的 IP 地址和端口, 第三个参数必须是结构的大小 。
int len = sizeof(struct sockaddr_in);
int newClientFd = accept(socketfd,(struct sockaddr*)&clientAddr,&len);
if(newClientFd != -1)
{
""
/ 以本地字节顺序输出网络连接客户端的 IP 地址和端口号 。
"连结客户 IP:%s 端口号:%un" Iint_intoa(clieentAddr.) 我不知道你在说什么, 但我不知道你在说什么, 但我不知道你在说什么,
}
获取最大的文件配置文件作为比较 。
int maxfd = STDIN_FILENO > newClientFd ? STDIN_FILENO:newClientFd;
struct timeval timeout;
while(1)
{
注意:收藏的初始化必须在循环中进行。
fd_ set 集; / 定义文件配置器的收藏 。
/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
FD_ZERO(&set);
/ 将标准投入纳入组装。
FD_SET(STDIN_FILENO,&set);
// 将套接字文件配置文件插入收藏
FD_SET(newClientFd,&set);
循环也有时间设置。
抱歉, 超时. tv_sec = 5; // 设定 5 秒
timeout.tv_usec = 0;
新 clientFd 和 STDIN_FILENO 新 clientFd 和 STDIN_FILENO 新 clientFd 和 STDIN_FILIN
int ret = select(maxfd+1, &set,NULL,NULL, &timeout);
if(ret == -1)
{
printf("select errorn");
break;
}
否则,如果(ret=0)//超时
{
printf("timeout......n");
continue;
}
如果执行下面的代码,它就表示情况有变化。
哪个文件有变化了?
//1 键盘输入时,标准输入变化。
if(FD_ISSET(STDIN_FILENO, &set))
{
/ 能够读取键盘上的数据并将其发送给客户。
char buf[1024]={0};
scanf("%s",buf);
//发送
send(newClientFd, buf, strlen(buf), 0);
}
/2 如果客户端发送数据,新的ClieentFd会更改。
if(FD_ISSET(newClientFd, &set))
{
char buf[1024]={0};
int ret = recv(newClientFd,buf,sizeof(buf),0);
if(ret == 0)
break;
printf("recv:%sn",buf);
}
}
//5、关闭
close(socketfd);
close(newClientFd);
return 0;
}
二、信号驱动
1. 信号驱动器到底是什么?
最初允许应用程序安装SIGIO信号处理程序,是否通过监听文件描述器生成SIGIO信号,是否使用系统编程信号方法确定。
我们知道文件描述符上是否有任何数据。如果收到数据,该系统将生成SIGIO信号(门铃铃响 ) 。
剩下的就是读取信号响应功能的数据。
//信号响应函数
void my_fun(int arg)
{
}
signal(SIGIO,my_fun);
2. 信号驱动特性和步骤?
特点:仅适用于联合民主党协议;不适用于TCP协议。
1)因为我们不知道数据何时会到来, 我们需要建立信号响应功能来记录它。
2)设置套接字的属主。--->告诉系统 这个套接字 对应的 进程ID是多少。实际上就是 将 这个套接字 和 进程ID号绑定起来
3) 如果你在使用信号驱动器, 你需要在这条线上添加一个信号触发模式属性, 因为没有信号触发模式属性 。
3. 如何改变所有者 - > fctl
F_SETOWN --->用于设置属主
fcntl(socketfd,F_SETOWN, getpid());
4. 如何添加套接字信号触发模式属性
/ 获取此套接字文件描述符的属性 。
int status = fcntl(socketfd,F_GETFL);
/ 文件描述符的一个属性设置为信号触发模式。
status |= O_ASYNC;
int ret = ftntl( socketfd, F_SETFL, 状态); // 设置变量状态为文件配置文件状态 。
十五、广播与组播
一、广播
1、什么是广播
单个: 软件包只能发送到一个收件人 。
广播是同时向局域网所有主机广播数据。
2、特点
只有用户数据广告(通过UDP协议)才允许广播。
3、广播地址
参考网页部分,例如:**.我不知道你在说什么。 255 Reprre 发送了该部分的广播地址。 发送到该地址的软件包为所有主机接收 。
和我们目前教室的当地地区部分一样。
嗨,Sendto。 嗨。 嗨,Sendto。
4. 获得广播的程序(必须使用联合民主党议定书)
广播发送端:
1. 制作数据订阅 UDP
int socketfd = socket(AF_INET,SOCK_DGRAM,0);
2. 设置套接字包文件配置文件的广播属性(即能够传输广播数据包)
SO_BROADCAST - 广播模式传输
int on=1;
setsockopt(sockfd , SOL_SOCKET,SO_BROADCAST,&on, sizeof(on));
3. 传送数据,使用收件人的地址作为广播地址。
struct sockaddr_in sendAddr;
sendAddr.sin_family = AF_INET;
sendAddr.sin_port = htons(10000);
对不起,发件人Addr. 我不知道你是什么意思,sin_addr.s_addr = inet_addr () ;/ 必须是广播地址, 广播发送
sendto(sockfd,buf,strlen(buf),0,(struct sockaddr*)&sendAddr,sizeof(sendAddr));
4、关闭
广播接收方:
1. 基于用户数据的广告
int socketfd = socket(AF_INET,SOCK_DGRAM,0);
2. 装订()IP地址和端口号(10,00)
注:装船港必须与发货人港相同。
struct sockaddr_in ownAddr;
ownAddr.sin_family = AF_INET;
ownAddr.sin_port = htons(10000);
将主机 IP 转换为网络 IP, 使用 / iint32_ t htonl ( int32_ t hostalong) 。
我为打扰你道歉,狗娘养的 我不确定你在说什么,sin_addr.s_addr = htonl (INADR_ANY);//INADR_ANY () 代表飞机上的所有地址//inet_addr (”);
3、接收数据
recvfrom(。。。。);
扩展函数:
#include <arpa/inet.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);
h:主机代表主机
转换的概念用词表示。
n:网络的代表性网络
无符号长英特( 8 字节小于 64, 4 字节小于 32 )
无签名的16位位数有代表性的港口号(s:无签名的短号)
练习1 - 启动和运行无线电通信。
发送端:
#include<stdio.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
int main()
{
无线电发报机"","","",""
/1, 数据创建
int socketfd = socket(AF_INET,SOCK_DGRAM,0);
if(socketfd == -1)
{
perror("socket error");
return -1;
}
//2. 设置Socketfd 剖析器的广播特征(即能够提供广播数据包)
int on=1;
setsockopt(socketfd,SOL_SOCKET,SO_BROADCAST,&on,sizeof(on));
/3. 传送数据并提供收件者的电子邮件地址作为广播地址。
IPV4 地址结构中的变量
sendAddr.sin_family = AF_INET;
sendAddr.sin_port = htons(10000);
对不起,发件人Addr. 我不知道你是什么意思,sin_addr.s_addr = inet_addr () ;/ 必须是广播地址, 广播发送
while(1)
{
char buf[1024]={0};
printf("data:");
scanf("%s",buf); //100+"hello"
sendto(socketfd,buf,strlen(buf),0,( struct sockaddr *)&sendAddr,sizeof(sendAddr));
}
close(socketfd);
return 0;
}
接收端:
#include<stdio.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
int main()
{
收音机"","","",""
/1, 数据创建
int socketfd = socket(AF_INET,SOCK_DGRAM,0);
if(socketfd == -1)
{
perror("socket error");
return -1;
}
//2. 装订()IP地址和端口号(10,00)
struct sockaddr_in ownAddr;
ownAddr.sin_family = AF_INET;
ownAddr.sin_port = htons(10000); //s unsigned short int
我为打扰你道歉,狗娘养的 我不确定你在说什么,sin_addr.s_addr = htonl (INADR_ANY);//INADR_ANY () 代表飞机上的所有地址//inet_addr (”);
bind(socketfd, (struct sockaddr *)&ownAddr,sizeof(ownAddr));
struct sockaddr_in otherAddr;
int len = sizeof(struct sockaddr_in);
while(1)
{
char buf[1024]={0};
recvfrom(socketfd,buf,sizeof(buf),0, (struct sockaddr *)&otherAddr,&len);
("从%s:%s:%u receive:%sn"),Nett_tenta(其他Addr.) 我不知道你在说什么, 但我不知道你在说什么, 但我不知道你在说什么, 但我不知道你在说什么,
}
close(socketfd);
return 0;
}
二、组播(群聊)
1、概念
广播在单一广播和广播之间,在局域网内,在小组中增加特定主机,并建立小组地址。
我们所要做的就是把数据传送到广播地址, 并且该组的所有主机都会收到这些数据。
2、组播特点
。 必须指定该组的 IP 地址。 IP 地址必须是 D 类 。
二. 只有联合民主党可以开始广播。
3、IP地址分类
IP 地址等于网络号和主机号码的总和。
网络编号:与许多网络有关。
主机号码:用于识别网络同一区域的不同主机。这意味着主机号码出现的位置越多,网络该部分的主机号码就越多。
地址仅供政府机构使用。
A型IP地址由一个字节网络地址和三个字节主机地址组成,最高地址是“0”。
A类地址范围 A类 -
B地址发给中型企业。
B型IP地址由两个字节的网址和两个字节的主机地址组成,最高地址必须是“10”。
B类地址范围 B类 -
C类地址是给需要的人的
C类IP地址由三个字节的网址和一个字节的主机地址组成,最高地址必须是“110”。
/ / / / / / / / / / / /
D类地址用于分组目的。
/0 - /0 - /0 - /0 - /0 -
使用电子邮件地址进行测试。
E类地址范围
特殊地址:
每一个字节都为0的地址(“0.0.0.0”)对应于当前主机; INADDR_ANY -->代表当前主机所有的地址
127.0.0.1 返回环地址 -- -- 在当前主机主机内自动形成闭环环的网络网络 -- -- 主要用于主机内不同应用程序的通信
如果您已经确定当前客户端和服务器都在同一个主机上运行, 您可以使用这个地址 。
4、接收端怎么接收组播消息? -->需要加入组播属性的套接字
IP_ADD_MEMBERSHIP #define 已加入该组 。
// usr/include/linux/in.h
struct ip_mreq {
* 多播送器的 IP 地址 / * 以_ addr imr_ multiladdr 输入的 struct 地址 ;
开始于_addr imr_ 界面; / * 必须添加到许多 IP 地址 * /
};
5、组播通信的过程
发送端:
1. 制作UDP数据订户
2. 向组地址()提供的数据、数据、数据
3、关闭
收件者: (在广播中添加收件者的IP地址)
1. 制作UDP数据订户
2、定义组播结构体
struct ip_mreq vmreq;
3. 建立 ip 分组( 初始化分组结构)
inet_pton(AF_INET,"224.0.0.10",&vmreq.imr_multiaddr); // 组播地址
inet_pton(AF_INET,"192.168.14.3",&vmreq.imr_interface); // 需要添加到组的ip
#ininclude <arpa/inet.h>
int inet_pton(int af, const char *src, void *dst);
参数:
如果: 你们要选谁? IPV4 AF_INET 或 IPV6 AF_INET6
src: 用户的本地 IP 地址
dst:将本地 IP 地址转换为网络 IP 地址 。存储到这里
作用:
将本地 IP 地址转换为网络 IP 地址 。
4) 包括集体广播属性(例如,配置这种安排以接收集体广播信息)
setsockopt(socketfd,IPPROTO_IP,IP_ADD_MEMBERSHIP,&vmreq,sizeof(vmreq));
5)绑定地址
struct sockaddr_in saddr;
saddr.sin_family = AF_INET;
saddr.sin_port = htons(atoi(argv[1]));
我不确定你在说什么,悲伤的,我不知道你在说什么,sin_addr.s_addr=htonl(INADR_ANY);//htonl(INADR_ANY)所有主机地址
bind(socketfd,(struct sockaddr *)&saddr,sizeof(saddr));
6)接收数据
recvfrom(......)
本文由 在线网速测试 整理编辑,转载请注明出处。