For Development HEAD DRAFTSearch (procedure/syntax/module):

11.22 srfi.106 - 基本的なソケットインタフェース

Module: srfi.106

ポータブルなソケットインタフェースです。

Gaucheはgauche.netモジュールで包括的なネットワークAPIを提供しています (gauche.net - ネットワーキング参照)。しかしそれはGauche特有のものです。 このsrfiはソケット操作の小さなサブセットを提供し、 簡単なネットワーキングを必要とするアプリケーションをポータブルに書けるようにします。

gauche.netと同じ名前を持ち、インタフェースが異なる手続きがあることに注意してください。

このsrfiのAPIで作られるソケットオブジェクトはGaucheの<socket>オブジェクト そのものなので、gauche.netのAPIに渡したり、またその逆も可能です。

以下にあげる手続きはgauche.netのものと全く同一です。 説明はgauche.net - ネットワーキングを参照してください。

socket-accept        socket-shutdown       socket-close
socket-input-port    socket-output-port

ソケットオブジェクト

Function: make-client-socket node service :optional ai-family ai-socktype ai-flags ai-protocol

[SRFI-106]{srfi.106} ノードnodeのサービスserviceと通信するためのソケットを作って返します。 ソケットの型がコネクション指向なら(つまり、ai-socktype*sock-stream*なら、これはデフォルトですが)、 返されるソケットは既にコネクトされた状態になっています。

nodeserviceは文字列でなければなりません。 nodegetaddrinfo(3)に渡されてサーバのIPアドレスに解決されます。 serviceが数字のみで構成されていた場合はポート番号とみなされます。

省略可能引数のデフォルト値は次の通りです: ai-family*af-inet*ai-socktype*sock-stream*ai-flags(socket-merge-flags *ai-v4mapped* *ai-addrconfig*)、 そしてai-protocol*ipproto-ip*。 有効なフラグの種類については下を参照してください。

gauche.netmake-client-socketとはAPIが異なることに注意してください。

(make-client-socket "127.0.0.1" "80")
 ⇒ a <socket> connected to port 80 of localhost
Function: make-server-socket service :optional ai-family ai-socktype ai-protocol

[SRFI-106]{srfi.106} serviceで指定されるポートで待ち受けるサーバソケットを作って返します。 serviceは文字列でなければなりません。serviceが全て数字で構成されていた 場合はポート番号と解釈されます。

省略可能引数のデフォルト値は次の通りです: ai-family*af-inet*ai-socktype*sock-stream*ai-protocol*ipproto-ip*。 有効なフラグの種類については下を参照してください。

gauche.netmake-server-socketとはAPIが異なることに注意してください。

Function: socket? obj

[SRFI-106]{srfi.106} (is-a? obj <socket>)と同じです。

通信

Function: socket-send socket u8vector :optional flags

[SRFI-106]{srfi.106} gauche.netsocket-sendとほぼ同じですが、 gauche.netのものが文字列も引数に取ることができるのに対し、 こちらはu8vectorのみを受け付けます。

実際に送られたオクテット数を返します。

Function: socket-recv socket size :optional flags

[SRFI-106]{srfi.106} gauche.netsocket-recvに似ていますが、こちらは 文字列ではなくu8vectorを返します。もし通信の相手がコネクションを閉じていた場合は、 空のu8vector #u8()が返されます。

size引数は受信データの最大のサイズを指定します。 受信データがそれより小さい場合は返されるベクタもそれに合わせて短くなります。

フラグ

このsrfiでは、典型的なソケットフラグを表す定数と、 名前からフラグ値を求めるマクロも提供しています。

Function: socket-merge-flags flag …

[SRFI-106]{srfi.106} 与えられたflag …をビット演算でマージします。 Gauche組み込みのlogiorと実質的に同じです。

Function: socket-purge-flags base-flag flag …

[SRFI-106]{srfi.106} base-flagのビットのうち、flag …で示されるビットを0にします。

Address family

*af-inet*AF_INET
*af-inet6*AF_INET6
*af-unspec*AF_UNSPEC
Macro: address-family name

[SRFI-106]{srfi.106} nameがシンボルinetinet6unspecのいずれかであれば、 それぞれ*af-inet**af-inet6**af-unspec*の値へと展開されます。

nameがそれ以外のオブジェクトならエラーが報告されます。

Socket domain

*sock-stream*SOCK_STREAM
*sock-dgram*SOCK_DGRAM
Macro: socket-domain name

[SRFI-106]{srfi.106} nameがシンボルstreamdatagramのいずれかであれば、 それぞれ*sock-stream**sock-dgram*の値へと展開されます。

nameがそれ以外のオブジェクトならエラーが報告されます。

Address info

*ai-canonname*AI_CANONNAME
*ai-numerichost*AI_NUMERICHOST
*ai-v4mapped*AI_V4MAPPED
*ai-all*AI_ALL
*ai-addrconfig*AI_ADDRCONFIG
Macro: address-info name …

[SRFI-106]{srfi.106} シンボルcanonamenumerichostv4mappedalladdrconfigの組み合わせを、 対応するビットフラグの組み合わせへと展開します。

他のシンボルが渡された場合はエラーが報告されます。 (註: *ai-canonname*に対応するのはcanonameです)。

プロトコル

*ipproto-ip*IPPROTO_IP
*ipproto-tcp*IPPROTO_TCP
*ipproto-udp*IPPROTO_UDP
Macro: ip-protocol name

[SRFI-106]{srfi.106} シンボルiptcp、and udpを それぞれ対応するフラグの値へと展開します。 他のシンボルが渡されたらエラーを報告します。

メッセージタイプ

*msg-none*0
*msg-peek*MSG_PEEK
*msg-oob*MSG_OOB
*msg-waitall*MSG_WAITALL
Macro: message-type name …

[SRFI-106]{srfi.106} シンボルnonepeekoobwait-allの組み合わせを、 対応するビットフラグの組み合わせへと展開します。

他のシンボルが渡された場合はエラーが報告されます。 (註: *msg-waitall*に対応するのはwait-allです)。

シャットダウン

*shut-rd*SHUT_RD
*shut-wr*SHUT_WR
*shut-rdwr*SHUT_RDWR
Macro: shutdown-method name …

[SRFI-106]{srfi.106} シンボルcodewriteの組み合わせを対応するビットマスクの値へと展開します。

他のシンボルが渡された場合はエラーが報告されます。



For Development HEAD DRAFTSearch (procedure/syntax/module):
DRAFT