【socket编程-07】使用listen()和accept()函数

Socket的基本操作函数socket()、bind()、listen()、connect()、accept()、recv()、send()、select()、close() 文章目录Socket的基本操作函数1、socket()函数1.1、 命名socket网络字节序与主机字节序:2、bind()函数3、listen()、connect()函数4、accept()函数5、recv()、send()等函数同步Socket的send函数的执行流程注意:同步Socket的recv函数的执行流程注意:6、select()函数理解select模型:select模型的特点:7、close()/shutdown()函数注:多进程中close操作解释close与shutdown的区别 Soc 阅读详情

  声明:本博客所转《socket编程》系列教程来自C语言中文网,本文地址使用listen()和accept()函数,本文仅供学习交流,更多内容请支持原创!


对于服务器端程序,使用 bind() 绑定套接字后,还需要使用 listen() 函数让套接字进入被动监听状态,再调用 accept() 函数,就可以随时响应客户端的请求了。

listen() 函数

通过 listen() 函数可以让套接字进入被动监听状态,它的原型为:

int listen(int sock, int backlog);  //Linux
int listen(SOCKET sock, int backlog);  //Windows

sock 为需要进入监听状态的套接字,backlog 为请求队列的最大长度。

所谓被动监听,是指当没有客户端请求时,套接字处于“睡眠”状态,只有当接收到客户端请求时,套接字才会被“唤醒”来响应请求。
请求队列
当套接字正在处理客户端请求时,如果有新的请求进来,套接字是没法处理的,只能把它放进缓冲区,待当前请求处理完毕后,再从缓冲区中读取出来处理。如果不断有新的请求进来,它们就按照先后顺序在缓冲区中排队,直到缓冲区满。这个缓冲区,就称为请求队列(Request Queue)。

缓冲区的长度(能存放多少个客户端请求)可以通过 listen() 函数的 backlog 参数指定,但究竟为多少并没有什么标准,可以根据你的需求来定,并发量小的话可以是10或者20。

如果将 backlog 的值设置为 SOMAXCONN,就由系统来决定请求队列长度,这个值一般比较大,可能是几百,或者更多。

当请求队列满时,就不再接收新的请求,对于 Linux,客户端会收到 ECONNREFUSED 错误,对于 Windows,客户端会收到 WSAECONNREFUSED 错误。

注意:listen() 只是让套接字处于监听状态,并没有接收请求。接收请求需要使用 accept() 函数。

accept() 函数

当套接字处于监听状态时,可以通过 accept() 函数来接收客户端请求。它的原型为:

int accept(int sock, struct sockaddr *addr, socklen_t *addrlen);  //Linux
SOCKET accept(SOCKET sock, struct sockaddr *addr, int *addrlen);  //Windows

它的参数与 listen() 和 connect() 是相同的:sock 为服务器端套接字,addr 为 sockaddr_in 结构体变量,addrlen 为参数 addr 的长度,可由 sizeof() 求得。

accept() 返回一个新的套接字来和客户端通信,addr 保存了客户端的IP地址和端口号,而 sock 是服务器端的套接字,大家注意区分。后面和客户端通信时,要使用这个新生成的套接字,而不是原来服务器端的套接字。

最后需要说明的是:listen() 只是让套接字进入监听状态,并没有真正接收客户端请求,listen() 后面的代码会继续执行,直到遇到 accept()。accept() 会阻塞程序执行(后面代码不能被执行),直到有新的请求到来。

网络socket编程指南 4 listen accept send recv 函数 listen()函数  是换换内容得时候了。假如你不希望与远程的一个地址相连,或者说, 仅仅是将它踢开,那你就需要等待接入请求并且用各种方法处理它们。处 理过程分两步:首先,你听--listen(),然后,你接受--accept() (请看下面的 内容)。除了要一点解释外,系统调用 listen 也相当简单。int listen(int sockfd, int backlog); sockfd 是调用 socket() 返回的套接字文件描述符。backlog 是在进入 队列中允许的连接数目。什么意思呢? 进 阅读详情

