この章の目次にもどる
前頁:3.9 フォントマネージャにもどる
次頁:3.11 印刷マネージャ仕様書にすすむ

3.10 TCP/IPマネージャ

3.10.1 構成

TCP/IP マネージャは LAN を利用した TCP/IP 通信の機能を実現するモジュールでネットワーク上の別のマシンと TCP/IP プロトコルを用いて通信することができる。 TCP/IP マネージャのシステムコールはソケットを意識したものとなっている。

通信はソケットを作成し、 ソケットデスクリプタを使用して行なう。 このソケットデスクリプタはファイルデスクリプタとは別の概念であり、 TCP/IP マネージャのシステムコールではソケットデスクリプタのみを扱うことができる。

また、ソケットによる通信であっても、 同一マシン内の異なるプロセス間の通信手段として利用することはできない。

3.10.2 TCP/IP

以下のデータを定義する。

/*  プロトコルファミリ */

#define PF_UNSPEC   0       /* unspecified protocol family */
#define PF_INET     2       /* TCP/IP and related */

/*  アドレスファミリ
*/
#define AF_UNSPEC   0       /* unspecified address family */
#define AF_INET     2       /* TCP/IP and related */

/*  ソケットタイプ
*/

#define SOCK_STREAM 1       /* stream socket */
#define SOCK_DGRAM  2       /* datagram socket */
#define SOCK_RAW    3       /* raw-protocol interface */

/*  getsockopt(), setsockopt() のオプション
*/

#define SOL_SOCKET      0xffff      /* options for socket level */
#define IPPROTO_TCP     0x0001      /* options for TCP level */
#define IPPROTO_IP      0x0002      /* options for IP level */

#define SO_DEBUG        0x0001      /* turn on debugging info recording */
#define SO_REUSEADDR    0x0004      /* allow local address reuse */
#define SO_KEEPALIVE    0x0008      /* keep connections alive */
#define SO_DONTROUTE    0x0010      /* just use interface addresses */
#define SO_BROADCAST    0x0020      /* permit sending of broadcast msgs */
#define SO_LINGER       0x0080      /* linger on close if data present */
#define SO_OOBINLINE    0x0100      /* leave received OOB data in line */
#define SO_SNDBUF       0x1001      /* send buffer size */
#define SO_RCVBUF       0x1002      /* receive buffer size */
#define SO_ERROR        0x1007      /* get error status and clear */
#define SO_TYPE         0x1008      /* get socket type */

#define TCP_MAXSEG      0x2000      /* maximum segment size */
#define TCP_NODELAY     0x2001      /* immediate send() */

#define IP_OPTIONS      0x0001      /* IP header options */

/*  recv, send のオプション */

#define MSG_OOB         0x01        /* send or receive out of band data */
#define MSG_PEEK        0x02        /* take data but leave it */
#define MSG_DONTROUTE   0x04        /* do not route */

/*  fcntl のオプション */

#define O_NDELAY    0x04        /* non-blocking */
#define FNDELAY     O_NDELAY    /* synonym */
#define F_GETFL     3           /* get flags */
#define F_SETFL     4           /* set flags */

/*  ioctl のオプション */

#define SIOCATMARK  7       /* check for out of bound data */

/*  アドレス */
struct sockaddr {
    unsigned short sa_family;   /* address family */
    char sa_data[14];           /* up to 14 bytes of direct address */
};

/*  インターネットアドレス */
struct in_addr {
    unsigned long s_addr;
};

/*  ソケットアドレス */
struct sockaddr_in {
    short sin_family;
    unsigned short sin_port;
    struct in_addr sin_addr;
    char sin_zero[8];
};


struct iovec {              /* address and length */
    char *iov_base;         /* base */
    int iov_len;            /* size */
};

/*  recvmsg, sendmsg 用メッセージヘッダ */
struct msghdr {             /* Message header for recvmsg and sendmsg. */
    char *msg_name;         /* optional address */
    int msg_namelen;        /* size of address */
    struct iovec *msg_iov;  /* scatter/gather array */
    int msg_iovlen;         /* # elements in msg_iov */
    char *msg_accrights;    /* access rights sent/received */
    int msg_accrightslen;
};

struct hostent {            /* structure for gethostbyname */
    char *h_name;           /* official name of host */
    char **h_aliases;       /* alias list */
    int h_addrtype;         /* host address type */
    int h_length;           /* length of address */
    char **h_addr_list;     /* list of addresses from name server */
#define h_addr h_addr_list[0]       /* address, for backward compatiblity */
};

