①socket()系统调用声明
int socket(int domain,int type,int protocol);
domain告诉系统使用哪个底层的协议族:
PF_INET:IPV4
PF_INET6:IPV6
type参数指定服务类型
SOCK_STREAM服务(流服务)–TCP
SOCK_UGRAM服务(数据报)服务–UDP
protocal参数是在前两个参数构成的协议集合下,再选择一个具体的协议,几乎所有情况下我们把它设置为0,表示默认协议
------------------------------------------------------------
②bind()系统调用的声明
int bind(int sockfd,const struct sockaddr* my_addr,socklen_t addrlen);
bind成功时候返回0,失败返回-1,并设置errno
最常见的两种errno是EACCES 和 EADDRINUSE
EASSES:被绑定的地址是受保护的地址,仅超级用户可以访问。比如普通用户将一个socket绑定到知名服务端口(端口为0-1023)上时,bing将返回ESACCES错误。
EADDRINUSE:被绑定的端口正在使用中,比如将一个socket绑定到一个TIME_WAIT状态的socket地址。
--------------------------------------------------------------
③listen()系统调用声明:
int listen(int sockfd,int backlog);
backlog参数提示内核监听队列的最大长度,监听队列的长度如果超过backlog,则服务器将不再受理新的客户连接,客户端也将受到ECONNREFUSED错误信息
在LINUX内核2.2版本之前,backlog参数指的是处于所有半连接(SYN_RCVD)和完全连接状态(ESTABLISHED)的socket的上限,但自从内核2.2之后它只表示处于完全连接的socket的上限,处于半连接状态的socket上限则由/proc/sys/net/i[v4/tcp_max_syn_backlog内核参数指定。backlog的典型值为5
假设backlog值设置为5,在程序运行后会发现会有>=5的连接连接上,也就是处于ESTABLISHED状态,但不会很多,一般是backlog+1的值,而其他的连接则会处于SYN_RCVD状态,在不同的系统上会有不同 的值,不过监听队列中完整的连接上限通常比backlog值大
listen成功返回0,失败返回-1,并设置errno。
---------------------------------------------------------------
④accept()系统调用