监听socket

socket被命名之后,还不能马上接受客户连接,我们需要使用如下系统调用来创建一个监听队列以存放待处理的客户连接:

#include <sys/socket.h>
int listen(int sockfd, int backlog);

sockfd参数指定被监听的socket。backlog参数提示内核监听队列的最大长度。监听队列的长度如果超过backlog,服务器将不受理新的客户连接,客户端也将收到ECONNREFUSED错误信息。在内核版本2.2之前的Linux中,backlog参数是指所有处于半连接状态(SYN_ RCVD)和完全连接状态(ESTABLISHED) 的socket的上限。但自内核版本2.2之后,它只表示处于完全连接状态的socket的上限,处于半连接状态的socket的上限则由/proc/s/netipv4/tcp_ max_syn_backlog 内核参数定义。backlog参数的典型值是5。

listen成功时返回0,失败则返回-1并设置errno。

下面我们编写一个服务器程序,如代码清单5-3所示,以研究backlog参数对listen系统调用的实际影响。

//testlisten->main.cpp
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <signal.h>
#include <unistd.h>
#include <stdlib.h>
#include <assert.h>
#include <stdio.h>
#include <string.h>static bool stop = false;
static void handle_term( int sig )
{stop = true;
}int main( int argc, char* argv[] )
{signal( SIGTERM, handle_term );if( argc <= 3 ){printf( "usage: %s ip_address port_number backlog\n", basename( argv[0] ) );return 1;}const char* ip = argv[1]; //监听ip地址int port = atoi( argv[2] ); //atoi()字符串转为intint backlog = atoi( argv[3] );//创建socketint sock = socket( PF_INET, SOCK_STREAM, 0 ); //IPv4 TCPassert( sock >= 0 );//创建一个IPv4 socket地址struct sockaddr_in address;bzero( &address, sizeof( address ) ); //将结构体清零address.sin_family = AF_INET; //TCP/IPv4协议族inet_pton( AF_INET, ip, &address.sin_addr ); //ip地址转换函数,二进制网络字节序address.sin_port = htons( port ); //转换为网络字节int ret = bind( sock, ( struct sockaddr* )&address, sizeof( address ) ); //绑定assert( ret != -1 );ret = listen( sock, backlog ); //监听assert( ret != -1 );//循环等待连接,直到有SIGTERM信号将它中断while ( ! stop ){sleep( 1 );}//关闭socketclose( sock );return 0;
}

在linux机器上执行cmake ..make后,执行./testlisten 172.16.160.240 12345 5(本机ip地址)。


然后再开一个新的终端输入telnet 172.16.160.240 12345来连接该服务器程序。同时每使用telnet命令建立一个连接,就执行一次netstat命令来查看服务器上连接的状态。

然后再另外一个机器上(注意关闭防火墙)或者还是在本机上开一个终端输入netstat -nt | grep 12345,显示这一时刻listen监听队列的内容。

可见,在监听队列中,处于ESTABLISHED状态的连接只有2个(backlog 值加1)。我们改变服务器程序的第3个参数并重新运行之,能发现同样的规律,即完整连接最多有(backlog+1) 个。在不同的系统上,运行结果会有些差别,不过监听队列中完整连接的上限通常比backlog值略大。

