listen() 函数
可以让套接字进入被动监听状态
int listen(int sock, int backlog); //Linux
int listen(SOCKET sock, int backlog); //Windows
- backlog 为请求队列的最大长度,请求队列即缓冲区
- 缓冲区的长度(能存放多少个客户端请求)可以通过 listen() 函数的 backlog 参数指定
- backlog 的值设置为 SOMAXCONN,就由系统来决定请求队列长度,这个值一般比较大,可能是几百,或者更多。
- 当请求队列满时,就不再接收新的请求,对于 Linux,客户端会收到 ECONNREFUSED 错误,对于 Windows,客户端会收到 WSAECONNREFUSED 错误。
accept()函数
当套接字处于监听状态时,可以通过 accept() 函数来接收客户端请求 参数与 listen() 和 connect() 是相同的
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 是服务器端的套接字,大家注意区分。
- 后面和客户端通信时,要使用这个新生成的套接字,而不是原来服务器端的套接字。
- accept() 会阻塞程序执行(后面代码不能被执行),直到有新的请求到来。