前面介绍了客服端通过调用connect
函数就能向服务端请求连接, 但是服务端如果不开启监听服务的话就根本不知道对端想要与之建立连接. 要想知道客户端想要连接就得调用listen
函数
函数原型
#include <sys/socket.h>
int listen(int sockfd, int backlog);
成功 : 返回0;
失败 : 返回-1.
函数语义
假设由socket
函数创建的套接字为主动套接字, 那么listen
函数就是将主动套接字转为被动套接字, 调用connect
函数将使主动套接字向对端发起连接请求, 当有被动套节时并满足必要条件就将主被套接字连接起来了.
函数参数
-
sockfd
调用socket函数返回的文件描述符(套接字). -
未完成连接队列和已完成连接队列的上限.
-
未完成连接队列 : 服务端还未完成三次握手全部过程的一个队列.
-
已完成连接队列 : 服务端已经完成三次握手全部过程的一个队列, 等待
accept
函数从这个队列中返回下一个(返回其实是取出, 该套接字不在已完成队列中了)套接字.注意 : 两个队列分别的长度都不超过
backlog
设置的值. listen的第二个参数, 跟系统的链接数量没有任何关系, 相当于是设置一个瞬间能够处理的阈值.
-
函数调用
int ret;
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
ret = listen(sockfd, 5);
if(ret < 0) EXIT("listen");
调用listen函数之前可以不用调用bind
函数, 这样端口是随机分配未使用的端口号. 但是这种做法不取就在于服务端的IP和端口一般都是熟知的, 不然对端很难连接过来, 所以最好要调用bind
函数进行绑定.
总结
- 服务端最好调用
bind
进行绑定 - 参数
backlog
是未决连接的上限