最后更新:2021-11-29 07:23:49 手机定位技术交流文章
本章分为两节:TCP/IP和网络方案编制,第一部分涉及TCP/IP协议及其专门应用,第二部分涉及WEB和CGI方案规划。
TCP/IP是互联网的基石。 TCP 代表传输控制协议。 IP 代表互联网协议。 目前,IP有两种形式的IP, IPv4 和 IPv6.IPv4 使用32 地址,而 IPv6 使用128 地址。 本节描述IPv4, IPv4仍然是最常见的IP版本。
下图说明TCP/IP级别,以及每个级别的代表性组成部分和职能。
(1) 主机是执行 TCP/IP 协议的计算机或设备之一,每个主机用32位IP 地址识别,简洁而言之,32位IP 地址号码通常用点表示,除了主机名之外,还可以使用点,在现实中,应用程序通常使用主机名而不是IP 地址,正常情况下,主机是执行 TCP/IP 协议的计算机或设备之一,每个主机用32位IP 地址识别,为简单起见,32位IP 地址号码通常用点表示,除了主机名之外,还可以使用点。在现实中,应用程序通常使用主机名而不是IP 地址。
(2) IP地址分为两个部分,即网络ID字段和 HostID 字段。By District.IP 地址分为A-E类。交付到 IP 地址的软件包首先发送到与同一网络工作ID相同的路由器。路由器将通过 HostID 将软件包发送到网络中的特定主机。每个主机都有一个本地主机名称,即本地主机,带有默认的 IP 地址。
(3) IP协议用于在IP主机之间发送/接收数据包。IP主机只需向接收者提供软件包,但不能确保将软件包转移到目的地或按顺序发送。 这意味着IP不是可靠的协议。
(4) 每个IP数据包都有IP头、发件人IP地址、接收人IP地址以及数据。IP数据包的最大尺寸为64KB。IP数据包的最大尺寸为64KB。IP数据包的最大尺寸为64KB。IP数据包的最大尺寸包含关于该软件包的附加信息,例如软件包的总长度,软件包是使用TCP还是UDP,生存时间(TTL)计数,错误校验和等等。提供方IP数据包有一个IP头、发送人IP地址和接收人IP地址,以及数据。IP数据包的最大尺寸为64KB。IP数据包的最大尺寸包含关于该软件包的附加信息,例如软件包的总长度,无论是软件包使用TCP还是UDP,生存时间(TTL)计数,错误校验和等等。
(5) 路由器可发挥特殊IP主机包功能,接收和传输数据包。
(1) UDP(用户数据报告协议)是IP上运行的一项协议,用于发送/接收数据报告,与IP一样,UDP不能保证可靠性,而是快速有效的,在可靠性并不关键的情况下可以使用。
(2) TCP(传输控制协议)是用于发送/接收数据流的以连接为导向的协议,TCP也可在IP上运行,但提供一致的数据传输,通常,UDP类似于邮政邮件发送系统,但TCP类似于电话线。
一个主机上的若干程序(程序)可同时使用TCP/UDP。
应用程序 = (主机IP地址、协议和端口)
协议是 TCP 或 UDP, 端口号是分配给程序的唯一未签名的短整数 。 要使用 UDP 或 TCP, 应用程序( process) 必须首先选择或获得端口号 。 保留了第一个 1024 端口号 。 其他端口号可供一般使用 。 应用程序可以选择可用的端口号, 也可以在操作系统中进行核分配 。
在互联网上,数据总是按网络顺序排列,这是一个大端。在小端设备上,例如 PC、 htons ()、 htonl ()、 htonl ()、 hontohs ()、 nohs ()、 nohl () 和其他基于 Intel x86 的库函数上, 您可以在主机和网络序列之间转换数据。 例如, PC 中的端口号 1234 是按主机字节( 小端) 的未签名的短整数。 它必须转换为网络序列 。
(1) 网络编程平台,使用者可选择是使用服务器用户账户进行编程,还是直接使用个人计算机设备。
(2) 服务器-客户计算模型
在服务器- 客户计算架构中, 我们首先在服务器主机上运行服务器程序。 然后我们从客户主机运行客户端。 在 UDP中, 服务器等待客户机的数据报告, 分析数据报告, 并对客户机提供回复。 在 TCP 中, 服务器等待客户端连接。 客户端首先连接到服务器, 以构建虚拟 c 。
(3)套接字编程
TCP/IP 用户界面在网络编程中实现,使用一些C语言图书馆功能和系统电话,通常称为 Socket API。 为了使用针刺API, 我们需要一个脚手架地址结构, 用来识别服务器和客户机。 我不知道, Netdb.h 和 sys/socketh 被定义为合成地址结构。
1.套接字地址
struct sockaddr_in{ sa_family_t sin_family; in_port_t sin_port; struct in_addr sin_addr; }; struct in_addr{ uint32_t s_addr; };
* TCP/IP网络的罪恶家庭总是被配置为AF_INET。
• Sin_port仓库网络港号,按字节顺序排列。
• Sin addr是按网络字节顺序设置的主机 IP 地址。
2.套接字API
服务器必须构造一个同步并将其绑在由服务器 IP 地址和端口号组成的合成地址上。 它可以使用一个设定的端口号, 或者允许操作系统确定端口号( 如果 Sin 端口为零 ) 。 为了与服务器互动, 客户端必须创建一个套接字 。 使用 UPD 同步, 您可以将带连接到服务器 地址创建者, 您必须构建一个同步, 并将它绑在包含服务器 IP 地址和端口号的合成地址上。 它可以使用固定的端口号, 或者允许操作系统确定端口号( 如果 Sin 端口为零 ) 。 为了与服务器互动, 客户必须创建一个套接字。 对于 UPD 同步, 您可以将带绑链绑到服务器地址 。
UDP套接字
为了发送/接收数据报告,UDP Sockets使用发送()/接收()功能。
ssize_t sendto(int soCkfd,const void *buf,size_t len,int flags, const struct sockaddr *dest_addr,socklen_t addrlen); ssize_t recvfrom(int sockfd,void *buf,size_t len,int flags, struct sockaddr *src_addr,socklen_t *addrlen);
在生成和连接服务器地址后, TCP 服务器使用听( ) 并接受( ) 接收客户的连接 。
int listen(int sockfd, int backlog);
后遗迹参数设定了等待连接的最大队列长度。 听 () 指定袜子指定的合成为用于接收连接的合成 。
int accept(int sockfd, struct sockaddr *addr, socklen t *addrlen)
当被接受 () 系统建立时, TCP 服务器会被停止, 直到客户使用连接连接连接 。 它会提取第一个连接请求, 等待连接队列以监听 sockfd, 生成一个新的连接带, 并返回一个新的文件描述, 引用连接客户主机的绑带 。
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
连接 () 系统函数将文档描述器 Sockfd 显示的程序连接到 adrr 提供的地址, 其大小由 sockfd 的地址空间决定 。
如果 Sockfd 是 SOCK_ DGRAM 类型、 UDP 类型、 发送数据报告的默认地址和接收数据报告的唯一地址, 则SOCKfd 是 SOCK_ DGRAM 类型、 UDP 类型、 发送数据报告的默认地址和接收数据报告的唯一地址。 事实上, 这将限制 UDP 软件包与特定 UDP 主机之间的通信, 但很少使用。 因此, UDP 软件包的连接是可选择的或不需要的。 如果套接字是 SOCK_ STREAM 类型, 即 TCP 软件包, 连接到() 试图连接到给定添加的套接字。
ref/ write () 和 send/ read ()
TCP 两个主机都可以使用 Send()/ write() 传输数据, 并在连接时使用 recv()/ read() 接收数据。 唯一的区别是 Send() 和 recv () 中的旗号参数不同, 通常可以设置为零 。
asize_t send(int sockfd, const void *buf, size_t len, int flags), asize_t write(sockfd, void *buf, size_t, len)
ssize_t recv(int sockfd, void *buf, bize_t len, int flags); asize_t read(sockfd, void *buf, size_t len);
通用套接字地址结构
sockaddr struct sockaddr { uint8_t sa_len; sa_family_t sa_family; char sa_data[14]; };
IPv6 Socket 地址结构
IPv6 Socket 地址结构在<netinet/in.h>头文件中定义
struct in6_addr { unit8_t s6_add[16]; }; #define SIN6_LEN struct sockaddr_in6 { uint8_t sin6_len; sa_family_t sin6_family; in_port_t sin6_port; uint32_t sin6_flowinfo; struct in6_addr sin6_addr; uint32_t sin6_scope_id; };
新的struct sockaddr_storage足以容纳系统所支持的任何套接字地址结构。sockaddr_storage结构在<netinet/in.h>头文件中定义
struct sockaddr_storage { uint8_t ss_len; sa_family_t ss_family; };
万维网(WW)或网络是互联网上通过超文本传输协议(RFC 2616199)传播信息的资源和用户的集合,从1990年代初期开始,随着因特网能力的提高,网络已成为全世界人民日常生活的重要组成部分。
代码如下:
#include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <time.h> #include <string.h> #include <unistd.h> #define MAXLINE 256 #define PORT 6552 void sys_err(char *msg){ perror(msg); exit(-1); } int main(int argc , char **argv){ int sockFd,n; char recvLine[MAXLINE]; struct sockaddr_in servAddr; if (argc != 2) { sys_err("usage: a.out <IPaddress>"); } sockFd=socket(AF_INET,SOCK_STREAM,0); memset(&servAddr,0,sizeof(servAddr)); servAddr.sin_family = AF_INET; servAddr.sin_port = htons(PORT); if (inet_pton(AF_INET,argv[1],&servAddr.sin_addr) <= 0) { sys_err("inet_pton error"); } connect(sockFd,(struct sockaddr *)&servAddr,sizeof(servAddr)); while((n=read(sockFd,recvLine,MAXLINE)) >0 ){ recvLine[n] = ' '; if(fputs(recvLine,stdout) == EOF){ sys_err("fputs error"); } } if(n <0){ sys_err("read error"); } return 0; }
实践结果:
本文由 在线网速测试 整理编辑,转载请注明出处 。