套接字的特性由三个属性确定:域(domain),类型和协议。
创建套接字
socket系统调用创建一个套接字并返回一个描述符,该描述符可以用来访问套接字。
套接字地址
每个套接字域都有其自己的地址格式。对于AF_UNIX域套接字来说,他的地址由结构sockaddr_un来描述,该结构定义在头文件sys/
un.h中,对于AF_INET域套接字来说,他的地址由结构sockaddr_in来描述,该结构定义在头文件sys/in.h中,下面来看看它们的定义:
命名套接字
想要让通过socket调用创建的套接字可以被其他进程使用,服务器程序就必须给该套接字命名 。AF_UNIX套接字会用到一个文件系统的路径名,AF_INET套接字会关联到一个IP端口号。
bind系统调用把参数address中的地址分配给与文件描述符socket关联的未命名套接字。
创建套接字队列
为了能够在套接字上接受进入的连接,服务器程序必须创建一个队列来保存未处理的请求。相应的系统调用是listen。
参数backlog常常设置为5,表示队列长度是5.
接受连接
一旦服务器程序创建并命名套接字后,就可以用accept系统调用来等待客和建立对该套接字的连接。
accept系统只有当有客户程序试图连接到有socket参数指定的套接字上时才返回。ac cept函数将创建一个新套接字来与该客户进程进行通信,并且返回新套接字的描述符。连接客户的地址将放在address参数指向的socktaddr结构中。如果我们不关系客户的地址,可以设置address为空指针。
请求连接
客户程序通过在一个未命名套接字和服务器监听套接字之间建立连接的方法来连接到服务器。connect系统调用就是完成这个功能;
如果不能立刻建立连接,connect调用将阻塞一段不确定的时间。一旦这个超时时间到达,连接将被放弃,connect调用失败。