网络编程中的缓冲区溢出
先看一段客户端和服务端的部分代码:
客户端:
char sendBuf[7] = "123456";
send(fd,sendBuf,strlen(sendBuf),0);
服务端:
char recvBuf[6] = {0};
recv(fd,recvbuf,sizeof(recvbuf),0);
为了简略客户端和服务端建立连接的代码省略了。咋看好像没啥问题,客户端发了6个字节数据给服务端,而且服务端也接收了6个字节,但是实际这段代码是有问题的,这会导致接收缓冲区溢出。
下面来分析一下,客户端发了6个字节到服务端,注意strlen(sendbuf)发送时时不带'\0'的,刚好recvBuf只能存放6个字节时,此时recvBuf末尾没有'\0',这就会造成缓冲区溢出。
客户端的正确代码应该为:
send(fd,sendBuf,strlen(sendBuf)+1,0);
多增加一个把'\0'发过去,这样无论服务端缓冲区是否初始化,都不会造成缓冲区溢出。
服务端正确代码为:
recv(fd,recvBuf,sizeof(recvBuf)-1,0);
服务端根据自己的接收缓冲区的大小来接收数据,而且确保recvBuf末尾最后一定存在一个'\0',而且服务端的接收缓冲区一定要初始化,我们也不能保证客户端发送过来的数据时带'\0'的。
要为来自对等方的不合理的行为做准备。
网络编程中的缓冲区溢出相关推荐
- 网络编程中的关键问题总结
网络编程中的关键问题总结 总结下网络编程中关键的细节问题,包含连接建立.连接断开.消息到达.发送消息等等: 连接建立 包括服务端接受 (accept) 新连接和客户端成功发起 (connect) 连接 ...
- 网络编程中BIO和NIO的区别
网络编程中BIO和NIO的区别 先上结论 BIO中,每个请求因为要阻塞直到结果返回,所以比较好的解决是每个请求都需要一个线程来处理,但是线程又是他的制约条件. NIO中,每个请求进来都会绑定到一个ch ...
- 关于网络编程中MTU、TCP、UDP优化配置的一些总结
首先要看TCP/IP协议,涉及到四层:链路层,网络层,传输层,应用层. 其中以太网(Ethernet)的数据帧在链路层 IP包在网络层 TCP或UDP包在传输层 TCP或UDP中的数据(Data)在 ...
- 用java网络编程中的TCP方式上传文本文件及出现的小问题
自己今天刚学java网络编程中的TCP传输,要用TCP传输文件时,自己也是遇到了一些问题,抽空把它整理了一下,供自己以后参考使用. 首先在这个程序中,我用一个客户端,一个服务端,从客户端上传一个文本文 ...
- protobuf在网络编程中的应用思考
protobuf简介 protobuf是google提供的一个开源序列化框架,类似于XML,JSON这样的数据表示语言,其最大的特点是基于二进制,因此比传统的XML表示高效短小得多.虽然是二进制数据格 ...
- 曲速未来 披露:由macOS NFS客户端中的缓冲区溢出引起的内核RCE
区块链安全咨询公司 曲速未来 消息:有安全人员在Apple的macOS操作系统内核中发现的几个堆栈和堆缓冲区溢出.Apple将这些漏洞归类为内核中的远程代码执行漏洞,因此它们非常严重.攻击者可能会利用 ...
- 关于网络编程中的一些小问题研究总结
关于网络编程中的一些小问题研究总结 前言 一.关于"惊群问题" 二.关于socket网络编程中的reuseport 三.关于select.poll.epoll的原理探究 3.1 关 ...
- python的功能模块_Python的功能模块[1] - struct - struct 在网络编程中的使用
struct模块/ struct Module 在网络编程中,利用 socket 进行通信时,常常会用到 struct 模块,在网络通信中,大多数传递的数据以二进制流(binary data)存在.传 ...
- 网络编程中的超时检测
http://blog.163.com/liukang_0404@126/blog/static/55682581201231955735693/ 我们在网络编程中常见的一种做法是:创建好套接字后以阻 ...
最新文章
- 大约 Apple Metal API 一些想法
- 跳房子(ybtoj-单调队列)
- poe交换机的作用和优点
- 【渝粤题库】陕西师范大学201701 高等数学(二)作业 (高起本、专升本)
- 一个java中HashMap和HashSet的应用实例
- 中英文论文写作指导第一部分(文题、摘要、关键字)
- 教师资格证面试考试详细流程来了
- 微信开发之网页返回关闭浏览器
- 【CSS基础】Sass预处理器个人学习使用记录
- Segue几种类型(Show、Show Detail、Present modally、Present as Popover)的区别
- CF1375G Tree Modification
- 使用aspose.word.for.java解析word文档图片并替换
- 为什么css放头部、js放尾部
- 银行业务中的清算和结算分别是什么样的过程
- python 识别登陆验证码图片(完整代码)
- 自动化测试总结报告模板
- 车道线识别之——增强黄色车道线
- 如何快速在服务器上搭建隧道ip
- 翼方健数CEO罗震——推动区域级数据互联互通的先行者
- 牛顿迭代法求平方根倒数
热门文章
- 【Android NDK 开发】JNI 线程 ( JNI 线程创建 | 线程执行函数 | 非 JNI 方法获取 JNIEnv 与 Java 对象 | 线程获取 JNIEnv | 全局变量设置 )
- 【网站搭建】搭建独立域名博客 -- 独立域名博客上线了 www.hanshuliang.com
- Java HashMap的put操作(Java1.8)
- 模板方法及策略设计模式实践
- 认真工作的原因以及方法
- dubbo与springboot的集成
- 201312-2ISBN编码
- 给GridView删除列添加删除提示
- .net DataGrid绑定列手动添加数据
- Python 语言介绍