使用listen()和accept()函数

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

listen() 函数

通过 listen() 函数可以让套接字进入被动监听状态,它的原型为:
  1. int listen(int sock, int backlog); //Linux
  2. 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() 函数来接收客户端请求。它的原型为:
  1. int accept(int sock, struct sockaddr *addr, socklen_t *addrlen); //Linux
  2. 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() 会阻塞程序执行(后面代码不能被执行),直到有新的请求到来。
版权声明:本文为芝麻软件工作室原创文章,未经芝麻软件工作室允许不得转载。

TCP网络编程中connect()、listen()和accept()三者之间的关系

一、tcp编程的核心步骤
  • lianghe_work
  • lianghe_work
  • 2015年06月10日 16:39
  • 2835

【Linux网络编程】TCP网络编程中connect()、listen()和accept()三者之间的关系

基于 TCP 的网络编程开发分为服务器端和客户端两部分,常见的核心步骤和流程如下: connect()函数 对于客户端的 connect() 函数,该函数的功能为客户端主动连接服务...
  • dengjin20104042056
  • dengjin20104042056
  • 2016年08月29日 23:22
  • 1758

TCP网络编程中connect()、listen()和accept()三者之间的关系

基于 TCP 的网络编程开发分为服务器端和客户端两部分,常见的核心步骤和流程如下: connect()函数 对于客户端的 connect() 函数,该函数的功能为客户端主动连接服务器,建立连接是通...
  • tennysonsky
  • tennysonsky
  • 2015年05月10日 18:34
  • 13165

C/C++ socket编程教程之六:使用listen(),accept(),write(),read()函数

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

7、使用listen()和accept()函数

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

linux网络编程常用函数详解与实例(socket-->bind-->listen-->accept)

常用的网络命令: netstat 命令netstat是用来显示网络的连接,路由表和接口统计等网络的信息.netstat有许多的选项我们常用的选项是 -an 用来显示详细的网络状态.至于其它的选项我...
  • yxfabcdefg
  • yxfabcdefg
  • 2014年08月01日 16:50
  • 268

listen和accept函数解析

函数原型: #include int listen(int s, int backlog); 函数功能:listen函数使用主动连接套接口变为被连接套接口,使得一个进程可以接受其它进程的请求,...
  • diaolingle
  • diaolingle
  • 2016年04月12日 00:16
  • 974

listen()与accept()函数的区别

listen函数 摘要:listen函数使用主动连接套接口变为被连接套接口,使得一个进程可以接受其它进程的请求,从而成为一个服务器进程。在TCP服务器编程中listen函数把进程变为一个服务器,...
  • liusandian
  • liusandian
  • 2016年06月29日 19:45
  • 243

SOCKET API和TCP STATE的对应关系__三次握手(listen,accept,connect)__四次挥手close及TCP延迟确认(调用一次setsockopt函数,设置TCP_QUI

在我们学习网络基础时,传输层的协议有TCP和UDP; 在Linux网络编程中,我们使用socket API,实现网络通信。 那么:         socket API 和 TCP 协议中各个状...
  • qq_21949217
  • qq_21949217
  • 2015年01月09日 11:51
  • 562

Socket通信 listen accept 函数

在服务器端,socket()返回的套接字用于监听(listen)和接受(accept)客户端的连接请求。这个套接字不能用于与客户端之间发送和接收数据。   accept()接受一个客户端的连接请求,并...
  • macdroid
  • macdroid
  • 2015年03月10日 20:32
  • 654
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:使用listen()和accept()函数
举报原因:
原因补充:

(最多只允许输入30个字)