struct servent {        /* structure for getservbyname */
    char *s_name;       /* official service name */
    char **s_aliases;   /* alias list */
    int s_port;         /* port # */
    char *s_proto;      /* protocol to use */
};

struct linger {         /* structure for the SO_LINGER option */
    int l_onoff;        /* zero=off, nonzero = on */
    int l_linger;       /* linger time, in seconds */
};

#define FD_SETSIZE 256
typedef struct fd_set {     /* Bit mask for select() */
    int fds_bits[FD_SETSIZE/sizeof(int)];
} fd_set;

struct timeval {        /* Timeout format for select() */
    long tv_sec;        /* seconds */
    long tv_usec;       /* microseconds */
};

3.10.3 エラーコード

以下のエラーコードが定義されている。

#define EX_HOSTUNREACH  ((-401) << 16)   /* ホストが見つからない */
#define EX_TIMEDOUT     ((-402) << 16)   /* TCPIP タイムアウト */
#define EX_CONNABORTED  ((-403) << 16)   /* 接続がアボートされた */
#define EX_NOBUFS       ((-404) << 16)   /* TCPIP 内部領域不足 */
#define EX_BADF         ((-405) << 16)   /* ソケットが無効 */
#define EX_WOULDBLOCK   ((-407) << 16)   /* ブロックされる処理がある */
#define EX_MSGSIZE      ((-408) << 16)   /* 送信メッセージの細分化ができない */
#define EX_DESTADDRREQ  ((-409) << 16)   /* 送信先アドレス指定が必要 */
#define EX_PROTOTYPE    ((-410) << 16)   /* プロトコルが不正 */
#define EX_NOPROTOOPT   ((-411) << 16)   /* 利用できないプロトコル指定 */
#define EX_PROTONOSUPPORT ((-412) << 16) /* 認識されていないオプション指定 */
#define EX_SOCKTNOSUPPORT ((-413) << 16) /* サポートされていないソケットタイプ */
#define EX_OPNOTSUPP    ((-414) << 16)   /* サポートされていない動作指定 */
#define EX_PFNOSUPPORT  ((-415) << 16)   /* サポートされていないプロトコルファミリ */
#define EX_AFNOSUPPORT  ((-416) << 16)   /* サポートされていないアドレスファミリ */
#define EX_ADDRINUSE    ((-417) << 16)   /* アドレスは使用中 */
#define EX_ADDRNOTAVAIL ((-418) << 16)   /* アドレスが利用できない */
#define EX_NETDOWN      ((-419) << 16)   /* ネットワーク機能が無効 */
#define EX_NETUNREACH   ((-420) << 16)   /* ネットワークが見つからない */
#define EX_NETRESET     ((-421) << 16)   /* ネットワークがリセットされた */
#define EX_CONNRESET    ((-422) << 16)   /* 接続がリセットされた */
#define EX_ISCONN       ((-423) << 16)   /* ソケットは接続済み */
#define EX_NOTCONN      ((-424) << 16)   /* ソケットは接続されていない */
#define EX_SHUTDOWN     ((-425) << 16)   /* 送信は禁止されている */
#define EX_CONNREFUSED  ((-426) << 16)   /* 接続が拒絶された */
#define EX_HOSTDOWN     ((-427) << 16)   /* ホストがダウンしている */
#define EX_ALREADY      ((-428) << 16)   /* 既に処理中の動作 */
#define EX_INPROGRESS   ((-429) << 16)   /* 非ブロック化ソケットで接続中 */

3.10.4 システムコール

so_start
 
TCP/IPの初期化

【形式】

ERR so_start (W arg)

【パラメータ】

W   arg 特殊用途の引数

【リターン値】

=0  正常
<0  エラー(エラーコード)

【解説】

TCP/IP 通信を初期化する。 通常はアプリケーションプロセスが TCPIPMGR のその他のシステムコールを呼び出すと暗黙的に TCP/IP 通信の初期化が行なわれる。

so_finish
 
TCP/IPの終了宣言

【形式】

ERR so_finish (W arg)

【パラメータ】

W   arg 0   終了宣言
      <0  特殊用途

【リターン値】

≧0     正常
<0     エラー

【解説】

TCP/IP の終了宣言。
プロセス終了時に自動的に呼び出されるので通常は、明示的に呼び出す必要はない。