相关推荐

NVIDIA Jetson Orin DLA架构解析与AI推理优化实践

深度学习加速器(DLA)作为专用AI推理芯片,通过固定功能架构实现卷积、池化等神经网络操作的高效能比处理。其核心原理在于硬件级优化计算单元与数据流,相比通用GPU可提升3-5倍能效。在边缘计算场景中,DLA与GPU的异构协同成为关键,特别适合自动驾驶感知、机器人视觉等实时性要求高的应用。NVIDIA Jetson Orin平台通过结构化稀疏技术,在ResNet50等模型上实现近2倍性能提升。开发实践中需注意算子支持、精度校准等关键点,结合TensorRT工具链可充分发挥DLA在低功耗场景的独特优势。

weixin_32999557的博客 397

listen函数和accept函数

是一个常量,表示系统允许的最大连接数。这里是告诉操作系统可以排队等待的最大连接请求数。你也可以根据实际需求传递其他适当的值。函数用于使服务器套接字进入监听状态,以等待客户端的连接请求。后,服务器套接字就进入了监听状态,等待客户端的连接。函数来接受客户端的连接请求。之后,会有一个循环,不断地调用。

C or CPP 542

原恒星尘埃生长的三维MHD模拟与湍流效应研究

星际尘埃演化是恒星形成过程中的关键环节,其动力学行为直接影响行星系统的构建。通过磁流体力学(MHD)模拟可以揭示尘埃颗粒从微米级到行星胚胎尺度的生长机制,其中湍流效应通过改变碰撞频率和密度结构发挥双重作用。最新研究采用COALA-RAMSES耦合框架,实现了包含自洽尘埃生长的三维非理想MHD模拟,量化了不同物理环境下尘埃尺寸分布的演化规律。这些发现不仅为解释ALMA观测数据提供理论依据,也对行星形成初期条件约束具有重要意义,特别是在湍流参数化与尘埃生长速率关系方面取得突破。

weixin_30988079的博客 383

Listen、connect()、 accept() 功能作用分别是什么?

用于服务器接受连接请求,这是建立基于TCP的客户端-服务器通信的一般步骤。总结:监听用于等待客户端连接,

weixin_57672347的博客 1056

手把手教你用HiNet实现图像隐藏:可逆神经网络实战指南(附代码)

本文提供了一份基于HiNet框架实现图像隐藏的实战指南。通过详细解析可逆神经网络原理,手把手指导环境搭建、模型构建、损失函数设计及训练流程,并附有完整代码。该方法利用单个可逆网络统一隐藏与恢复过程,结合小波变换提升隐蔽性,为信息隐藏应用提供了高效解决方案。

rgv234567的博客 433

智能体在车联网中的应用:第9天 核心工具链与仿真世界:SUMO交通仿真入门——从安装到构建你的第一个虚拟十字路口

摘要 SUMO是一款开源微观交通仿真工具,为车联网和自动驾驶算法开发提供高效安全的测试环境。文章详细介绍了SUMO的核心概念、安装方法及实战应用。在Ubuntu或Windows系统安装SUMO后,可通过netedit工具构建十字路口路网,包括创建节点、连接边、设置交通信号灯等步骤。随后通过编写.rou.xml文件定义车辆类型、路线和车流,实现动态交通场景模拟。SUMO支持与外部程序交互,能复现真实场景、进行极端测试和算法验证,是车联网研究的理想数字沙盘。

IT深耕十余载,大道之简 1451

TCP三次握手中listen()与accept()原理

【代码】TCP三次握手中listen()与accept()原理。

mrqiuwen的博客 3016

由ip地址和子网掩码求网络号、主机号、广播地址(超详细)

1、用二进制数表示IP地址   在进行计算之前,我们首先要学会十进制的IP地址怎么转换为二进制的IP地址。   给出一个例子: 十进制:172.16.25.3 二进制:10101100.00010000.00011001.00000011 1、如果两台主机的网络号相同,我们就说它们是同一网段 2、主机号的意义 - 1)主机号部分全变成1,即为该网段的广播地址 - 2)主机号部分全变成0,即为该网段的网路地址(网络号) 3、如果主机号部分为x位,则该网络能容纳最大主机数为: 2的x次方-2。减2

