int socket(int domain,int type,int protocol);
domain表示协议族:有AF_INET,AF_INET6,AF_LOCAL/AF_UNIX,AF_ROUTE
type表示套接字类型:有SOCK_STREAM(提供有序,可靠,双向,基于连接的字节流),SOCK_DGRAM(支持无连接 的,不可靠的和使用固定大小缓冲区的数据服务),SOCK_RAW
protocol表示协议:有IPPROTO_TCP、IPPTOTO_UDP、IPPROTO_SCTP、IPPROTO_TIPC,但是一般参数写0
int bind(int sockfd, const struct sockaddr *address,socklen_t address_len);
第一个参数表示要绑定的socket,第二个参数表示要绑定给socket协议的地址,第三个参数就是地址的长度
int listen(int sockfd, int backlog);
第一个参数表示要监听的socket 第二个参数表示相应socket可以排队的最大连接个数
int accept(int sockfd, struct sockaddr* address,socklen_t* address_len);
第一个参数表示要接受的socket第二个参数表示要绑定给socket协议的地址,第三个参数就是地址的长度
int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen)
第一个参数表示要连接的socket第二个参数表示要绑定给socket协议的地址,第三个参数就是地址的长度
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,const struct sockaddr *dest_addr, socklen_t addrlen);
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,struct sockaddr *src_addr, socklen_t *addrlen);
三次握手:
connect会发出SYN段并阻塞等待服务器应答; (第一次)
服务器收到客户端的SYN, 会应答一个SYN-ACK段表示"同意建⽴连接"; (第二次)
客户端收到SYN-ACK后会从connect()返回, 同时应答一个ACK段; (第三次)
*客户端-->服务器:SYN(请求建立连接)
*服务器-->客户端:SYN+ACK(同意建立连接)
*客户端-->服务器:ACK
四次挥手:
如果客户端没有更多的请求了, 就调用close()关闭连接, 客户端会向服务器发送FIN段(第一次);
此时服务器收到FIN后, 会回应一个ACK, 同时read会返回0 (第二次);
read返回之后, 服务器就知道客户端关闭了连接, 也调用close关闭连接, 这个时候服务器会向客户端
发送一个FIN; (第三次)
客户端收到FIN, 再返回一个ACK给服务器; (第四次)
*客户端-->服务器:FIN(请求关闭连接)
*服务器-->客户端:ACK(同时read返回0,关闭)
*服务器-->客户端:FIN(调用close)
*客户端-->服务器:ACK