socket()創建一個新的套接字
int socket(int domain, int type, int protocol);
參數:
domain:地址族,如 AF_INET(IPv4),AF_INET6(IPv6)
type:套接字類型,如 SOCK_STREAM(TCP),SOCK_DGRAM(UDP)
protocol:協議類型,通常為 0(默認協議)
返回值:成功返回套接字描述符,失敗返回 -1
Linux操作系統流行一句話,“一切皆文件”,這里的文件不是說文件系統,磁盤里的某個文件,而是struct flie
也就是說,socket也其實也是一個struct file,將socket的所有底層都抽象為一個socket
bind()就是將套接字綁定到一個本地地址(IP+端口)
具體操作也就是將IP和端口號賦值到socket對象的成員里面去
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
參數:
sockfd:套接字描述符
addr:指向 struct sockaddr 類型的指針,包含要綁定的地址信息
addrlen:地址長度,通常為 sizeof(struct sockaddr_in)
返回值:成功返回 0,失敗返回 -1
listen()將套接字設置為被動監聽模式,準備接受連接請求
int listen(int sockfd, int backlog);
參數:
sockfd:套接字描述符
backlog:等待連接隊列的最大長度
返回值:成功返回 0,失敗返回 -1
Listen()函數的最主要作用就是:初始化半連接隊列(哈希表) + 全連接隊列(鏈表)
半連接隊列的作用就是,區分來客戶端的請求是第一次握手還是第三次握手
全連接隊列的作用是,讓accept()函數從其中取走已完成連接的socket
accept()接受一個來自客戶端的連接請求
底層就是去全連接隊列里取socket
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
參數:
sockfd:監聽套接字描述符
addr:指向 struct sockaddr 類型的指針,接收客戶端的地址信息
addrlen:地址長度指針,接收客戶端地址長度
返回值:成功返回新的套接字描述符,失敗返回 -1
connect()主動發起與服務器的連接
底層就是去,動態選擇一個本地可用端口,作為發起連接的源端口
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
參數:
sockfd:套接字描述符
addr:指向 struct sockaddr 類型的指針,包含服務器的地址信息
addrlen:地址長度,通常為 sizeof(struct sockaddr_in)
返回值:成功返回 0,失敗返回 -1