8 提防对等实体的不友好动作
编写网络程序,需要进行防御性编程,最终要的原则是:即使两端的协议都是我们自己实现的,也不能认为对等实体会遵循应用协议.
- 检测客户端的终止
如果客户端在发送quit命令之前就崩溃或终止了,此时,客户端的tcp会向对等实体tcp发送一个FIN,服务器的读操作会返回一个EOF,服务端需要显示检测EOF(0 == recv).没必要通过心跳信号来检测客户端的丢失,只要在读操作上设置一个定时器,客户端在某段时间区间内没有发出请求,服务器就认为客户端已经丢失.FTP服务器就是这么做的. - 检测无效输入
造成应用程序崩溃的最常见的两种原因是缓冲区溢出和指针丢失.
/* readline - read a newline terminated record */
int readline( SOCKET fd, char *bufptr, size_t len )
{
char *bufx = bufptr;
static char *bp;
static int cnt = 0;
static char b[ 1500 ];
char c;
while ( --len > 0 )
{
if ( --cnt <= 0 )
{
cnt = recv( fd, b, sizeof( b ), 0 );
if ( cnt < 0 )
{
if ( errno == EINTR )
continue;
return -1;
}
if ( cnt == 0 )
return 0;
bp = b;
}
c = *bp++;
*bufptr++ = c;
if ( c == '\n' )
{
*bufptr = '\0';
return bufptr - bufx;
}
}
errno = EMSGSIZE;
return -1;
}