爱吃雪糕的小布丁的博客 9万+

使用listen()和accept()函数

对于服务器端程序,使用 bind() 绑定套接字后,还需要使用 listen() 函数让套接字进入被动监听状态,再调用 accept() 函数,就可以随时响应客户端的请求了。 listen() 函数 通过 listen() 函数可以让套接字进入被动监听状态,它的原型为: int listen(int sock, int backlog); //Linuxint listen(S

芝麻软件工作室的专栏 1280

深入剖析 Wenet 下 AISHELL-1 的 run.sh 脚本:从数据准备到模型训练

run.sh脚本用于处理 AISHELL-1 数据集的整个训练和测试流程。我们将逐步分析脚本中的每个部分,包括环境变量、参数设置、各个阶段的执行等。stage: 设置脚本的起始阶段(如数据准备)。stop_stage: 设置脚本的结束阶段。通过对 Wenet 下 AISHELL-1 的run.sh脚本的详细剖析,我们希望你能更好地理解每个步骤的功能及其背后的原理。此脚本不仅为模型训练提供了便利,也为用户自定义和扩展训练流程提供了基础。希望本教程能帮助你顺利完成语音识别项目!

帅小柏的博客 1632

[Dify实战] OA 公文排版助手:自动格式化、编号、生成摘要-带配套资源

摘要: Dify 公文排版助手通过自动化解决公文处理中的格式混乱、编号错漏等问题。支持标题层级自动编号、摘要生成、要素补全等功能,输出标准化Markdown格式。核心流程包括输入原文、智能识别、自动排版与要素输出,适用于通知、纪要等场景。实施需统一模板规则,规范输入格式,并通过试跑优化纠错率与处理效率。关键价值在于减少人工返工,提升排版一致性,未来可对接OA系统实现全流程自动化。

技术小甜甜:传播可落地技术,帮助个人和企业降低解决真实场景问题的成本 471

关于tcp/ip中的listen与accept

首先需要说明的一点是: accept()不是监听,accept()是接受新连接。 listen()是进入监听状态,表示愿意接收连接请求。 listen之后有连接请求就将其放到队列中,accept()时把新连接请求从队列中取出,建立新的socket。 然后就是accept()与listen()是属于tcp的,而在UDP/IP协议,不需要ACCEPT()或者LISTEN()来监听等待。 具体: 在tc...

Stephen 1679

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Socket 编程基础

套接字(socket)是 Linux 下的一种进程间通信机制(socket IPC),在前面的内容中已经给大家提到过,使用 socket IPC 可以使得在不同主机上的应用程序之间进行通信(网络通信),当然也可以是同一台主机上的不同应用程序。socket IPC 通常使用客户端服务器这种模式完成通信,多个客户端可以同时连接到服务器中,与服务器之间完成数据交互。内核向应用层提供了 socket 接口,对于应用程序开发人员来说,我们只需要调用 socket 接口开发自己的应用程序即可!

Bit_Dong的博客 3万+

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

listen(), connect(), accept() 三者的关系

listen(), connect(), accept() 三者的关系 socket 编程流程 listen()函数 #include <sys/types.h> #include <sys/socket.h> int listen(int sockfd, int backlog); 在网络通信中, 客户端通常处于主动的一方, 而服务器...

如故的博客 7631

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

socket通信之listen函数

socket通信之listen函数 listen函数原型如下: #include <sys/types.h> #include <sys/socket.h> int listen(int sockfd, int backlog); 第一个参数sockfd为创建socket返回的文件描述符。 第二个参数backlog为建立好连接处于ESTABLISHED状态的队列的长度。 backlog的最大值128(linux原文描述如下): If the backlog argument

morris 3万+

