int bind(int sock, struct sockaddr *addr, socklen_t addrlen); //Linux
int bind(SOCKET sock, const struct sockaddr *addr, int addrlen); //Windows
bind函数 命名socket
listen() 函数
nt listen(int sock, int backlog); //Linux
int listen(SOCKET sock, int backlog); //Windows
底层会创建两个队列,未连接的队列和已经连接的队列
sock 为需要进入监听状态的套接字,backlog 为请求队列的最大长度。(未连接的和已经连接的)
所谓被动监听,是指当没有客户端请求时,套接字处于“睡眠”状态,只有当接收到客户端请求时,套接字才会被“唤醒”来响应请求
accept() 函数
当套接字处于监听状态时,可以通过 accept() 函数来接收客户端请求
int accept(int sock, struct sockaddr *addr, socklen_t *addrlen); //Linux
SOCKET accept(SOCKET sock, struct sockaddr *addr, int *addrlen); //Windows
accept() 返回一个新的套接字来和客户端通信,addr 保存了客户端的IP地址和端口号,而 sock 是服务器端的套接字,大家注意区分。后面和客户端通信时,要使用这个新生成的套接字,而不是原来服务器端的套接字。
connect() 函数
int connect(int sock, struct sockaddr *serv_addr, socklen_t addrlen); //Linux
int connect(SOCKET sock, const struct sockaddr *serv_addr, int addrlen); //Windows