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() 関数は、モニター対象のプロセスとの 1 つまたは複数の TCP 接続を確立します。TCP 接続の数は、Port_list にある各アドレスのプロトコル値によって異なります (後述)。
scds_get_netaddr_list(3HA) を使用して、リソースのネットワークアドレスのリストを取得できます。この関数はまた、リスト内の各アドレスのプロトコル値を設定します。あるアドレスのプロトコルが tcp6 であると Port_list に指定されている場合、プロトコル値は SCDS_IPPROTO_TCP6 に設定されます。あるアドレスのプロトコルが tcp であると Port_list に指定されている場合、または Port_list にプロトコルが指定されていない場合、プロトコル値は SCDS_IPPROTO_TCP に設定されます。
この関数はまた、addr に指定された hostname を解決して、次のように接続します。
addr に指定されたプロトコルが SCDS_IPPROTO_TCP である場合、指定されたポートの hostname の IPv4 アドレスに接続します。
addr で指定されたプロトコルが SCDS_IPPROTO_TCP6 である場合は、指定されたポートにある hostname の IPv4 アドレス (存在する場合) と IPv6 アドレス (存在する場合) の両方。ステータスとファイル記述子は (利用できる場合のみ)、この関数に指定された scds_socket_t 配列に格納されます。この配列の 1 番目のメンバーは IPv4 マッピングに使用され、2 番目のメンバーは IPv6 用に使用されます。ステータスに設定できる値は、次のいずれかです。
SCDS_FMSOCK_OK -- 操作が成功し、関連付けられたソケットファイル記述子は有効です。
SCDS_FMSOCK_NA -- このアドレスの種類 (IPv4 または IPv6) は、この hostname には適用されません。hostname に 1 つまたは複数の IPv4 マッピングしかない場合、この関数に指定された配列の 2 番目のメンバーのステータスは SCDS_FMSOCK_NA に設定されます。関連するソケットファイル記述子は未知の値に設定されるため、絶対に使用できません。
SCDS_FMSOCK_ERR -- 操作が失敗またはタイムアウトしました。関連するソケットファイル記述子は未知の値に設定されるため、絶対に使用できません。
次のパラメータがサポートされます。
scds_initialize(3HA) から返されるハンドルです。
メンバー SCDS_MAX_IPADDR_TYPES から構成される型 scds_socket_t の配列です。配列内の各メンバーは、TCP 接続のステータスとソケットファイル記述子を保持します。このパラメータは、この関数が設定する出力引数です。
socklist 配列のメンバー数です。このパラメータは SCDS_MAX_IPADDR_TYPES に設定します。
プロセスが待機する場所を指定する hostname、TCP ポート番号、およびプロトコル識別子です。
タイムアウト値 (秒) です。各ソケットはこれと同じ時間をタイムアウトとして使用して、接続を確立しようとします。これらの時間は並行に進行するため、この値は事実上、関数の実行にかかる最大時間となります。
scds_fm_net_connect() 関数の戻り値は次のとおりです。
関数の実行に成功。少なくとも 1 つのソケットが接続されました。
この関数は無効なパラメータを使用して呼び出されました。
タイムアウトや接続の拒否などのエラーのため、接続は確立されていません。エラーを正確に判断するには、socklist 配列のすべてのメンバーについて、status フィールドが SCDS_FMSOCK_ERR に設定されているかどうかを調査します。
関数が正常に終了。
関数の実行中に内部エラーが発生したことを示します。
サーバーが接続要求を拒否したことを示します。
接続要求がタイムアウトしたことを示します。
/* 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)