先看一段客户端和服务端的部分代码:

客户端:

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'的。

要为来自对等方的不合理的行为做准备。

网络编程中的缓冲区溢出相关推荐

  1. 网络编程中的关键问题总结

    网络编程中的关键问题总结 总结下网络编程中关键的细节问题,包含连接建立.连接断开.消息到达.发送消息等等: 连接建立 包括服务端接受 (accept) 新连接和客户端成功发起 (connect) 连接 ...

  2. 网络编程中BIO和NIO的区别

    网络编程中BIO和NIO的区别 先上结论 BIO中,每个请求因为要阻塞直到结果返回,所以比较好的解决是每个请求都需要一个线程来处理,但是线程又是他的制约条件. NIO中,每个请求进来都会绑定到一个ch ...

  3. 关于网络编程中MTU、TCP、UDP优化配置的一些总结

    首先要看TCP/IP协议,涉及到四层:链路层,网络层,传输层,应用层.  其中以太网(Ethernet)的数据帧在链路层 IP包在网络层 TCP或UDP包在传输层 TCP或UDP中的数据(Data)在 ...

  4. 用java网络编程中的TCP方式上传文本文件及出现的小问题

    自己今天刚学java网络编程中的TCP传输,要用TCP传输文件时,自己也是遇到了一些问题,抽空把它整理了一下,供自己以后参考使用. 首先在这个程序中,我用一个客户端,一个服务端,从客户端上传一个文本文 ...

  5. protobuf在网络编程中的应用思考

    protobuf简介 protobuf是google提供的一个开源序列化框架,类似于XML,JSON这样的数据表示语言,其最大的特点是基于二进制,因此比传统的XML表示高效短小得多.虽然是二进制数据格 ...

  6. 曲速未来 披露:由macOS NFS客户端中的缓冲区溢出引起的内核RCE

    区块链安全咨询公司 曲速未来 消息:有安全人员在Apple的macOS操作系统内核中发现的几个堆栈和堆缓冲区溢出.Apple将这些漏洞归类为内核中的远程代码执行漏洞,因此它们非常严重.攻击者可能会利用 ...

  7. 关于网络编程中的一些小问题研究总结

    关于网络编程中的一些小问题研究总结 前言 一.关于"惊群问题" 二.关于socket网络编程中的reuseport 三.关于select.poll.epoll的原理探究 3.1 关 ...

  8. python的功能模块_Python的功能模块[1] - struct - struct 在网络编程中的使用

    struct模块/ struct Module 在网络编程中,利用 socket 进行通信时,常常会用到 struct 模块,在网络通信中,大多数传递的数据以二进制流(binary data)存在.传 ...

  9. 网络编程中的超时检测

    http://blog.163.com/liukang_0404@126/blog/static/55682581201231955735693/ 我们在网络编程中常见的一种做法是:创建好套接字后以阻 ...

最新文章

  1. 大约 Apple Metal API 一些想法
  2. 跳房子(ybtoj-单调队列)
  3. poe交换机的作用和优点
  4. 【渝粤题库】陕西师范大学201701 高等数学(二)作业 (高起本、专升本)
  5. 一个java中HashMap和HashSet的应用实例
  6. 中英文论文写作指导第一部分(文题、摘要、关键字)
  7. 教师资格证面试考试详细流程来了
  8. 微信开发之网页返回关闭浏览器
  9. 【CSS基础】Sass预处理器个人学习使用记录
  10. Segue几种类型(Show、Show Detail、Present modally、Present as Popover)的区别
  11. CF1375G Tree Modification
  12. 使用aspose.word.for.java解析word文档图片并替换
  13. 为什么css放头部、js放尾部
  14. 银行业务中的清算和结算分别是什么样的过程
  15. python 识别登陆验证码图片(完整代码)
  16. 自动化测试总结报告模板
  17. 车道线识别之——增强黄色车道线
  18. 如何快速在服务器上搭建隧道ip
  19. 翼方健数CEO罗震——推动区域级数据互联互通的先行者
  20. 牛顿迭代法求平方根倒数

热门文章

  1. 【Android NDK 开发】JNI 线程 ( JNI 线程创建 | 线程执行函数 | 非 JNI 方法获取 JNIEnv 与 Java 对象 | 线程获取 JNIEnv | 全局变量设置 )
  2. 【网站搭建】搭建独立域名博客 -- 独立域名博客上线了 www.hanshuliang.com
  3. Java HashMap的put操作(Java1.8)
  4. 模板方法及策略设计模式实践
  5. 认真工作的原因以及方法
  6. dubbo与springboot的集成
  7. 201312-2ISBN编码
  8. 给GridView删除列添加删除提示
  9. .net DataGrid绑定列手动添加数据
  10. Python 语言介绍