当前位置: 首页 > 网络应用技术

UNIX环境编程(C语言) - 填充单词基础TCP Placket编程

时间:2023-03-07 01:56:00 网络应用技术

  如果有一个16位整数,它占2个字节,并且有两种存储方法小端字节订单:存储低订单字节在开始地址中,大端字节orte Orderstart地址

  这两种方法正在使用,因此需要通过字节顺序转换网络通信

  我们将系统上使用的字节顺序称为主机的主机字节顺序,网络协议使用的字节顺序称为网络字节订单

  网络字节订单是大端字节订单,但控制台字节订单不是标准的。

  原型

  h表示主机,n代表网络,s表示短,l代表长长

  有两组字节操纵功能

  其中,BZERO是将目标字节字符串中指定的字节数设置为0,而参数dest是指向第一个地址的指针。参数nbytes是需要设置的字节数。

  BCOPY函数用于将内存的参数SRC复制为源内存块指针,DEST是目标内存块指针,n是要复制的上一个n字节的长度

  BCMP的功能是比较Ptr1和Ptr2的先前n字节是否相等。如果ptr1 = ptr2或n = 0,它将返回零,否则返回非零值。BCMP不检查null。

  两个是

  memset是目标字节字符串的指定数字(LEN)到值C memcpy,这与Bcopy的作用和使用一致。注意参数顺序。MEMCMP函数与BCMP一致。

  当我们表示IPv4的IP地址时,我们被用来使用点来划分小数,以表明以字符串的形式,但在实际使用中,需要使用IP地址的二进制形式

  因此需要一个函数来互相转换

  原型

  其中,结构IN_ADDR是地址结构的成员。接下来,将解释,但以上两个函数仅支持IPv4的地址

  接下来的两个功能,支持IPv4和IPv6

  两个函数家族的参数可以为af_inet(代表IPv4),af_inet6(表示IPv6)

  第一个函数STRPTR的参数是需要转换的指针。ADDRPTR用于存储结果

  ADDRPTR的第二个函数是需要转换的二进制功能。STRPTR是用于存储结果字符串的指针。Len是Str的长度。

  许多集合功能都需要一个指针,将指向套接字地址结构作为参数。每个协议家族都有自己的地址结构

  但最后,将强制执行通用套接字地址结构将参数传递给函数

  通用插座sockAddr类型定义:

  IPv4对应于sockaddr_in类型定义:

  请注意,这里的sin_addr是一个结构,

  sockaddr_in6类型定义与IPv6相对应:

  sockaddr_un类型定义对应于unix域:

  在使用地址结构之前,我们通常设置所有字节0,使用czero或memset函数,然后分配一个值

  接下来,我们将在使用时讨论它

  基本过程

  当我们想先读取文件时,套接字函数的作用等效于打开套接字。

  对于服务器,该描述符用于监视连接。实际连接传输的描述符在访问中引入

  原型

  请注意,以下参数不任意匹配。通常,_stream是tcp/sctp sock_dgram。

  参数家族,指示协议家族,具有值的值|||--- |--- ||af_inet |IPv4 |af_inet6 |IPv6 ||af_local |UNIX域协议||af_key |秘密关键作品|

  参数类型指示齿轮字符的类型|取值|含义||--- |--- ||sock_stream |字节流集|sock_dgram |数据插座| sock_raw |原始软件包|

  参数协议是特定协议类型的常数值,通常设置为0,以使其成为默认选择。

  申请

  当TCP连接时

  给套接字提供本地协议地址,即通常结合的IP地址和端口通常在启动时绑定一个已知的地址(例如IP地址+端口号)。不需要指定客户端,系统会自动分配端口号及其自己的IP地址组合。

  通常,服务器在侦听之前调用bind(),并且客户端不调用,而是在连接()时由系统随机生成一个。

  当然,客户端还可以在调用Connect()之前绑定地址和端口,以便您可以使用特定的IP和端口连接原型

  参数sockfd:这是套接字描述。bind()函数是绑定地址和端口参数addrlen:对应于长度参数addr:地址的地址指针指向地址的地址。此地址结构与地址协议根据地址的结构不同。地址,但最后,将SockAddr类型的指针分配给内核

  申请

  套接字创建的描述符默认情况下是一种活动类型(即主动调用连接到其他人,它是客户端),在调用侦听后,将其调用为Active

  原型

  参数sockfd,是套接字描述符参数积压是最大连接数

  最大连接说明

  TCP建立连接是使用三个握手,但是在完成三个握手之后,服务器需要维护此状态:半连接状态为:当服务器处于侦听状态时,服务器被放置在半连接队列中,也就是说,SYN列表(服务器端口的状态为:SYN_RCVD)。完整的连接状态是:TCP的连接状态在服务器(SYN+ACK)到ACK消息的客户端响应到客户端的客户到达服务器时,它一直保持在半连接状态;连接状态的两个队列和完整的连接状态,

  在Linux内核2.2之后,将其分为两个积压以限制半连接器(SYN_RCVD状态)队列大小和完整连接(已建立状态)队列大小

  SYN队列队列的长度由/proc/sys/net/network/ipv4/tcp_max_syn_backlog指定,默认值为2048。

  帐户队列队列的长度由/proc/sys/net/core/somaxconn和侦听函数的参数传递。两者以最小值为单位。缺陷128

  调用ACCEPT功能后,服务器将阻止监视套接字,等待客户端连接并返回全新的描述符FD

  原型

  参数sockfd:服务器开始调用socket()函数,该函数称为监视套接字描述;一致的参数addrlen **:客户端协议地址的长度

  接受函数的返回值是由内核自动生成的新描述(FD),它代表返回客户的TCP连接。如果您想将数据发送给客户端,我们可以将写入功能()函数称为在FD中写入内容;如果您想从该客户端读取内容。A服务器通常只创建一个监视套接字描述,该描述始终存在于服务器生命周期中。内核为服务器进程接受的每个客户创建一个新的套接字描述单词。当服务器向客户完成服务时,应关闭客户端的相应套接字描述。

  创建套接字后,TCP客户端使用Connect连接服务器的两个文件描述符(客户端连接的FD和Server -Side访问的FD)可以在客户端和服务器之间实现相互通信。

  原型

  sockFD:客户端socket()创建addr的描述:插座地址结构:要连接的服务器,其中包含服务器的IP地址和端口等信息,以及一致的adrlen:bind的套接字:bind的套接字:地址的长度

  实例

  以上功能足以建立服务器和客户端的TCP连接。接下来,我们将介绍用于通信的功能

  其中,读写用法与文件IO一致。用法如下所示(c语言) - 文件I/O文件共享

  其他功能不再逐一引入,用法相似,并且可以查看详细的用法

  就像文件IO中的用法一样,请关闭通信。有关详细信息,请参阅上面的链接文件io的文章IO

  如果将关闭()调用到插座FD,则将触发TCP连接到断开的四向握手。有时,我们需要数据将其发送出去并到达对手以关闭插座插座。

  如果如何shut_rd的值,则无法在数据中读取这组单词。如果如何shut_wr的值,则不得将此单词集发送到数据;如果如何shut_rdwryou的价值不再编写数据