【エラーコード】

ER_BUSY     TCP/IP ロック中。
EX_NOSPT    TCP/IP を使用していないのに so_finish を呼び出した。
so_accept
 
ソケットへの接続受け付け

【形式】

WERR    so_accept (W s, SOCKADDR *nam, W *namlen)

【パラメータ】

W         s      ソケットデスクリプタ
SOCKADDR *nam    アドレスが戻される
W        *namlen アドレスのバイト長

【リターン値】

≧0 新規生成されたソケットデスクリプタ
<0  エラーコード

【解説】

listen 状態にあるソケットに対して接続要求を待ち、 要求があったときに最初の要求を取りだし、 ソケット s と同じ属性の新しいソケットを生成しそのデスクリプタを戻す。

接続要求元のアドレスとその長さが、 nam および namlen に戻される。

元のソケット s は、 次の要求を受け付けるためにオープンされたままとなる。

【エラーコード】

EX_ADR          パラメータでアクセスが許されていない領域を参照している。
EX_PAR          パラメータが不正(ソケットデスクリプタの値が不正)
EX_BADF         ソケットが無効
EX_WOULDBLOCK   ソケットが非ブロック化されていて、接続要求がない
EX_NOBUFS       内部領域不足
so_bind
 
ソケットへの名前のバインド

【形式】

ERR so_bind (W s, SOCKADDR *nam, W namlen)

【パラメータ】

W         s      ソケット
SOCKADDR *nam    アドレス
W        namlen  アドレスのバイト長

【リターン値】

=0  正常
<0  エラー

【解説】

名前なしのソケットに nam および namlen で指定した名前を割り当てる。

【エラーコード】

EX_ADR          パラメータでアクセスが許されていない領域を参照している。
EX_PAR          パラメータが不正(ソケットデスクリプタの値が不正)。
EX_BADF        ソケットが無効。
EX_FAULT        名前が不正。
EX_ADDRNOTAVAIL 名前(アドレス)が利用できない。
EX_ADDRINUSE    名前(アドレス)は使用中。
so_close
 
ソケットを閉じる

【形式】

ERR so_close (W s)

【パラメータ】

W s ソケットデスクリプタ

【リターン値】

=0  正常
<0  エラー

【解説】

ソケットをクローズする。

【エラーコード】

EX_PAR      パラメータが不正(ソケットデスクリプタの値が不正)
EX_BADF     ソケットが無効。
so_connect
 
ソケットへの接続の開始

【形式】

ERR so_connect (W s, SOCKADDR *nam, W namlen)

【パラメータ】

W        s       ソケットデスクリプタ
SOCKADDR *na m   アドレス
W        namlen  アドレスのバイト長

【リターン値】

=0  正常
<0  エラー

【解説】

sSOCK_DGRAM 型ソケットの場合は、 ソケットに関連づけられる通信先のアドレスを指定する。

sSOCK_STREAM 型ソケットの場合は、 指定されたアドレスへの接続を行なう。

【エラーコード】

EX_PAR          パラメータが不正(ソケットデスクリプタの値が不正)
EX_ADR          パラメータでアクセスが許されていない領域を参照している。
EX_BADF         ソケットが無効。
EX_FAULT        名前(アドレス)が不正。
EX_HOSTUNREACH  接続先が不正。
EX_INPROGRESS   ソケットが非ブロック型で、接続がすぐに完了しない。
EX_TIMEDOUT     タイムアウト。
EX_CONNABORTED  接続がアボートされた。
so_fcntl
 
ソケットの制御

【形式】

WERR    so_fcntl (W s, W cmd, W arg)

【パラメータ】

W   s   ソケットデスクリプタ
W   cmd 以下
        F_GETFL     デスクリプタ状態フラグを取得する
        F_SETFL     デスクリプタ状態フラグを設定する
W   arg フラグ値

【リターン値】

≧0 フラグ値(F_GETFL)
<0  エラー

【解説】

ソケットデスクリプタの状態フラグを取得/設定する。
有効なフラグ値は O_NDELAY のみである。
O_NDELAY を指定されたソケットは非ブロック状態となり、 ソケットに関連したシステムコールでは待ちに入らなくなる。

【エラーコード】

EX_PAR      パラメータが不正(ソケットデスクリプタの値が不正)
EX_BADF     ソケットが無効。
so_gethostbyname
 
名前によるホスト情報の取得

【形式】

