【网络套接字】-----网络字节序列,socket编程接口

背景

内存当中的多字节数据相对于内存地址有大端和小端之分,磁盘文件中的多字节数据相对于文件中的偏移地址也有大端和小端之分,网络数据流同样有大端小端之分的,那么如何定义网络数据流的地址?

  • 发送机通常将发送缓冲区的数据按内存地址从低到高的顺序发出。
  • 接收机把把从网络上接收到的数据字节按照内存地址由低到高的顺序保存
  • 网络数据流的地址:先发出来的数据是低地址,后发出的数据是高地址
  • 网络数据流应该采取大端字节序,即低地址高字节
    如果发送主机是小端,就需要先将数据转换成为大端,否则就忽略,直接发送

    网络字节序和主机字节序的转换
    目的:使网络程序具有可移植性,是同样的c代码在大端小端机器上编译之后也能正常运行。

    涉及到的函数
    这里写图片描述

  • 这些函数当中h表示的是host,n表示的是network,l表示的是32位长整数,s表示的是16位短整数。
  • 例如htonl表示将32 位的长整数从主机字节序列转换为网络字节序列,例如将IP地址转换后准备发送。
  • 如果主机是小端字节序列,这些函数将参数做相应的大小端转换之后然后进行返回。
  • 如果主机是大端字节序列,这些函数不做转换,将参数原封不动地返回。

socket编程接口

API的概念
系统调用接口实际上就是应用进程的控制权和操作系统的控制权进行转换的一个接口。由于应用程序在使用系统调用之前要编写一些程序,特别是需要设置系统调用中的许多参数,因此这种系统调用接口又称为应用编程接口API(Application Programming Interface)。从程序设计的角度来看我们也把API看成是应用程序和操作系统之间的接口。
socket的概念
通俗点来说就是IP地址+端口号
为Berkeley UNIX操作系统定义了一种API,它称为套接字接口(Socket interface)(或插口接口)网络编程常把套接字作为应用进程和运输层协议之间的接口。
- 套接字Socket看做是不同主机之间的进程进行双向通信的端点,简单的说就是通信的两方的一种约定,用套接字中的相关函数来完成通信过程。套接字Socket是连接应用程序和网络驱动程序的桥梁,套接字Socket在应用程序中创建,通过绑定与网络驱动建立关系。此后,应用程序送给套接字Socket的数据,由套接字Socket交给网络驱动程序向网络上发送出去。计算机从网络上收到与该套接字Socket绑定IP地址和端口号相关的数据后,由网络驱动程序交给Socket,应用程序便可从该Socket中提取接收到的数据,网络应用程序就是这样通过Socket进行数据的发送与接收的。

  • 操作系统区分不同应用程序进程间的网络通信和连接,主要有3个参数:通信的目的IP地址、使用的传输层协议(TCP或UDP)和使用的端口号。

           Socket=Ipaddress+TCP/UDP+port Socket
    
  • Socket原意是“插座”。通过将这3个参数结合起来,与一个“插座”Socket绑定,应用层就可以和传输层通过套接字接口,区分来自不同应用程序进程或网络连接的通信,实现数据传输的并发服务。
  • 套接字连接的过程如同(客户)打一个电话到一个大公司,接线员(服务器进程)接听电话并把它转接到你要找的部门,然后再从那里转到你要找的人(服务器套接字),然后接线员(服务器进程)再继续转接其它(客户)的电话。

  • 套接字有本地套接字和网络套接字两种。本地套接字的名字是Linux文件系统中的文件名,一般放在/tmp或/usr/tmp目录中;网络套接字的名字是与客户连接的特定网络有关的服务标识符(端口号或访问点)。这个标识符允许Linux将进入的针对特定端口号的连接转到正确的服务器进程。

详细见:linux网络套接字

这里写图片描述
套接字是应用进程为了获得网络通信服务而与操作系统进行交互时使用的一种机制。
socket常见的API
这里写图片描述
sockaddr结构
socket API是一层抽象的网络编程接口,适用于各种底层网络协议。然而各种网络协议的地址格式是不同的。
这里写图片描述

IPv4、ipv6地址类型分别为常数AF_INET、AF_INET6.这样,只要我们取得某种sockaddr结构体的首地址,不需要知道是哪种类型的sockaddr结构体,就可以根据地址类型字段确定结构体中的内容
socket API都可以用struct sockaddr* 类型表示,在使用的时候都需要强制进行转换成sockaddr_in;这样的好吃是实现层序的通用性,可以接收IPV4,IPV6,以及UNIX Domain Socket各种类型的sockaddr结构体指针作为参数。

sockaddr结构
这里写图片描述
sockaddr_in结构
这里写图片描述
我们在真正基于IPv4进行分编程时,使用的数据结构是sockaddr_in这个结构,这和个结构主要有三部分的信息:地址类型、端口号、IP地址。

in_addr结构
这里写图片描述
in_addr用来表示一个IPv4的IP地址,其实就是一个32位的整数。

猜你喜欢

转载自blog.csdn.net/daboluo521/article/details/80458473