本节介绍创建使用 keepalive 的应用程序所需的编程代码。这不是一本编程手册,它要求您事先掌握 C 编程和网络概念的知识。我假设您熟悉套接字以及与应用程序的总体方面相关的所有内容。
并非所有网络应用程序都需要 keepalive 支持。请记住,这是 TCP keepalive 支持。因此,您可以想象,只有 TCP 套接字才能利用它。
在编写应用程序时,您可以做的最棒的事情是使其尽可能可定制,而不是强制用户做出决定。如果您想考虑用户的满意度,则应实现 keepalive,并让用户通过使用配置参数或命令行开关来决定是否要使用它。
要为特定套接字启用 keepalive,您只需在套接字本身上设置特定的套接字选项即可。该函数的原型如下:
int setsockopt(int s, int level, int optname, const void *optval, socklen_t optlen) |
第一个参数是套接字,之前使用 socket(2) 创建的;第二个参数必须是SOL_SOCKET,第三个参数必须是SO_KEEPALIVE。第四个参数必须是布尔整数值,指示我们要启用该选项,而最后一个参数是之前传递的值的大小。
根据 manpage,成功时返回 0,错误时返回 -1(并且errno已正确设置)。
在编写应用程序时,您还可以为 keepalive 设置另外三个套接字选项。它们都使用SOL_TCP级别,而不是SOL_SOCKET,它们仅针对当前套接字覆盖系统级变量。如果您先读取而不写入,则将返回当前的系统级参数。
TCP_KEEPCNT:覆盖tcp_keepalive_probes
TCP_KEEPIDLE:覆盖tcp_keepalive_time
TCP_KEEPINTVL:覆盖tcp_keepalive_intvl
这是一个小例子,它创建一个套接字,显示 keepalive 已禁用,然后启用它并检查该选项是否已有效设置。
/* --- begin of keepalive test program --- */ #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> int main(void); int main() { int s; int optval; socklen_t optlen = sizeof(optval); /* Create the socket */ if((s = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) { perror("socket()"); exit(EXIT_FAILURE); } /* Check the status for the keepalive option */ if(getsockopt(s, SOL_SOCKET, SO_KEEPALIVE, &optval, &optlen) < 0) { perror("getsockopt()"); close(s); exit(EXIT_FAILURE); } printf("SO_KEEPALIVE is %s\n", (optval ? "ON" : "OFF")); /* Set the option active */ optval = 1; optlen = sizeof(optval); if(setsockopt(s, SOL_SOCKET, SO_KEEPALIVE, &optval, optlen) < 0) { perror("setsockopt()"); close(s); exit(EXIT_FAILURE); } printf("SO_KEEPALIVE set on socket\n"); /* Check the status again */ if(getsockopt(s, SOL_SOCKET, SO_KEEPALIVE, &optval, &optlen) < 0) { perror("getsockopt()"); close(s); exit(EXIT_FAILURE); } printf("SO_KEEPALIVE is %s\n", (optval ? "ON" : "OFF")); close(s); exit(EXIT_SUCCESS); } /* --- end of keepalive test program --- */ |