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

listen() 函数

通过 listen() 函数可以让套接字进入被动监听状态

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

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

sock 为服务器端套接字

addr 为 sockaddr_in 结构体变量(使用强制转化为 sockaddr类型的,在前面学bind中有)

addrlen 为参数 addr 的长度,可由 sizeof() 求得。

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

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

最新文章

  1. Android数据加密之MD5加密
  2. 详解Linux命令行下常用svn命令
  3. 用<forEach>遍历list集合时,提示我找不到对象的属性
  4. AIX系统程序异常不释放光驱处理
  5. struts2:遍历自定义字符串数组,遍历Action实例所引用对象中的数组
  6. 校内OJ 1128 词链(link)(Trie+DFS)
  7. jsp页面揣出现Invalid action class configuration that references an unknown class解决方案
  8. 如何写一个简单的Web Server(一)
  9. UI2_UICollectionViewPicture
  10. Delphi的windows剪切板操作函数
  11. poj3122
  12. 【转】Windows平台下Git服务器搭建
  13. Android中各种Adapter的使用方法
  14. C#读取excel等表格常用方法
  15. spring,hibernate配置事务
  16. 关于HTML学习整理(一)
  17. ReactiveSwift源码解析(十一) Atomic的代码实现以及其中的Defer延迟、Posix互斥锁、递归锁
  18. javascript之JSON小案例,实现添加数据与清楚数据
  19. 初探APT攻击
  20. Webpack+Typescript 简易配置

热门文章

  1. 2018-2019 ICPC, NEERC, Southern Subregional Contest (codeforces 1070)
  2. 剑指offer-2:斐波那契数列
  3. ES各种操作的过程
  4. 【Java】 ArrayList和LinkedList实现(简单手写)以及分析它们的区别
  5. mac StarUML3.0.2破解
  6. SQL函数 Convert,dateadd
  7. pyinstaller 打包工具的使用方法
  8. 记一次使用dubbo过程中版本冲突导致的坑
  9. Lengauer-Tarjan算法的相关证明
  10. day_05 运算符 if和while的使用