6.套接字与接口
(套接字变量 = 套接字描述符 = 套接字标识符)
我们惊奇地注意到,套接字描述符符与端口号有着一些令人惊奇地相似之处:它们都是整形数据,都是对通信的标识。
可是,它们的不同之处在哪里呢?
端口号port作为端点地址结构中的一份子,还要配合IP地址这个左膀右臂方能发挥所长,但套接字描述符s却似乎能够“独来独往”。那么,这两种标识有着怎样本质的不同?又可不可以舍弃其中一种依然可以完整地描述一次通信过程呢?
即便是初学者,在对待这个问题的时候应该也能够推敲出答案来:不可以。若是可以只用一种来进行socket编程,前面又何尝需要牵扯出这两件物事来?
套接字描述符用来获得系统通信服务,标识的是不同的通信服务
端口号用来标识不同的进程,以便为它们提供服务
可是通信服务和通信进程又有什么区别呢?
第一,使用者不同。
套接字描述符由应用进程使用,端口号则由TCP实体使用。
第二,管理者不同。
套接字描述符局限于一个进程内,端口号是整个系统统一管理。
用一种现实中的模型来比喻的话,可以这样来形容:套接字描述符就是对市场交易中双方的标识,如客户C和经历M进行一场交易(他们两个的通信过程仅局限于这场交易环节中也仅限于他们两人),C和M就可以用套接字描述符来描述;C和M可以采取不同的手段来交易,比如现金、银行卡等方式(由经济系统统一规划出的交易方式,它们是知名端口)或者是二者协商的独特交易方式(本地分配端口)。
它们两者有共同的作用,从理论的角度是可以合二为一的。但是在实际实现中,它们是相互独立的、不同的资源。在网络上标识一个进程,仅端口号是不够的,还需要IP地址,协议等;而在一个进程里,标识不同的通信服务,套接字标识符就够了。
它们之间应建立相互对应的关系,即某个套接字工作在某个端点上。
这个“对应”具体又是怎样完成的呢?
注意,用户是通过套接字取得系统通信资源和服务,而这可以通过在套接字上绑定端点地址来实现(指定在哪里获取资源)。
绑定如何完成?利用bind()函数:bind