网络编程中的缓冲区溢出

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

客户端:

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


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


猜你喜欢

转载自blog.csdn.net/ma2595162349/article/details/80288500