ERR so_gethostbyname (B *nam, HOSTENT *hp, B *buf)

【パラメータ】

B*      nam     ホスト名
HOSTENT *hp     ホスト情報
B       *buf    作業領域

【リターン値】

=0  正常
<0  エラー

【解説】

nam で指定された名前を持つホストに関する情報を hp で指定された領域に格納する。
B buf[HBUFLE] で定義される作業領域を指定する必要がある。

hp が指す領域には以下の情報が戻される。

struct hostent {                    /* structure for gethostbyname */
        char *h_name;               /* official name of host */
        char **h_aliases;           /* alias list */
        int h_addrtype;             /* host address type */
        int h_length;               /* length of address */
        char **h_addr_list;         /* list of addresses from nameserver */
        #define h_addr h_addr_list[0]
                                    /* address, for backward compatiblity */
};

h_name      ホストの正式名
h_aliases   ホストのエイリアス名(実装では NULL が戻る)
h_addrtype  アドレスタイプ(常に AF_INET が戻る)
h_length    アドレスのバイト長
h_addr_list ホストのネットワークアドレスのリストへのポインタ

【エラーコード】

EX_ADR          パラメータでアクセスが許されていない領域を参照している。
EX_HOSTUNREACH  指定されたホストが見つからない。
EX_TIMEDOUT     タイムアウト。
so_gethostbyaddr
 
アドレスによるホスト情報の取得

【形式】

ERR so_gethostbyaddr (B *addr, W type, W len, HOSTENT *hp, B *buf)

【パラメータ】

B       *addr   アドレス
W       type    アドレスタイプ(AF_INET のみ指定可能)
W       len     アドレスのバイト長
HOSTENT *hp     ホスト情報
B       *buf    作業領域

【リターン値】

=0  正常
<0  エラー

【解説】

アドレスで指定されたホストに関する情報を hp で指定された領域に格納する。
B buf[HBUFLE] で定義される作業領域を指定する必要がある。

【エラーコード】

EX_ADR          パラメータでアクセスが許されていない領域を参照している。
EX_HOSTUNREACH  指定されたホストが見つからない
ERR so_getpeername
 
接続相手の名前の取得

【形式】

    ERR so_getpeername (W s, SOCKADDR *nam, W *namlen)

【パラメータ】

W        s       ソケットデスクリプタ
SOCKADDR *nam    アドレス
W        *namlen アドレスのバイト長

【リターン値】

=0  正常
<0  エラー

【解説】

ソケットに接続されている相手のアドレスを戻す。
namlennam が指す領域のサイズを指定する。 実行後は nam に戻されたアドレスのバイト長が戻される。

【エラーコード】

EX_ADR      パラメータでアクセスが許されていない領域を参照している。
EX_PAR      パラメータが不正(ソケットデスクリプタの値が不正)
EX_BADF     ソケットが無効。
EX_FAULT    名前(アドレス)が不正。
so_getsockname
 
ソケット名の獲得

【形式】

 ERR so_getsockname (W s, SOCKADDR *nam, W *namlen)

【パラメータ】

W        s   ソケットデスクリプタ
SOCKADDR *nam   アドレス
W        *namlen アドレスのバイト長

【リターン値】

=0  正常
<0  エラー

【解説】

指定したソケットに対する現在の名前(アドレス)を戻す。
namlennam のサイズを指定する。 実行後は name に戻されたアドレスのバイト長が戻される。

【エラーコード】

EX_ADR      パラメータでアクセスが許されていない領域を参照している。
EX_PAR      パラメータが不正(ソケットデスクリプタの値が不正)
EX_BADF     ソケットが無効。
EX_FAULT    名前(アドレス)が不正。
so_getsockopt
 
ソケットオプションの取得

【形式】

ERR so_getsockopt (W s, W level, W optnam, B *optval, W *optlen)

【パラメータ】

W   s   ソケットデスクリプタ
W   level   レベル
W   optnam  オプション
B   *optval オプション値
W   *optlen オプションのバイト長

【リターン値】

=0  正常
<0  エラー

【解説】

ソケットに関するオプションを取得する。

level およびオプション

IPPROTO_IP :

IP_OPTIONS optval, optlen で IP オプションを指定

IPPROTO_TCP :

TCP_NODELAY send 時にメッセージをただちに送信するか否かの状態取得
TCP_MAXSEG 最大メッセージ長を取得

SOL_SOCKET :
    SO_DEBUG        デバッグ情報の記録フラグを取得
    SO_RESUSEADDR   ローカルアドレスの再使用状態を取得
    SO_KEEPALIVE    (未サポート)
    SO_DONTROUTE    発信メッセージのためのバイパスルートの決定
    SO_BROADCAST    ブロードキャストメッセージの送信許可
    SO_LINGER       データがある場合のクローズの延期
    SO_OOBINLINE    帯域内の帯域外データの受信状態
    SO_SNDBUF       出力のためのバッファサイズを取得
    SO_RCVBUF       入力のためのバッファサイズを取得
    SO_ERROR        ソケットのエラーの取得およびクリア
    SO_TYPE         ソケットのタイプを取得
  

【エラーコード】

EX_ADR          パラメータでアクセスが許されていない領域を参照している。
EX_PAR          パラメータが不正(ソケットデスクリプタの値が不正)
EX_BADF         ソケットが無効。
EX_FAULT        不正なオプション指定。
EX_NOPROTOOPT   指定したレベルで認識されていないオプション。
so_setsockopt
 
ソケットオプションの設定
ERR so_setsockopt (W s, W level, W optnam, B *optval, W optlen)

【パラメータ】

W   s        ソケットデスクリプタ
W   level   レベル
W   optnam  オプション
B   *optval オプション値
W   *optlen オプションのバイト長

【リターン値】

=0  正常
<0  エラー

【解説】

ソケットに関するオプションを設定する。
レベルとオプションについては so_getsockopt を参照すること。
SOL_SOCKET レベルのオプションでは、 各オプションがトグルされる。

IPPROTO_IP :

IP_OPTIONS optval, optlen で IP オプションを指定

IPPROTO_TCP :

TCP_NODELAY send 時にメッセージをただちに送信するよう指定

SOL_SOCKET :
    SO_DEBUG        デバッグ情報の記録フラグをトグル
    SO_RESUSEADDR   ローカルアドレスの再使用状態をトグル
    SO_KEEPALIVE    (未サポート)
    SO_DONTROUTE    発信メッセージのためのバイパスルートの決定のトグル
    SO_BROADCAST    ブロードキャストメッセージの送信許可をトグル
    SO_LINGER       データがある場合のクローズの延期を設定
    SO_OOBINLINE    帯域内の帯域外データの受信状態をトグル
    SO_SNDBUF       出力のためのバッファサイズを設定
    SO_RCVBUF       入力のためのバッファサイズを設定
   

【エラーコード】

EX_ADR          パラメータでアクセスが許されていない領域を参照している。
EX_PAR          パラメータが不正(ソケットデスクリプタの値が不正)
EX_BADF         ソケットが無効。
EX_FAULT        不正なオプション指定。
EX_NOPROTOOPT   指定したレベルで認識されていないオプション。
so_ioctl
 
デバイスの制御

【形式】

 WERR    so_ioctl (W s, W request, W arg)

【パラメータ】

W   s       ソケットデスクリプタ
W   request 要求
W   arg     引数

【リターン値】

≧  正常
0  エラー

【解説】

ソケットに関して特殊な処理を行なう。

request
FIONREAD :

ソケットの受信バッファにたまっているメッセージのバイト数を argW* とみなしてそこに戻す。

SIOCATMARK :

ソケットが帯域外データを受信しているとき argW* とみなしてそこに 1 を戻す。

【エラーコード】

EX_ADR      パラメータでアクセスが許されていない領域を参照している。
EX_PAR      パラメータが不正(ソケットデスクリプタの値が不正)
EX_BADF     ソケットが無効。
so_listen
 
ソケット接続のためのlisten

【形式】

ERR so_listen (W s, W backlog)

【パラメータ】

W s ソケットデスクリプタ
W backlog 最大接続要求待ちキュー数

【リターン値】

=0  正常
<0  エラー

【解説】

指定したソケットを listen 状態にする。

【エラーコード】

EX_PAR      パラメータが不正(ソケットデスクリプタの値が不正)
EX_BADF     ソケットが無効。
so_read
 
ソケットからの受信

【形式】

WERR    so_read (W s, B *buf, W len)

【パラメータ】

W   s       ソケットデスクリプタ
B   *buf    受信バッファ
W   len     受信バッファのバイト長
u

【リターン値】

≧0 受信したバイト数
<0  エラー

【解説】

ソケットからメッセージを受信する。
so_recv(s, buf, len, 0) と等しい。

【エラーコード】

EX_ADR          パラメータでアクセスが許されていない領域を参照している。
EX_PAR          パラメータが不正(ソケットデスクリプタの値が不正)
EX_BADF         ソケットが無効。
EX_WOULDBLOCK   ソケットが非ブロック化されていて、受信データがない。
EX_TIMEDOUT     タイムアウト。
EX_CONNABORTED  接続がアボートされた。
EX_OPNOTSUP     サポートされていない動作指定
so_recv
 
ソケットからの受信

【形式】

WERR    so_recv (W s, B *buf, W len, W flags)

【パラメータ】

W   s       ソケットデスクリプタ
B   *buf    受信バッファ
W   len     受信バッファのバイト長
W   flags   以下の OR を指定することができる
        MSG_OOB     帯域外データを読み取る
        MSG_PEEK    ソケット上にあるデータを「のぞき見」する。
                    データは廃棄されず、それ以降の受信処理では、
                    同一データが戻る。

【リターン値】

≧0 受信したバイト数
<0  エラー

【解説】

ソケットからメッセージを受信する。 メッセージがないときは非ブロック状態の場合は EX_WOULDBLOCKを戻し、 それ以外では待ちに入る。

【エラーコード】

EX_ADR          パラメータでアクセスが許されていない領域を参照している。
EX_PAR          パラメータが不正(ソケットデスクリプタの値が不正)
EX_BADF         ソケットが無効。
EX_WOULDBLOCK   ソケットが非ブロック化されていて、受信データがない。
EX_TIMEDOUT     タイムアウト。
EX_CONNABORTED  接続がアボートされた。
EX_OPNOTSUP     サポートされていない動作指定(flag 指定が無効)
so_recvfrom
 
ソケットからの受信

【形式】

 WERR    so_recvfrom (W s, B *buf, W len, W flags, SOCKADDR *from, W *flen)

【パラメータ】

W        s       ソケットデスクリプタ
B        *buf    受信バッファ
W        len     受信バッファのバイト長
W        flags   以下の OR を指定することができる
         MSG_OOB     帯域外データを読み取る
         MSG_PEEK    ソケット上にあるデータを「のぞき見」する。
                     データは廃棄されず、それ以降の受信処理では、
                     同一データが戻る。
SOCKADDR *from   アドレス
W        *flen   アドレスのバイト長

【リターン値】

≧0 受信したバイト数
<0  エラー

【解説】

ソケットからメッセージを受信する。 メッセージがないときは非ブロック状態の場合は EX_WOULDBLOCK を戻し、 それ以外では待ちに入る。
fromNULL でないときは、 メッセージの発信元のアドレスが戻される。 *flen はアドレスのサイズを指定し、 実行後は実際のアドレスの長さが戻される。

【エラーコード】

EX_ADR          パラメータでアクセスが許されていない領域を参照している。
EX_PAR          パラメータが不正(ソケットデスクリプタの値が不正)
EX_BADF         ソケットが無効。
EX_WOULDBLOCK   ソケットが非ブロック化されていて、受信データがない。
EX_TIMEDOUT     タイムアウト。
EX_CONNABORTED  接続がアボートされた。
EX_OPNOTSUP     サポートされていない動作指定(flag 指定が無効)
so_recvmsg
 
ソケットからの受信

【形式】

WERR    so_recvmsg (W s, MSGHDR *msg, W flags)

【パラメータ】

W       s           ソケットデスクリプタ
MSGHDR  *msg        メッセージヘッダー
W       flags       以下の OR を指定することができる
        MSG_OOB     帯域外データを読み取る
        MSG_PEEK    ソケット上にあるデータを「のぞき見」する。
                    データは廃棄されず、それ以降の受信処理では、
                    同一データが戻る。

【リターン値】

≧0 受信したバイト数
<0  エラー

【解説】

ソケットからメッセージを受信する。 メッセージがないときは非ブロック状態の場合は EX_WOULDBLOCK を戻し、それ以外では待ちに入る。

構造体 msghdr で指定することができる。

          caddr_t      msg_name;         オプションのアドレス
          int          msg_namelen;      アドレスサイズ
          struct iovec *msg_iov;         配列の分散/収集
          int          msg_iovlen;       msg_iov にある構成要素の数
          caddr_t      msg_accrights;    送信または受信されたアクセス権
          int          msg_accrightslen;

