Oracle® Solaris Cluster 参考手册

退出打印视图

更新时间: 2014 年 7 月,E51743-01
 
 

scds_fm_net_connect (3HA)

名称

scds_fm_net_connect - 建立与应用程序的 TCP 连接

用法概要

cc [flags…] –I /usr/cluster/include file –L /usr/cluster/lib –l dsdev#include <rgm/libdsdev.h> scha_err_t scds_fm_net_connect(scds_handle_t handle, scds_socket_t *socklist, int count, scds_netaddr_t addr, time_t timeout);

描述

scds_fm_net_connect() 函数可建立到受监视进程的一个或多个 TCP 连接(取决于每个地址的 Port_list 协议值,如下所述)。

您可以通过使用 scds_get_netaddr_list(3HA) 检索资源的网络地址列表。该调用还会为列表中的每个地址填充协议值。如果 Port_list 中为该地址指定的协议是 tcp6 ,则协议值将设置为 SCDS_IPPROTO_TCP6。如果 Port_list 中为该地址指定的协议是 tcp,或者未在 Port_list 中指定任何协议,则协议值将设置为 SCDS_IPPROTO_TCP

此函数还会解析 addr 中提供的 hostname 并连接到:

  • hostname 在指定端口的 IPv4 地址(如果 addr 中指定的协议是 SCDS_IPPROTO_TCP)。

  • hostname 在指定端口的 IPv4 地址(如果存在一个)和 IPv6 地址(如果存在一个)(如果 addr 中指定的协议是 SCDS_IPPROTO_TCP6 )。状态和文件描述符(如果适用)将存储在提供给此函数的 scds_socket_t 数组中。此数组的第一个成员用于 IPv4 映射,第二个成员用于 IPv6 映射。可将状态设置为以下值之一:

    • SCDS_FMSOCK_OK-操作成功且关联的套接字文件描述符有效。

    • SCDS_FMSOCK_NA-地址类型(IPv4 或 IPv6)不适用于此 hostname。如果 hostname 仅包含一个或多个 IPv4 映射,则传递给此函数的数组中第二个成员的状态会设置为 SCDS_FMSOCK_NA。关联的套接字文件描述符将设置为未知值,且永不应使用。

    • SCDS_FMSOCK_ERR-操作失败或超时。关联的套接字文件描述符将设置为未知值,且永不应使用。

参数

支持以下参数:

handle

scds_initialize(3HA) 返回的句柄。

socklist

scds_socket_t 类型的 SCDS_MAX_IPADDR_TYPES 成员构成的数组。数组中的每个成员为 TCP 连接保存一种状态和一个套接字文件描述符。此参数是由此函数设置的输出参数。

count

socklist 数组中成员的数量。将此参数设置为 SCDS_MAX_IPADDR_TYPES

addr

指定进程侦听的 hostname、TCP 端口号和协议标识符。

timeout

超时值(秒)。每个套接字在超时之前等待建立连接的时间相同。因为这些时间间隔以并行方式推进,所以该值实际上是该函数的最大执行时间。

返回值

scds_fm_net_connect() 函数返回以下值:

0

该函数成功。至少已连接一个套接字。

SCHA_ERR_INVAL

调用该函数时的参数无效。

非零值

由于超时、连接被拒绝或某些其他错误,无法建立一个连接。您可以检查 socklist 数组中所有成员的设置为 SCDS_FMSOCK_ERR status 字段来确定确切的错误。

错误

SCHA_ERR_NOERR

表明函数执行成功。

SCHA_ERR_INTERNAL

表明执行函数时发生内部错误。

SCHA_ERR_STATE

表明连接请求被服务器拒绝。

SCHA_ERR_TIMEOUT

表明连接请求超时。

示例

示例 1 使用 scds_fm_net_connect() 函数

/* this function is called repeatedly, 
   after thorough_probe_interval seconds */
int probe(scds_handle_t scds_handle, ...)
{
	scds_socket_t socklist[SCDS_MAX_IPADDR_TYPES];
	...

	/* for each hostname/port/proto */
	for (i = 0; i < netaddr->num_netaddrs, i++) {
		if (scds_fm_net_connect(scds_handle, socklist,
		    SCDS_MAX_IPADDR_TYPES, netaddr[i], timeout) !=
		    SCHA_ERR_NOERR)
			{
				/* failed completely */
				...
		} else {
			/* at least one sock connected */
			for (j = 0, j < SCDS_MAX_IPADDR_TYPES, j++) {
				if (socklist[j].status == SCDS_FM_SOCK_NA)
					continue;

				if (socklist[j].status == SCDS_FMSOCK_ERR) {
					/* this particular connection failed */
					scds_syslog(LOG_ERR, "Failed: %s",
					    scds_error_string(socklist[j].err));
					continue;
				}

				/* use socklist[i].fd to perform write/read */
				...
			}
			(void) scds_fm_net_disconnect(scds_handle, socklist,
			    SCDS_MAX_IPADDR_TYPES, remaining_time);
		}
		
	}
	...
	return (result);
}

文件

/usr/cluster/include/rgm/libdsdev.h

头文件

/usr/cluster/lib/libdsdev.so

属性

有关下列属性的说明,请参见 attributes(5)

属性类型
属性值
可用性
ha-cluster/developer/api
接口稳定性
Evolving(发展中)

另请参见

scds_fm_net_disconnect(3HA)scds_fm_tcp_connect(3HA)scds_get_netaddr_list(3HA)scds_initialize(3HA)scha_calls(3HA)attributes(5)