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-操作失败或超时。关联的套接字文件描述符将设置为未知值,且永不应使用。
支持以下参数:
由 scds_initialize(3HA) 返回的句柄。
scds_socket_t 类型的 SCDS_MAX_IPADDR_TYPES 成员构成的数组。数组中的每个成员为 TCP 连接保存一种状态和一个套接字文件描述符。此参数是由此函数设置的输出参数。
socklist 数组中成员的数量。将此参数设置为 SCDS_MAX_IPADDR_TYPES。
指定进程侦听的 hostname、TCP 端口号和协议标识符。
超时值(秒)。每个套接字在超时之前等待建立连接的时间相同。因为这些时间间隔以并行方式推进,所以该值实际上是该函数的最大执行时间。
scds_fm_net_connect() 函数返回以下值:
该函数成功。至少已连接一个套接字。
调用该函数时的参数无效。
由于超时、连接被拒绝或某些其他错误,无法建立一个连接。您可以检查 socklist 数组中所有成员的设置为 SCDS_FMSOCK_ERR 的 status 字段来确定确切的错误。
表明函数执行成功。
表明执行函数时发生内部错误。
表明连接请求被服务器拒绝。
表明连接请求超时。
/* 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); }
头文件
库
有关下列属性的说明,请参见 attributes(5):
|
scds_fm_net_disconnect(3HA)、scds_fm_tcp_connect(3HA)、scds_get_netaddr_list(3HA)、scds_initialize(3HA)、scha_calls(3HA)、attributes(5)