2.socket()函数 #include int socket (int family, int type, int protocol); Returns: non-negative descriptor if OK, -1 on error 建立套接字,family, type和protocal的取值参考下面的表
参数的组合方式见下表:
最常用的就是第一和第二列组合。
3.connect()函数 #include int connect(int sockfd, const struct sockaddr *servaddr, socklen_t addrlen); Returns: 0 if OK, -1 on error sockfd是通过socket()创建的套接字描述符,servaddr是服务器地址指针,addrlen是地址数据结构的长度。connect()函数调用会通过“三次握手”创建TCP连接,具体过程如下:
4.bind()函数 #include int bind (int sockfd, const struct sockaddr *myaddr, socklen_t addrlen); Returns: 0 if OK,-1 on error sockfd是通过socket()创建的套接字描述符,myaddr是本地地址指针,addrlen是地址数据结构的长度。bind()将本地地址绑定到套接字,地址包括IP地址和端口。 地址必须是本地网络接口的地址或者通配地址(INADDR_ANY, in6addr_any),端口可以是0或则正整数,调用之后结果如下:
5.listen()函数 #include #int listen (int sockfd, int backlog); Returns: 0 if OK, -1 on error listen将sockfd套接字状态从ACTIVE装换到PASSIVE,这样内核就可以将连接请求转给这个socket。参数backlog是连接数的最大值,内核为每个socket建立两个队列incomplete connection queue, completed connection queue,前者是等待三次握手的连接队列,后者是已经完成三次握手还没有关闭的连接队列,backlog就是这两个队列总和的最大值。
6.accept()函数 #include int accept (int sockfd, struct sockaddr *cliaddr, socklen_t *addrlen); Returns: non-negative descriptor if OK, -1 on error accept()接受来自客户端的连接请求,返回新的套接字描述符,并将客户端地址填充到cliaddr所指的内存中, addrlen设置地址长度。
7.close()函数 #include int close (int sockfd); Returns: 0 if OK, -1 on error close()关闭连接,关闭的套接字描述符不能再调用read(),write()进行读写。调用close()后TCP尝试将缓存中的数据发送出去。关闭TCP连接要进行四次握手,具体如下: