diff -ur zabbix-1.8.3.ORIG/src/libs/zbxcomms/comms.c zabbix-1.8.3/src/libs/zbxcomms/comms.c --- zabbix-1.8.3.ORIG/src/libs/zbxcomms/comms.c 2010-08-16 11:19:31.000000000 +0300 +++ zabbix-1.8.3/src/libs/zbxcomms/comms.c 2010-11-01 01:10:06.000000000 +0200 @@ -461,6 +461,7 @@ #else int zbx_tcp_connect(zbx_sock_t *s, const char *source_ip, const char *ip, unsigned short port, int timeout) { + char *server_ips, *server_ip, *delim; ZBX_SOCKADDR servaddr_in, source_addr; struct hostent *hp; @@ -468,13 +469,6 @@ zbx_tcp_clean(s); - if (NULL == (hp = zbx_gethost(ip))) - return FAIL; - - servaddr_in.sin_family = AF_INET; - servaddr_in.sin_addr.s_addr = ((struct in_addr *)(hp->h_addr))->s_addr; - servaddr_in.sin_port = htons(port); - if (ZBX_SOCK_ERROR == (s->socket = socket(AF_INET, SOCK_STREAM, 0))) { zbx_set_tcp_strerror("Cannot create socket [%s:%d] [%s]", ip, port, strerror_from_system(zbx_sock_last_error())); @@ -498,14 +492,42 @@ zbx_tcp_timeout_set(s, timeout); - if (ZBX_TCP_ERROR == connect(s->socket, (struct sockaddr *)&servaddr_in, sizeof(ZBX_SOCKADDR))) + servaddr_in.sin_family = AF_INET; + servaddr_in.sin_port = htons(port); + + server_ip = server_ips = (NULL == ip ? NULL : strdup(ip)); + + do { - zbx_set_tcp_strerror("Cannot connect to [%s:%d] [%s]", ip, port, strerror_from_system(zbx_sock_last_error())); - zbx_tcp_close(s); - return FAIL; + delim = (NULL == server_ip ? NULL : strchr(server_ip, ',')); + if (NULL != delim) + *delim = '\0'; + + if (NULL != (hp = zbx_gethost(server_ip))) + { + servaddr_in.sin_addr.s_addr = ((struct in_addr *)(hp->h_addr))->s_addr; + + if (ZBX_TCP_ERROR != connect(s->socket, (struct sockaddr *)&servaddr_in, sizeof(ZBX_SOCKADDR))) + { + free(server_ips); + return SUCCEED; + } + zbx_set_tcp_strerror("Cannot connect to [[%s]:%d] [%s]", ip, port, strerror_from_system(zbx_sock_last_error())); + + server_ip = delim + 1; + if (NULL == ip || NULL == delim) + break; + zabbix_log(LOG_LEVEL_WARNING, "Trying next server address in list [%s]", server_ip); + } } + while (1); - return SUCCEED; + if (NULL != server_ips) + free(server_ips); + + zbx_tcp_close(s); + + return FAIL; } #endif /*HAVE_IPV6*/ diff -ur zabbix-1.8.3.ORIG/src/zabbix_agent/active.c zabbix-1.8.3/src/zabbix_agent/active.c --- zabbix-1.8.3.ORIG/src/zabbix_agent/active.c 2010-08-16 11:19:32.000000000 +0300 +++ zabbix-1.8.3/src/zabbix_agent/active.c 2010-10-31 23:14:09.000000000 +0200 @@ -1095,8 +1095,8 @@ assert(activechk_args.host); - p = strchr(activechk_args.host,','); - if(p) *p = '\0'; +// p = strchr(activechk_args.host,','); +// if(p) *p = '\0'; zabbix_log( LOG_LEVEL_INFORMATION, "zabbix_agentd active check started [%s:%u]", activechk_args.host, activechk_args.port);