06 TCP套接字之listen函数


前面介绍了客服端通过调用connect函数就能向服务端请求连接, 但是服务端如果不开启监听服务的话就根本不知道对端想要与之建立连接. 要想知道客户端想要连接就得调用listen函数


函数原型

#include 
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是未决连接的上限

你可能感兴趣的:(网络编程,网络编程学习)