- socket文件描述符
socket文件描述符
在网络编程中socket通常被翻译为”套接字”,在Linux操作系统下,一切皆文件,所以套接字也称为一种文件描述符。
a)创建socket文件描述符
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
int socket(int domain, int type, int protocol); //成功返回文件描述符,失败返回-1
参数介绍:
domain:协议族的名字,如AF_INET为IPv4
type:通信类型,SOCK_STREAM(流通信),SOCK_DGRAM(数据段)
protocol:通常设为0
b)绑定IP
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
//绑定的文件描述符 绑定的套接字地址 地址的长度
//成功返回0,失败返回-1
备注:因为不同的协议族可以有不同的地址类型,所以通过指定一个公共结构体,强转换成该结构体的地址,并告诉该地址的长度。
c)客户端的连接过程
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
//成功返回0,失败返回-1
connect的作用是用指定的套接字去连接指定的地址,对于面向连接的的协议,connect只能成功一次,因为已经建立连接了,对于非面向连接的协议(套接字类型为SOCK_DGRAM),可执行多次connect,以位这时的connect仅仅是设置了默认的目的地址。
对于TCP协议来说,connect实际上是要真正地进行三次握手,所以其默认是一个阻塞的操作。
d)服务端的连接过程
listen的使用
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
int listen(int sockfd, int backlog); //指定的文件描述符 监听的长度
//成功返回0,失败返回-1
让服务器处于监听状态
accept的使用
用于从指定的套接字连接队列中取出第一个连接,并返回一个新的套接字与客户端通信,没有则阻塞。
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
//处于监听状态的文件描述符,保存对端的地址信息
TCP的连接过程(三次握手)
当客户端收到服务器端发送的SYN包后返回一个ACK应答,客户端进入ESTABLISHED状态,服务端收到ACK应答后,服务端进入ESTABLISHED状态,此时连接建立完成。