accept函数实际上是在三次握手之后,具体原因请看文章结尾具体解释。

基本TCP客户端/服务器程序的套接字函数

accept函数由TCP服务器调用,用于从已完成连接队列队头返回下一个已完成连接(从这不难看出accept是在三次握手之后,文章最后具体说明,已完成连接队列请转连接自行观看)。如果已完成队列为空,那么进程被投入睡眠(嘉定套接字为默认的阻塞方式)。

#include<sys/socket.h>

int accept(int sockfd, struct sockaddr *cliaddr, socklen_t *addrlen);

返回:若成功返回非负描述符,若出错则为-1

参数cliaddr和addrlen用来返回已连接的对端进程(客户)的协议地址。addrlen是值-结果参数:调用前,我们将由*addrlen所引用的整数值置为由cliaddr所指的套接字地址结构的长度,返回时,该整数值即为由内核存放在该套接字地址结构内的确切字节数。

如果accept连接成功,那么其返回值是有内核自动生成的一个全新描述符,代表与所返回客户的TCP连接。在讨论accept,我们称它的第一个参数为监听套接字描述符,返回值为已连接套接字描述符。区分这两个套接字分厂重要,一个服务器通常仅仅创建一个监听套接字,他在该服务器的生命周期内一直存在。内核为每个服务器进程接收的客户连接创建一个已连接套接字。当服务器完成对某个给定客户的服务时,已连接套接字就被关闭。

本函数最多返回三个值:一个既可能是新套接字描述符也可能是出错指示的整数、客户进程的协议地址以及改地址的大小。如果我们对返回客户协议地址不感兴趣,那么可以把cliaddr和addrlen均值为空指针。

accept应该位于第三次握手之后,我们来看看TCP连接过程:

初始:客户端处于CLOSED状态,而服务器端从CLOSED状态变为LISTEN状态

第一步:客户端发送一个SYN序列号

第二步:服务器端接收来自客户端的连接请求,并返回ACK+SYN

第三步:客户端接收消息,返回ACK

在第三步之后,服务器接收到消息,连接就完成了。这样就可以调用accept函数获得此连接。

accept其实也可以在第三步,原因是,此时accept函数要给此次连接分配资源,最初是想这样设计;但是,设想如果有10000甚至更多个客户端都和该服务器连接,发送SYN,服务端收到之后,这些客户端却不再理会服务端的回复,然而此时服务端的资源却都用accept()分配了。这就是所谓的“DDOS攻击”。

为了解决这个问题,accept()于是被放在三次握手之后。

当然,这样也不能保证不能被攻击,当然这是后话。

网络编程之accept函数和accept函数在三次握手中的位置相关推荐

  1. python中import re_Python编程之Re模块下的函数介绍

    re模块下的函数 compile(pattern):创建模式对象 import re pat=re.compile('A') m=pat.search('CBA') #等价于 re.search('A ...

  2. Python中的网络编程之TCP

    Python中的网络编程之TCP 文章目录 Python中的网络编程之TCP 1.TCP介绍 2.TCP特点 3.TCP与UDP的不同点 4.tcp通信模型 5.tcp客户端 6.tcp服务器 7.T ...

  3. Python中的网络编程之UDP

    Python中的网络编程之UDP 文章目录 Python中的网络编程之UDP 一.Socket编程 `1.什么是客户端/服务器架构`? **`2.套接字:通信端点`** 3.套接字地址:主机-端口对 ...

  4. Python之路 - 网络编程之Socket

    Python之路 - 网络编程之Socket C/S架构 ? Socket ? 基于TCP ? 基于UDP ? Socket对象方法 ? C/S架构 ? 在网络通信中 , 一般是一方求一方应 , 求的 ...

  5. 网络编程之socket

    网络编程之socket 看到本篇文章的题目是不是很疑惑,what is this?,不要着急,但是记住一说网络编程,你就想socket,socket是实现网络编程的工具,那么什么是socket,什么是 ...

  6. 网络编程+go+java_GO语言的进阶之路-网络编程之socket

    GO语言的进阶之路-网络编程之socket 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.什么是socket; 在说socket之前,我们要对两个概念要有所了解,就是IP和端口 ...

  7. GO语言的进阶之路-网络编程之socket

    GO语言的进阶之路-网络编程之socket 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.什么是socket; 在说socket之前,我们要对两个概念要有所了解,就是IP和端口 ...

  8. java 网络编程简单聊天_网络编程之 TCP 实现简单聊天

    网络编程之 TCP 实现简单聊天 客户端 1.连接服务器 Socket 2.发送消息 package lesson02;import java.io.IOException;import java.i ...

  9. Java网络编程之TCP、UDP

    Java网络编程之TCP.UDP 2014-11-25 15:23 513人阅读 评论(0) 收藏 举报 分类: java基础及多线程(28) 版权声明:本文为博主原创文章,未经博主允许不得转载. J ...

最新文章

  1. matlab 迭代 混沌与分形实验报告,实验四 函数的迭代混沌与分形.doc
  2. document的createElement方法创建具有指定标签的DOM对象
  3. c打印无符号整数_C语言基础知识:printf的输出格式,C/C++语言编程讲解
  4. 前端学习(2767):下拉刷新的学习
  5. C++自学26:联合体(union/17)
  6. 实际参数列表和形式参数列表长度不同_Dynamo参数化轴网,这些对你很有帮助
  7. iOS设计模式 - 单例
  8. Pandas读取数据内存优化
  9. 实习踩坑之路:使用@Value注解导致Parse attempt failed for value [08:00],时间转换出错?
  10. MS SQL 2008数据库完全卸载指南
  11. nginx集群部署,实现负载均衡和nfs共享
  12. 第六章 姜小白当机立断逃莒国 姜诸儿瓜期不代终遇鬼
  13. html5ify插件,漂亮的jQuery对话框插件Dialogify
  14. 制作JavaCV应用依赖的基础Docker镜像(CentOS7+JDK8+OpenCV4)
  15. 2.基础语法:手指抽筋模拟器
  16. 【面试题】对闭包的理解?什么是闭包?
  17. 电赛知识补充——电机篇
  18. 快消行业订货系统解决方案
  19. shell脚本--if判断(数字条件、字符串条件)
  20. Kafka Eagle服务部署

热门文章

  1. 【Android自动化测试】Robot Framework+adb框架(五)——L1层测试用例
  2. 案例:图书管理(包括图书列表展示,添加、修改、删除图书功能)
  3. Cloudreve搭建公私兼备网盘、个网盘、文件分享-公有云系统
  4. Leetcode 688.Knight Probability in Chessboard
  5. gdb调试堆栈信息一堆问号如 #0 0x0000000000000000 in ?? () 看这里跟踪
  6. windows下openvc开发环境
  7. [编码] 曼彻斯特编码与解码
  8. prometheus联邦监控主机及k8s
  9. 计算机派位志愿填报技巧,2020小升初电脑随机派位填报志愿技巧
  10. 计算机控制在工业自动化中的作用,计算机在工业电器自动化控制的实现