msg_name, msg_namelen に相手先アドレスを指定する。 指定不要のときは msg_nameNULL を指定する。

msg_iov により一回の要求で分散したいくつかの場所に読み込むことができる。

【エラーコード】

EX_ADR          パラメータでアクセスが許されていない領域を参照している。
EX_PAR          パラメータが不正(ソケットデスクリプタの値が不正)
EX_BADF         ソケットが無効。
EX_WOULDBLOCK   ソケットが非ブロック化されていて、受信データがない。
EX_TIMEDOUT     タイムアウト。
EX_CONNABORTED  接続がアボートされた。
EX_OPNOTSUP     サポートされていない動作指定(flag 指定が無効)
so_select
 
ソケット状態の検査

【形式】

WERR    so_select (W nfds, fd_set *rfds, fd_set *wfds, fd_set *efds,
                   TIMEVAL *tmout)

【パラメータ】

W       nfds    最大ソケットデスクリプタ数
fd_set  *rfds   受信準備完了を調べるソケットデスクリプタの集合
fd_set  *wfds   送信準備完了を調べるソケットデスクリプタの集合
fd_set  *efds   例外発生を調べるソケットデスクリプタの集合
TIMEVAL *tmout  タイムアウト指定

【リターン値】

>0  準備ができているデスクリプタ数
=0  タイムアウトした。
<0  エラー

【解説】

指定したソケットデスクリプタ中で、 rfds, wfds, efds 中で準備ができているソケットがあるかどうか検査する。 rfds, wfds, efds の内容は、 準備ができているかどうかの結果が戻される。

rfds, wfds, efds は、 関連するソケットが一つもない場合は、 それぞれ NULL を指定することができる。

tmoutNULL のときは無限に待つ。 tmoutNULL でない場合は、 そこで指定された時間だけ待つ。

【エラーコード】

EX_ADR      パラメータでアクセスが許されていない領域を参照している。
so_write
 
ソケットからのメッセージ送信

【形式】

WERR    so_write (W s, B *buf, W len)

【パラメータ】

W   s       ソケットデスクリプタ
B   *buf    送信データ
W   len     送信データのバイト長

【リターン値】

≧0 送信したバイト数
<0  エラー

【解説】

ソケットの接続先にメッセージを送信する。 so_send(s, buf, len, 0) に等しい。

【エラーコード】

EX_ADR          パラメータでアクセスが許されていない領域を参照している。
EX_PAR          パラメータが不正(ソケットデスクリプタの値が不正)
EX_BADF         ソケットが無効。
EX_SHUTDOWN     送信は禁止されている。
EX_CONNABORTED  接続がアボートされた。
EX_MSGSIZE      送信メッセージサイズへの細分化ができなかった。
EX_NOBUFS       内部領域不足。
EX_WOULDBLOCK   ソケットが非ブロック化されているが、送信により待ちにはいる。
EX_TIMEOUT      タイムアウト。
so_send
 
ソケットからのメッセージ送信

【形式】

WERR    so_send (W s, B *buf, W len, W flags)

【パラメータ】

W   s       ソケットデスクリプタ
B   *buf    送信データ
W   len     送信データのバイト長
W   flags   以下の OR を指定することができる
          MSG_OOB     帯域外データを送信する。

【リターン値】

≧0 送信したバイト数
<0  エラー

【リターン値】

【解説】

ソケットの接続先にメッセージを送信する。

【エラーコード】

EX_ADR          パラメータでアクセスが許されていない領域を参照している。
EX_PAR          パラメータが不正(ソケットデスクリプタの値が不正)
EX_BADF         ソケットが無効。
EX_SHUTDOWN     送信は禁止されている。
EX_CONNABORTED  接続がアボートされた。
EX_MSGSIZE      送信メッセージサイズへの細分化がてきなかった。
EX_NOBUFS       内部領域不足。
EX_WOULDBLOCK   ソケットが非ブロック化されているが、送信により待ちにはいる。
EX_TIMEOUT      タイムアウト。
so_sendto
 
ソケットからのメッセージ送信

【形式】

WERR    so_sendto (W s, B *buf, W len, W flags, SOCKADDR *to, W tolen)

【パラメータ】

W        s           ソケットデスクリプタ
B        *buf        送信データ
W        len         送信データのバイト長
W        flags       以下の OR を指定することができる
         MSG_OOB     帯域外データを送信する。
SOCKADDR *to         送信先アドレス
W        tolen       送信先アドレスのバイト長