5.4监听socket相关推荐

  1. PHP-FPM对比Swoole:Swoole多了Reactor线程监听Socket 句柄的变化 代码初始化一次不结束进程 ws tcp mqtt服务

    PHP-FPM Master 主进程 / Worker 多进程模式. 启动 Master,通过 FastCGI 协议监听来自 Nginx 传输的请求. 每个 Worker 进程只对应一个连接,用于执行 ...

  2. nginx源码分析(5)——监听socket初始化

    在nginx源码分析(4)中,看到了nginx的事件模型,但其中没有介绍监听socket的初始化.而对于web server来说,需要通过监听socket来监听客户端的连接等.本篇将会具体介绍这方面的 ...

  3. 案例驱动python编程入门-python监听socket客户端连接(驱动串口屏幕)

    [实例简介] [实例截图] [核心代码] import socket import os import sys import struct def socket_service_data(): try ...

  4. js监听select值变化_网络编程——C++实现socket通信(TCP)高并发之select模式

    相关函数: 服务端: socket() bind() listen() FD_ZERO()等辅助函数 select() 高并发select模式 accept() read() 或 recv()等 wr ...

  5. C语言socket accept()函数(提取出所监听套接字的等待连接队列中第一个连接请求,创建一个新的套接字,并返回指向该套接字的文件描述符)

    文章目录 名称 使用格式 功能参数描述 参数 sockfd addr addrlen 返回值 示例 man 2 文档中的accept解释 错误处理 名称 accept() 接收一个套接字中已建立的连接 ...

  6. Linux内核网络协议栈8—socket监听

    几个问题  了解以下几个问题的同学可以直接忽略下文: 1.listen 库函数主要做了什么?  2. 什么是最大并发连接请求数?  3.什么是等待连接队列? socket 监听相对还是比较简单的,先看 ...

  7. 使用Epoll 能监听普通文件吗?

    epoll 是 Linux 系统中常用的多路复用 I/O 组件,一般用于监听 socket 是否能够进行 I/O 操作.那么,epoll 能监听普通文件吗? epoll 是 Linux 系统中常用的多 ...

  8. 监听端口的非阻塞性不具有继承性

    监听socket设置 为非阻塞时,在接收到连接请求时,连接socket并没有将阻塞性继承下来.以具体的代码 为例: #include <sys/socket.h> #include < ...

  9. nginx监听事件流程

    在前面的几篇文章中已经分析了master进程.work进程的初始化流程.但一直没有分析监听socket的创建流程,nginx服务器只有在创建socket, 绑定socet,监听socket执行完成后, ...

最新文章

  1. 图形化的Redis监控系统redis-stat安装
  2. 类: property
  3. Mac OS X Yosemite安装盘U盘制作
  4. Flask-Migrate拓展数据库表结构
  5. hp服务器安装exsi5.5
  6. 使用OData服务创建SAP C4C的Lead数据,必须指定Account字段
  7. php 降低图像大小,PHP图像重新调整大小
  8. mysql 错误等级_Mysql5.7 的错误日志中最常见的note级别日志解释
  9. web Api 返回json 的两种方式
  10. 小说的逻辑与反逻辑_以理性的数学逻辑构筑推理小说
  11. Android蓝牙通信具体解释
  12. linux oracle 删除为空的dbf,Linux上Oracle误删除一个没有用的dbf表空间文件
  13. Oracle 命名服务和监听程序
  14. optparse的模块编译参数使用
  15. Windows下Redis安装的那些事儿!
  16. iPhone各个机型屏幕尺寸
  17. lbj学习日记 04 循环和选择结构的刷题心得
  18. 如何在物联网平台创建一个千里传音产品?
  19. leetcode刷题方法
  20. Kotlin ?.let 、!! 、?:等运算符的使用

热门文章

  1. C语言-库文件与头文件
  2. C语言字符串中运算符,c语言字符串中找到一个运算符,怎样实现运算
  3. 17APLab4:图标、菜单、加速键、消息框 python
  4. VSCode每打开一次文件弹出一个git弹窗:-login -i rev-parse --show-toplevel
  5. TypeScript泛型约束
  6. (进阶)LeetCode(206)——反转链表(JavaScript)
  7. 关于子元素连续数字和英文内容溢出父元素的问题
  8. 点餐系统的设计(二)---数据管理模块代码实现
  9. 呕心沥血 JavaScript知识点梳理大全,超详细 建议收藏!!!
  10. 解决VScode安装Babel转码器报错:无法将“cnpm“项识别为cmdlet\函数、脚本文件或可运行程序的名称的问题