I made some corection to the test codes ipvs1:~# cat a.c #include <stdio.h> #include <sys/socket.h> #include <netinet/in.h> #include <fcntl.h>
int main (void) { int ret, sock, status, flags; struct sockaddr_in sa = { AF_INET }; socklen_t slen = sizeof (status); sa.sin_addr.s_addr = inet_addr ("10.1.8.48"); sa.sin_port = htons (8088); sock = socket (AF_INET, SOCK_STREAM, IPPROTO_TCP); flags = fcntl(sock, F_GETFL); fcntl (sock, F_SETFL, flags|O_NONBLOCK); ret = connect (sock, (struct sockaddr *)&sa, sizeof (sa)); printf ("connect return %d\n", ret); if (ret != 0) perror ("connect: "); /* After calling connect, keepalived use getsockopt(SO_ERROR) to get the connection status in function tcp_socket_state. But it report no error in this case. */ ret = getsockopt (sock, SOL_SOCKET, SO_ERROR, (void *) &status, &slen); if (ret != 0) perror ("getsockopt: "); printf ("status = %d\n", status); }; ipvs1:~# gcc a.c ipvs1:~# ./a.out connect return -1 connect: : Network is unreachable status = 0 ipvs1:~# Bin Tian wrote: > Package: keepalived > Version: 1.1.15-1 > Severity: normal > > If you add an unreachable route to one realserver, the healthchecker doesn't > remove the realserver. > > For example, > > # ip ro add unreachable 10.1.8.48 > # telnet 10.1.8.48 80 > Trying 10.1.8.48... > telnet: Unable to connect to remote host: Network is unreachable > > But HTTP_GET/SMTP_CHECK/TCP_CHECK isn't aware of the connect problem. > > The following codes may be helpful to solve the problem > > ipvs1:~# cat a.c > #include <stdio.h> > #include <sys/socket.h> > #include <netinet/in.h> > > int main (void) > { > int ret, sock, status; > struct sockaddr_in sa = { AF_INET }; > socklen_t slen = sizeof (status); > > sa.sin_addr.s_addr = inet_addr ("10.1.8.48"); > sa.sin_port = htons (80); > > sock = socket (AF_INET, SOCK_STREAM, IPPROTO_TCP); > ret = connect (sock, (struct sockaddr *)&sa, sizeof (sa)); > printf ("connect return %d\n", ret); > if (ret != 0) > perror ("connect: "); > > /* > After calling connect, keepalived use > getsockopt(SO_ERROR) > to get the connection status in function > tcp_socket_state. > But it report no error in this case. > */ > ret = getsockopt (sock, SOL_SOCKET, SO_ERROR, (void *) &status, > &slen); > if (ret != 0) > perror ("getsockopt: "); > printf ("status = %d\n", status); > }; > ipvs1:~# gcc a.c > ipvs1:~# ./a.out > connect return -1 > connect: : Network is unreachable > status = 0 > ipvs1:~# > > -- System Information: > Debian Release: lenny/sid > APT prefers testing > APT policy: (500, 'testing') > Architecture: amd64 (x86_64) > > Kernel: Linux 2.6.26-1-amd64 (SMP w/4 CPU cores) > Locale: LANG=zh_CN.UTF-8, LC_CTYPE=zh_CN.UTF-8 (charmap=UTF-8) > Shell: /bin/sh linked to /bin/dash > > Versions of packages keepalived depends on: > ii iproute 20080725-2 networking and traffic control > too > ii ipvsadm 1:1.24-2 Linux Virtual Server support > progr > ii libc6 2.7-15 GNU C Library: Shared libraries > ii libpopt0 1.14-4 lib for parsing cmdline > parameters > ii libssl0.9.8 0.9.8g-13 SSL shared libraries > > keepalived recommends no packages. > > keepalived suggests no packages. > > -- no debconf information > > > -- To UNSUBSCRIBE, email to [EMAIL PROTECTED] with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]