2.2.2 socket现象解释
Socket跟电话插座十分相似。例如像国家的电话网,通话的电话双方则相当于相互通信的两个进程,区号则是它的网络地址;区内一个单位的交换机就相当于一台主机,主机会分配给每个用户局内号码,这就相当于socket号。任何用户在通话之前,首先要占用电话,这是相当于申请一个socket;当然还要知道对方的号码,这就是相当于知道对方固定的socket。然后才能向对方拨号呼叫,这就相当于发出了连接请求(对方假如不在同一区内,那么还要拨对方的区号,就相当于给出了网络地址)。对方假如在场并且空闲着(相当于通信的另一主机开机,而且可以接受连接的请求),那么拿起电话的话筒,双方就可以正式的通话了,说明连接成功了。双方通话的过程,是一方向电话机选择发出信号,而对方从电话机也选择接收信号的过程,这就相当于给socket发送数据和从socket接收数据。通话结束后,一方挂起电话机也就是关闭了socket,撤消连接[4]。
2.2.3 socket连接过程
根据本地套接字要连接启动的方式以及连接的目标,套接字之间的连接过程可以分为三个步骤:服务器监听,客户端请求,连接确认[5]。
(1) 服务器监听:
是服务器端套接字,但不会定位详细的客户端套接字,却是处于等待连接的一种状态,是实时监控网络的状态[5]。
(2) 客户端请求:
是指由客户端的套接字来提出连接请求,服务器端的套接字是要连接的目标。为此,形容它要连接的服务器的套接字,首先必须要被客户端的套接字描述出来,就会指出服务器端套接字的地址和端口号,然后就向服务器端套接字发出了连接请求[5]。
(3) 连接确认:
是指当接收到客户端套接字的连接请求,或者说当服务器端套接字在监听时,它就会响应客户端套接字的请求,创建一个新的线程,然后客户端会收到由服务器端套接字的描述,一旦客户端证实了这一点描述,则将建立连接。然而服务器端的套接字将继续处于监听的状态,还会继续接收其他客户端套接字的连接请求[5]。
2.2.4 常用的socket类型
常用的socket类型有两种:数据报式Socket(SOCK_DGRAM)和流式Socket(SOCK_STREAM)。流式则是一种面向连接的Socket类型,是针对于面向连接的TCP服务应用的;然而数据报式Socket则是一种面向无连接的Socket,是对应于无连接的UDP的服务应用。socket函数原型为:int socket(int domain,int type,intprotocol);domain指明所使用的协议族,通常为PF_INET,(其与addrinfo 里的 AF_INET在现在看来是相同的。只是历史上人们曾构想将AF(地址家族address family)与PF(protocol family 协议家族)但实际上这种区分并没有真正的推广,所以现在的PF_INET和AF_INET具有相同的意义。其中AF_INET是基于IPv4而PF_INET基于IPv6)表示互联网协议族(TCP/IP协议族);type参数指定socket的类型:SOCK_DGRAM 或SOCK_STREAM,Socket接口还定义了原始的Socket(SOCK_RAW),是允许程序使用低层协议的;protocol通常赋值0。Socket()调用返回一个整型socket描述符,可以在后面的调用使用它[6]。Socket描述符是一个指向内部数据结构的指针,它指向描述符表的入口。调用Socket函数时,socket执行体将建立一个Socket,实际上建立一个Socket则是意着为一个Socket数据结构分配存储的空间。Socket执行体则是管理描述符表。两个网络程序间的网络连接包括五种信息:本地主机端口、远端主机地址、本地协议地址、通信协议和远端协议端口[6]。socket在测量软件中的使用也是非常广泛的[4]。
现在越来越多企业都会采用这种,当然也有人曾经想将地址与协议分开,但实际的意义上并未实行到现在还在使用原始的类型,它是指向低层协议的一种。 C++无线数据传输系统设计+文献综述(5):http://www.751com.cn/tongxin/lunwen_4800.html