AnSwErYWJ's Blog

UNIX网络编程-listen函数及其包裹函数介绍

字数统计: 411阅读时长: 8 min
2017/02/23

本文将介绍UNIX网络编程中listen函数及其包裹函数。

函数简介

1
2
3
4
#include<sys/socket.h>

int listen(int sockfd,int backlog);
返回:若成功则为0,若出错则为-1

目前listen函数仅为TCP服务器调用,主要完成两个任务:

  1. socket函数创建的还未建立连接的主动套接字转换为被动(监听)套接字,使内核接受指向该套接字的连接。
  2. 使用第二个参数规定了内核为相应套接字排队的最大连接个数。

tips:socket函数创建的套接字被默认为一个主动套接字,即该套接字为将调用connect函数发起连接的客户套接字。而listen函数导致该套接字从CLOSED状态转换为LISTEN状态。

包裹函数(下载)

历史上总是将backlog设为5,但已无法满足现在服务器的需求了,所以需要指定一个较大的backlog才能满足繁忙的需求。一种方法是使用一个常值,可是每次增长都需要重新编译,比较麻烦;另一种方法是设定默认值,然后允许通过命令行或环境变量覆盖默认值:

1
2
3
4
5
6
7
8
9
10
11
12
#include<stdlib.h>
#include<sys/socket.h>

void Listen(int fd,int backlog)
{
char *ptr;
if((ptr = getenv("LISTENQ")) != NULL)
backlog = atoi(ptr);

if(listen(fd,backlog) == -1)
perror("Listen error");
}

这样就可以通过设置环境变量LISTENQ来动态配置backlog的大小。

tips:backlog为0不代表就不会有客户连接到你的机器。如果不想让客户连接,请直接关闭该套接字。

原文作者:AnSwErYWJ

原文链接:https://answerywj.com/2017/02/23/listen-in-unix/

发表日期:2017/02/23 17:02

版权声明:本文采用Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License进行许可.
Creative Commons License

CATALOG
  1. 1. 函数简介
  2. 2. 包裹函数(下载)