先看一段客户端和服务端的部分代码:
客户端:
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'的。
要为来自对等方的不合理的行为做准备。