创建socket
UNIX/Linux的一个哲学是:所有东西都是文件。socket也不例外,它就是可读、可写、可控制、可关闭的文件描述符。下面的socket系统调用可创建一个socket:
#include <sys/types.h>
#include <sys/socket.h>
int socket(int domain, int type, int protocol);
domain参数告诉系统使用哪个底层协议族。对TCP/IP协议族而言,该参数应该设置为PF_ INET (Protocol Family of Internet,用于IPv4)或PF_ INET6 (用于IPv6);对于UNIX本地域协议族而言,该参数应该设置为PF_ UNIX。关于socket系统调用支持的所有协议族,请读者自己参考其man手册。
type参数指定服务类型。服务类型主要有SOCK_STREAM服务(流服务)和SOCK_UGRAM (数据报)服务。对TCP/IP协议族而言,其值取SOCK_ STREAM表示传输层使用TCP协议,取SOCK_ DGRAM表示传输层使用UDP协议。
值得指出的是,自Linux 内核版本2.6.17起,type参数可以接受上述服务类型与下面两个重要的标志相与的值:SOCK_NONBLOCK和SOCK_CLOEXEC。它们分别表示将新创建的socket设为非阻塞的,以及用fork调用创建子进程时在子进程中关闭该socket。在内核版本2.6.17之前的Linux中,文件描述符的这两个属性都需要使用额外的系统调用(比如
fcntl)来设置。
protocol参数是在前两个参数构成的协议集合下,再选择一个具体的协议。不过这个值通常都是唯一的(前两个参数已经完全决定了它的值)。几乎在所有情况下,我们都应该把它设置为0,表示使用默认协议。
socket系统调用成功时返回一个socket文件描述符,失败则返回-1并设置ermo。