socket网络通信中的 listen(),connecet() 和 accept()函数

一、listen() 函数 1.作用:   listen() 函数把主动连接套接字变为被动连接的套接字,使得这个 socket 可以接受其他 socket 的连接请求,从而成为一个服务端的 socket。 2.函数声明及参数 2.1 函数声明 int listen(int sockfd, int backlog); 2.2 函数参数   (1)参数 sockfd:   参数sockfd是已经被bind过的socket(这个函数是监听,肯定是先绑定了,才监听)。   socket函数返回的socket是一

qq_43403759的博客 4133

socket编程 -- socket、bind、accept、connect函数

socketsocket函数原型#include <sys/types.h> /* See NOTES */ #include <sys/socket.h>int socket(int domain, int type, int protocol);参数说明 domain: AF_INET 这是大多数用来产生socket的协议,使用TCP或UDP来传输,用IPv4的地址 AF_INET6 与上面

未来之歌 1万+

socket编程之 accept函数的理解

在进入我们的正题之前,再来复习一波编写服务器的函数流程吧 服务器端: socket()-->bind( )-->listen()-->accept()-->read()/write()--->close() socket()//创建套接字 bind()//分配套接字地址 listen()//等待连接请求状态 accept()//允许连接 read()/write(...

dearQiHao的博客 5414

C++ tcp/ip网络编程中listen函数和accept函数详解和区别

listen函数 摘要:listen函数使用主动连接套接口变为被连接套接口,使得一个进程可以接受其它进程的请求,从而成为一个服务器进程。在TCP服务器编程中listen函数把进程变为一个服务器,并指定相应的套接字变为被动连接。 listen函数在一般在调用bind之后-调用accept之前调用,它的函数原型是: intlisten(int sockfd, int backlog)

jirryzhang的博客 1万+

socket、listen、connect、bind、accept函数详解

socket函数 为了执行网络I/O,一个进程必须做的第一件事情就是调用socket函数,指定期望的通信协议 #include<sys/socket.h> int socket(int family,int type,int protocol) 返回成功则返回非负文件描述符,若出错则为-1 其中family参数指明协议族,它是某些常量AF_INET:IPv4、AF_INET:Ipv6等...

Patrick的博客 2132

socket(), bind(), listen(),与accept()函数的作用和关系

socket(), bind(), listen(),与accept()函数的作用和关系

qq_51094410的博客 2208

Linux网络编程中connect()、listen()和accept()与TCP三次握手的关系

Linux网络编程开发分为服务器端和客户端两个部分: 对于服务器端的流程——类似于接电话过程 socket()[找到一个可以通话的手机]----->bind()[插入一个固定号码]------>listen()[随时准备接听]-------> accept------->recv()------->send()------>close(); 对于客户端的主...

Magnum的博客 4612

Socket编程函数:socket,bind,listen,accept,connect,出错处理函数[奇牛学院]

Socket编程函数socketbindlistenacceptconnect出错处理函数 socket #include <sys/types.h> /* See NOTES */ #include <sys/socket.h> int socket(int domain, int type, int protocol); domain: AF_INET 这是大多数用来产生socket的协议,使用TCP或UDP来传输,用IPv4的地址 AF_INET6 与上面类似,不过是来用IP

m0_46376834的博客 1286

网络编程socket之bind、Listen 及 accept

1.bind bind函数用于将套接字与指定端口相连.本函数适用于未连接的数据报或流类套接口,在connect()或listen()调用前使用。当用socket()创建套接口后,它便存在于一个名字空间(地址族)中,但并未赋名。bind()函数通过给一个未命名套接口分配一个本地名字来为套接口建立本地捆绑(主机地址/端口号)。 头文件 <sys/types.h> <sys/socket.h> 函数形式 int bind(int sockfd, const struct sockaddr

m0_67393342的博客 2303
上一篇: 【socket编程-06】使用bind()和connect()函数
下一篇: 【socket编程-08】socket数据的接收和发送
魔方的块
博客等级 码龄11年 1056粉丝 119原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值