socket API
socket
1 | int socket(int domain, int type, int protocol); |
功能:打开一个socket
返回值:成功返回对应的文件描述符,否则为-1
参数:
- family指明了协议簇,通常AF_INET、AF_INET6、AF_LOCAL等;
- type是套接口类型,主要SOCK_STREAM、SOCK_DGRAM、SOCK_RAW;
- protocol一般取为0。
bind
1 | int bind(int sockfd, const struct sockaddr* myaddr,socklen_t addrlen); |
功能:将sockaddr绑定到对应的文件描述符上
返回值:成功0,失败-1
参数: 主要说一下sockaddr
1 | struct sockaddr_in |
通常我们通过 sockaddr_in 端口和ip后将起其转换成 sockaddr供函数使用
两种特殊情况:
- port可以设置为0 表示有系统自动分配
- sin_addr可以设置成通配地址 IN_ADDRANY 表示由内核去选择ip地址
listen
1 | int listen(int sockfd, int backlog); |
功能:仅由tcp服务端调用 它将一个未被连接的套接字转换成被动套接字,也就是说内核应该接受指向该套接字的连接请求,调用该函数会将套接字的状态从 close 态转变为 listen 态
参数: backlog表示准许连接的最大套接字数目。这个数目由已完成的连接队列和未完成的连接队列两部分组成。未完成队列可能是发送了SYN但三次握手还没完成的。
返回值:成功0,失败-1
accept
1 | int accept(int sockfd, struct sockaddr *clientaddr, socklen_t *addrlen); |
功能:由tcp服务端调用,它会从已完成队列的对队首返回一个已完成连接的文件描述符,如何已完成队列为空,会使进程休眠(默认使用阻塞套接字)
参数: sockfd为服务端监听的套接字
返回值: 由内核生成的已连接套接字
connect
1 | int connect(int sockfd,conststruct sockaddr *servaddr, socklen_t addrlen) |
功能:在tcp协议中,该函数用来发起三次握手,建立和服务端的连接。
返回值:0成功,-1失败
回显服务端
1 |
|
回显客户端
1 |
|