网络编程中的缓冲区溢出

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

客户端:

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


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


评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

盼盼编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值