【リターン値】

≧0 送信したバイト数
<0  エラー

【解説】

相手先アドレスを指定して、メッセージを送信する。

【エラーコード】

EX_ADR          パラメータでアクセスが許されていない領域を参照している。
EX_PAR          パラメータが不正(ソケットデスクリプタの値が不正)
EX_BADF         ソケットが無効。
EX_SHUTDOWN     送信は禁止されている。
EX_CONNABORTED  接続がアボートされた。
EX_MSGSIZE      送信メッセージサイズへの細分化がてきなかった。
EX_NOBUFS       内部領域不足。
EX_WOULDBLOCK   ソケットが非ブロック化されているが、送信により待ちにはいる。
EX_TIMEOUT      タイムアウト。
EX_HOSTUNREACH  指定された送信先が見つからない。
EX_DESTADDRREQ  送信先アドレスの指定が必要。
so_sendmsg
 
ソケットからのメッセージ送信

【形式】

WERR    so_sendmsg (W s, MSGHDR *msg, W flags)

【パラメータ】

W       s       ソケットデスクリプタ
MSGHDR  *msg    メッセージデータ
W       flags   以下の OR を指定することができる
              MSG_OOB     帯域外データを送信する。

【リターン値】

≧0 送信したバイト数
<0  エラー

【解説】

相手先アドレスを指定して、メッセージを送信する。

【エラーコード】

EX_ADR          パラメータでアクセスが許されていない領域を参照している。
EX_PAR          パラメータが不正(ソケットデスクリプタの値が不正)
EX_BADF         ソケットが無効。
EX_SHUTDOWN     送信は禁止されている。
EX_CONNABORTED  接続がアボートされた。
EX_MSGSIZE      送信メッセージサイズへの細分化がてきなかった。
EX_NOBUFS       内部領域不足。
EX_WOULDBLOCK   ソケットが非ブロック化されているが、送信により待ちにはいる。
EX_TIMEOUT      タイムアウト。
EX_HOSTUNREACH  指定された送信先が見つからない。
so_shutdown
 
全二重接続の部分シャットダウン

【形式】

ERR so_shutdown (W s, W how)

【パラメータ】

W   s   ソケットデスクリプタ
W   how これ以降の送受信の指定
        0   以降の受信の禁止
        1   以降の送信の禁止
        2   以降の送受信の禁止

【リターン値】

【解説】

ソケットと対応する全二重通信路のすべてまたは一部をシャットダウンする。

【エラーコード】

EX_NOBUFS
EX_PAR      パラメータが不正(ソケットデスクリプタの値が不正)
EX_BADF     ソケットが無効。
so_socket
 
通信用の終点の作成

【形式】

WERR    so_socket (W domain, W type, W protocol)

【パラメータ】

W   domain      通信を行なうドメイン
                  PF_INET
                  PF_UNSPEC (PF_INET として扱われる)
W   type        通信のタイプ
                  SOCK_STREAM
                  SOCK_DGRAM
W   protocol    プロトコル
                  TCP (SOCK_STREAM タイプの時)
                  UDP (SOCK_DGRAM タイプの時)
                  ICMP    (SOCK_DGRAM タイプの時)

【リターン値】

≧0 ソケットデスクリプタ
<0  エラー

【解説】

ソケットを作成しそのデスクリプタを戻す。

【エラーコード】

EX_NOBUFS           内部領域不足。
EX_PROTONOSUPPORT   サポートされていないタイプまたはプロトコル。
so_gethostname
 
ホスト名の取得
ERR so_gethostname (B *name, W nlen)

【パラメータ】

B   *name   ホスト名を格納する領域
W   nlen    name のバイト長

【リターン値】

=0  正常
<0  エラー

【解説】

現在のホスト名を戻す。

【エラーコード】

EX_ADR      パラメータでアクセスが許されていない領域を参照している。
so_sethostname
 
ホスト名の設定

【形式】

ERR so_sethostname (B *name, W nlen)

【パラメータ】

B   *name   ホスト名
W   nlen    ホスト名のバイト長

【リターン値】

=0  正常
<0  エラー

【解説】

現在のホスト名を指定されたものに変更する。 ホスト名は最大 31文字。

【エラーコード】

EX_ADR      パラメータでアクセスが許されていない領域を参照している。

この章の目次にもどる
前頁:3.9 フォントマネージャにもどる
次頁:3.11 印刷マネージャ仕様書にすすむ