ソケット
SOLID Socketsはプロトコルスタック非依存のネットワークAPIです。SOLID標準のlwIPプロトコルスタックをベースした実装が提供されているほか、アプリケーション独自の実装を提供することもできます。
概念
- Socketsファイル
ソケット、イベント通知オブジェクト、EPollオブジェクト等のSocketsファイルディスクリプタによって識別されるオブジェクトです。
注釈
SOLIDファイルシステムのファイル識別子との相互運用性はありません。
- Socketsファイルディスクリプタ
Socketsファイルを識別する
SOLID_NET_FD
型の非負整数値です。ファイルの種類ごとに対応する関数によって生成されます。
SOLID_NET_Dup()
関数は与えられたものと同じファイルを指すファイルディスクリプタを作成するのに使用することができます。SOLID_NET_Close()
関数によってファイルディスクリプタを削除でき、ファイルへの参照が存在しなくなるとファイルは閉じられます。- ソケット
ホスト間通信の端点を表すSocketsファイルで、
SOLID_NET_Socket()
やSOLID_NET_Accept()
によって作成されます。- イベント通知
イベント通知オブジェクトはスレッド間同期・通知に使用できるSocketsファイルで、
SOLID_NET_Event()
によって作成されます。ソケットと一緒にSOLID_NET_Poll()
関数などに渡すことにより、ソケットと他スレッドからの通知を多重化する用途を想定しています。イベント通知オブジェクトは64ビット符号無し整数カウンタを内部状態として持ち、
SOLID_NET_Read()
とSOLID_NET_Write()
により64ビット整数値 (ネイティブエンディアン) を読み書きすることにより操作します。値を書き込むとその値がカウンタの値に加算されます。カウンタがオーバフローする場合、カウンタがオーバフローしない値に変化するまで呼出し元をブロックしてから前述の処理を行います。
値を読み出すとカウンタの値を0にリセットし、リセット前の値を返します。カウンタの値が0の場合、0以外の値になるまで呼出し元をブロックしてから前述の処理を行います。
注釈
イベント通知オブジェクトはソケットではないため、
SOLID_NET_Recv()
等のソケット用の関数は使用できません。TOPPERS第3世代カーネルの用語「タイムイベント通知」との関連はありません。
- EPoll
EPollは
SOLID_NET_Select()
やSOLID_NET_Poll()
のスケーラビリティ問題を解決するために開発されたインタフェースです。呼出しごとに監視対象を一括で指定するこれらのレガシーな関数とは異なり、EPollではSockets実装が管理するデータ構造で監視対象のリストを持ち、アプリケーションはSOLID_NET_EPollCtl()
関数の呼出しによって監視対象を追加・削除します。このAPIの設計はLinux epollをベースとしており、他のOSにもkqueue等の類似したAPIが存在します。EPollオブジェクトはSocketsファイルの一種で、
SOLID_NET_EPollCreate()
関数によって作成されます。各EPollオブジェクトは以下のリストを持っていると考えることができます。- interestリスト
SOLID_NET_EPollCtl()
関数の呼出しによって追加・削除される監視対象のリストです。各監視対象のファイルにはSOLID_NET_POLLMASK
型で表される監視対象イベントの集合、SOLID_NET_EPOLL_FDFLAGS
型で表される監視オプション、およびSOLID_NET_EPOLL_DATA
型のユーザデータが関連付けられます。- readyリスト
interestリストのうち、監視対象イベントが発生した要素が含まれます。
SOLID_NET_EPollWait()
関数を呼び出すとreadyリストが空でなくなるまで呼出し元をブロックし、ブロックが解除されると呼出し元が指定したバッファにreadyリストの要素がコピーされます。SOLID_NET_EPOLL_FDFLAGS_ET
(エッジトリガー) モードの監視対象は返されるとreadyリストから削除されます。
Sockets実装
SOLID Sockets APIではアプリケーション・ライブラリコードから使用するためのABIのみを定義しています。SOLID Sockets APIの実装はアプリケーションのネットワークスタックに応じて差し替えることができます。
- No-op (
solid_sockets_noop.cpp
) ネットワーク機能を必要としないアプリケーション向けの最小限の実装です。例えば、Rust標準ライブラリのSOLIDターゲット向けコードではシステムエラーコードの文字列表現を取得するのに
SOLID_NET_StrError()
関数を使用するため、ネットワーク機能を使用しないアプリケーションでもこの実装が必要になる場合があります。この実装はデフォルトでリンクされます。
- lwIP (
solid_sockets_lwip.cpp
) SOLID標準のlwIPプロトコルスタックとTOPPERSカーネルをベースとした実装です。この実装はSOLID Sockets APIの大部分をサポートしていますが、以下の制約があります。
SOLID_NET_Dup()
: ソケットFDの複製はサポートされておらず、エラーSOLID_NET_ERR_ENOSYS
が発生します。SOLID_NET_RecvMsg()
: 実装が存在しません。SOLID_NET_Send()
, etc.:SOLID_NET_SOCKET_TYPE_DGRAM
タイプのソケットではSOLID_NET_MSG_MORE
フラグは無視されます。SOLID_NET_Poll()
:SOLID_NET_POLLMASK_PRI
,SOLID_NET_POLLMASK_RDBAND
,SOLID_NET_POLLMASK_WRBAND
はサポートされておらず、これらの種類のイベントは発生しないものとして扱われます。SOLID_NET_Poll()
:SOLID_NET_POLLFD::revents
の値を導出しているとき、lwIP APIから返される値からはSOLID_NET_POLLMASK_HUP
とSOLID_NET_POLLMASK_ERR
を区別できないため、前者を常に返します。SOLID_NET_Select()
: 不正なFDが指定された場合、エラーSOLID_NET_ERR_EBADF
が発生せず無視されることがあります。SOLID_NET_EPollCtl()
:SOLID_NET_EPOLL_EVENT::flags
の値としてSOLID_NET_EPOLL_FDFLAGS_ONESHOT
はサポートされておらず、エラーSOLID_NET_ERR_ENOSYS
が発生します。SOLID_NET_EPollWait()
:SOLID_NET_Select()
等のレガシーな機構を使用して実現されており、汎用OSと同等のスケーラビリティは提供しません。この実装は主に既存ライブラリとの互換性を目的としています。
この実装はソリューションのプロパティで
SOLID_SOCKETS_LWIP
をtrue
に設定することでアプリケーションにリンクできます。
事前条件
TOPPERSカーネル上で実行している場合、実装により特別な指定がない限りは、SOLID Sockets API関数を呼び出す際に以下の条件が満たされる必要があります。これらが満たされない場合の動作は未定義です。
カーネルが動作中である。
ディスパッチ保留状態ではない。特に、割込みハンドラや割込みサービスルーチンを実行中ではない。
呼出し中に強制的な待ち解除 (
rel_wai()
) が行われない。呼出し中に呼出し元タスクが強制終了 (
ter_tsk()
) されない。
POSIXとの差異
SOLID Sockets API関数の振る舞いは基本的にはPOSIXに準拠しますが、以下の差異があります。
- SOLIDのAPI慣習に準拠する
SOLID Sockets APIの定義はSOLIDの命名規則に準拠し、
SOLID_NET_
というプレフィックスが付加されています。提供される構造体には全て対応する型エイリアス (typedef
) が存在するため、これらを指定する際にstruct
キーワードは必要ありません。また、ファイルディスクリプタを表すSOLID_NET_FD
型エイリアスが存在します。よりPOSIXに近い名前で使用するためのPOSIX互換ラッパーも提供されていますが、全ての関数がラップされている訳ではありません。
- エラーコードは
SOLID_NET_GetLastError()
で取得する errno
は使用しません。- シグナル非対応
POSIXシグナルに相当する機能はありません。
SOLID_NET_FDSET
は配列で表現される一般的なPOSIXの実装では
struct fdset
はi
番目のビットがファイルディスクリプタの値i
に対応するビットマップとして表現されていますが、SOLID_NET_FDSET
はファイルディスクリプタの配列として表現されています。SOLID_NET_FD_SETSIZE
はファイルディスクリプタの最大値ではなく、最大個数を表します。ファイルディスクリプタが特定の値を超えるケースを考慮する必要はない一方、ファイルディスクリプタの配列があふれないよう注意する必要があります。SOLID_NET_FD_SETSIZE
のデフォルト値は4
ですが、これを超える数のファイルディスクリプタを指定したい場合、SOLID_NET_FD_SETSIZE
を再定義するか、SOLID_NET_FDSET
を格納するメモリを動的に割り当てる必要があります。- 追加機能
SOLID_NET_Event()
等は他のOSのAPIに由来する独自拡張です。シグナルはこうした機能によって代替できる場合があります。
このほかに各実装の制約も受けます。
APIリファレンス
SOLID Sockets APIを使用するには solid_sockets.h
をインクルードしてください。
#include "solid_sockets.h"
ここでは各項目の概要のみ示します。詳細な仕様についてはPOSIX仕様書、Linuxマニュアル等の対応する項目を参照してください。
基本的なデータ型
-
typedef int SOLID_NET_FD
Socketsファイルディスクリプタを表す型です。
-
SOLID_NET_INVALID_FD
Socketsファイルディスクリプタとしては無効な値です。SOLID Sockets関数の返り値として、エラー状態を表すのに用いられます。
-
SOLID_NET_INVALID_FD
-
typedef struct _SOLID_NET_BUF SOLID_NET_BUF
-
struct _SOLID_NET_BUF
ベクタ入出力 (e.g.,
SOLID_NET_Readv()
) において一つの連続したメモリ上の範囲を指定する構造体です。POSIX
struct iovec
に相当します。-
void *buf
開始番地を指定します。
-
size_t len
範囲のサイズをバイト単位で指定します。
-
void *buf
-
typedef struct _SOLID_NET_TIMEVAL SOLID_NET_TIMEVAL
FD一般の操作
-
ssize_t SOLID_NET_Read(SOLID_NET_FD fd, void *mem, size_t len)
Socketsファイルからデータを読みます。
-
ssize_t SOLID_NET_Readv(SOLID_NET_FD fd, const SOLID_NET_BUF *bufs, int bufcnt)
Socketsファイルから
bufcnt
個のバッファにデータを読みます (ベクタ入出力)。
-
ssize_t SOLID_NET_Write(SOLID_NET_FD fd, const void *dataptr, size_t size)
Socketsファイルにデータを書きます。
-
ssize_t SOLID_NET_Writev(SOLID_NET_FD fd, const SOLID_NET_BUF *bufs, int bufcnt)
Socketsファイルに
bufcnt
個のバッファからデータを書きます (ベクタ入出力)。
-
int SOLID_NET_Ioctl(SOLID_NET_FD fd, SOLID_NET_IOCTL cmd, void *argp)
Socketsファイルの制御操作を行います。
-
typedef long SOLID_NET_IOCTL
-
int SOLID_NET_Fcntl(SOLID_NET_FD fd, SOLID_NET_FCNTL cmd, int val)
Socketsファイルのその他の制御操作を行います。
-
typedef int SOLID_NET_FCNTL
-
SOLID_NET_FCNTL_GETFL
Socketsファイルのステータス・モードフラグを取得し、返します。
現在ステータス・モードフラグとして定義されているのは
SOLID_NET_O_NONBLOCK
のみです。
-
SOLID_NET_FCNTL_SETFL
Socketsファイルのステータス・モードフラグを
val
に変更します。
-
SOLID_NET_FCNTL_GETFL
-
SOLID_NET_O_NONBLOCK
Socketsファイルのステータス・モードフラグの一つです。ソケットのノンブロッキングI/Oモードの有効状態を表します。
-
int SOLID_NET_Close(SOLID_NET_FD fd)
Socketsファイルディスクリプタを閉じます。
-
SOLID_NET_FD SOLID_NET_Dup(SOLID_NET_FD fd)
Socketsファイルディスクリプタを複製し、新たなファイルディスクリプタを返します。返されたファイルディスクリプタは同じSocketsファイルを指します。
アドレスとプロトコル
-
SOLID_NET_IPPROTO_IP
-
SOLID_NET_IPPROTO_ICMP
-
SOLID_NET_IPPROTO_TCP
-
SOLID_NET_IPPROTO_UDP
-
SOLID_NET_IPPROTO_IPV6
-
SOLID_NET_IPPROTO_ICMPV6
-
SOLID_NET_IPPROTO_UDPLITE
-
SOLID_NET_IPPROTO_RAW
ソケットのプロトコルを表します。
SOLID_NET_Socket()
でソケットを作成したり、SOLID_NET_SetSockOpt()
でソケットのオプションを変更する際に対象のプロトコル層を指定するのに用います。定数
説明
IPv4 protocol
ICMP (Internet Control Message Protocol) for IPv4
TCP (Transmission Control Protocol)
UDP (User Datagram Protocol)
ICMP (Internet Control Message Protocol)
IPv6 protocol
ICMP (Internet Control Message Protocol) for IPv6
UDP-Lite
Raw
-
typedef uint8_t SOLID_NET_SA_FAMILY
アドレスファミリー (ソケットで使用するアドレスの構造) を指定します。
SOLID_NET_SOCKADDR
でアドレスファミリーを指定するのに使用します。定数
ソケットアドレス構造体
説明
未指定
IPv4
IPv6
-
typedef int SOLID_NET_DOMAIN
アドレスファミリー (ソケットで使用するアドレスの構造) を指定します。
SOLID_NET_Socket()
やSOLID_NET_ADDRINFO
でソケットがサポートするアドレスファミリーを指定するのに使用します。SOLID_NET_SA_FAMILY
と値は互換ですが、ベースとなる型が異なります。これら2つの型はお互いに安全にキャストできます。
-
typedef struct _SOLID_NET_IN_ADDR SOLID_NET_IN_ADDR
-
struct _SOLID_NET_IN_ADDR
IPv4アドレスを指定します。
-
uint32_t s_addr
IPv4アドレスの内容をネットワークバイトオーダーで指定します。
例えば、
192.0.2.235
(バイナリ表現:[0xc0, 0x00, 0x02, 0xeb]
) はリトルエンディアン環境では0xeb0200c0
、ビッグエンディアン環境では0xc00002eb
として表現されます。
-
uint32_t s_addr
-
typedef uint16_t SOLID_NET_IN_PORT
IPv4/v6ポート番号をネットワークバイトオーダーで指定します。
-
typedef union _SOLID_NET_IN6_ADDR SOLID_NET_IN6_ADDR
-
typedef struct _SOLID_NET_SOCKADDR SOLID_NET_SOCKADDR
-
struct _SOLID_NET_SOCKADDR
すべてのアドレスファミリーのソケットアドレス構造体の共通部分を含みます。
-
uint8_t sa_len
BSD 4.4との互換性のために存在するメンバです。アプリケーションコードはこの値を設定する必要はありません。
-
SOLID_NET_SA_FAMILY sa_family
アドレスファミリーを指定します。アドレスファミリーとソケットアドレス構造体の対応関係については
SOLID_NET_SA_FAMILY
のドキュメントを参照してください。
注意
SOLID_NET_SOCKADDR
はアドレスファミリー固有のソケットアドレスとして扱うにはサイズやアライメントが不十分な可能性があります。アドレスファミリーが不明なソケットアドレスデータはこの構造体として扱ってください。任意のアドレスファミリーのソケットアドレスを格納できる領域を作成するにはSOLID_NET_SOCKADDR_STORAGE
を使用してください。-
uint8_t sa_len
-
typedef struct _SOLID_NET_SOCKADDR_STORAGE SOLID_NET_SOCKADDR_STORAGE
-
struct _SOLID_NET_SOCKADDR_STORAGE
すべてのアドレスファミリーのソケットアドレスを格納するのに十分なサイズ・アライメントを持った構造体です。
-
uint8_t s2_len
BSD 4.4との互換性のために存在するメンバです。アプリケーションコードはこの値を設定する必要はありません。
-
SOLID_NET_SA_FAMILY ss_family
アドレスファミリーを指定します。
-
uint8_t s2_len
-
typedef struct _SOLID_NET_SOCKADDR_IN SOLID_NET_SOCKADDR_IN
-
struct _SOLID_NET_SOCKADDR_IN
IPv4向けのソケットアドレスを表します。
-
uint8_t sin_len
BSD 4.4との互換性のために存在するメンバです。アプリケーションコードはこの値を設定する必要はありません。
-
SOLID_NET_SA_FAMILY sin_family
SOLID_NET_SA_FAMILY_INET
を指定してください。
-
SOLID_NET_IN_PORT sin_port
ポート番号を指定します。
-
SOLID_NET_IN_ADDR sin_addr
IPアドレスを指定します。
-
char sin_zero[8]
予約されています。ゼロを格納してください。
SOLID_NET_SOCKADDR_IN
型の変数を初期化するコード例:#include <sys/endian.h> SOLID_NET_SOCKADDR_IN addr = { .sin_len = sizeof(SOLID_NET_SOCKADDR_IN), .sin_family = SOLID_NET_SA_FAMILY_INET, .sin_port = htons(7777), .sin_addr = {htonl(0xc0'00'02'00)}, // 192.0.2.0 };
-
uint8_t sin_len
-
typedef struct _SOLID_NET_SOCKADDR_IN6 SOLID_NET_SOCKADDR_IN6
-
struct _SOLID_NET_SOCKADDR_IN6
IPv6向けのソケットアドレスを表します。
-
uint8_t sin6_len
BSD 4.4との互換性のために存在するメンバです。アプリケーションコードはこの値を設定する必要はありません。
-
SOLID_NET_SA_FAMILY sin6_family
SOLID_NET_SA_FAMILY_INET6
を指定してください。
-
SOLID_NET_IN_PORT sin6_port
ポート番号を指定します。
-
uint32_t sin6_flowinfo
予約されています。
0
を指定してください。
-
SOLID_NET_IN6_ADDR sin6_addr
IPアドレスを指定します。
-
uint32_t sin6_scope_id
リンクローカル・サイトローカルアドレスのスコープを実装依存の方法で指定します。
-
uint8_t sin6_len
ソケットの制御
-
SOLID_NET_FD SOLID_NET_Socket(SOLID_NET_DOMAIN domain, SOLID_NET_SOCKET_TYPE type, int protocol)
ソケットを作成します。
-
typedef int SOLID_NET_SOCKET_TYPE
ソケットの種類を指定します。
以下の定数が定義されていますが、このほかに
SOLID_NET_ADDRINFO
では0
(未指定) も有効な値として使用されます。
-
SOLID_NET_FD SOLID_NET_Accept(SOLID_NET_FD fd, SOLID_NET_SOCKADDR *addr, SOLID_NET_SOCKLEN *addrlen)
ソケットへの新しい接続を受け付けます。
-
int SOLID_NET_Bind(SOLID_NET_FD fd, const SOLID_NET_SOCKADDR *name, SOLID_NET_SOCKLEN namelen)
ソケットにローカルソケットアドレスを割り付けます。
-
int SOLID_NET_Shutdown(SOLID_NET_FD fd, SOLID_NET_SHUTDOWN how)
ソケットの送受信操作をシャットダウンします。
-
typedef int SOLID_NET_SHUTDOWN
SOLID_NET_Shutdown()
でシャットダウンする方向を指定します。定数
説明
受信
送信のみ
受信と送信
-
int SOLID_NET_GetPeerName(SOLID_NET_FD fd, SOLID_NET_SOCKADDR *name, SOLID_NET_SOCKLEN *namelen)
ソケットのピアアドレスを取得します。
-
int SOLID_NET_GetSockName(SOLID_NET_FD fd, SOLID_NET_SOCKADDR *name, SOLID_NET_SOCKLEN *namelen)
ソケットのローカルアドレスを取得します。
-
int SOLID_NET_Connect(SOLID_NET_FD fd, const SOLID_NET_SOCKADDR *name, SOLID_NET_SOCKLEN namelen)
ソケットを指定したリモートアドレスに接続します。
-
int SOLID_NET_Listen(SOLID_NET_FD fd, int backlog)
ソケットを接続を受け付ける (
SOLID_NET_Accept()
) ための受動的なソケットとして設定します。
-
typedef uint32_t SOLID_NET_SOCKLEN
ソケットアドレス (
SOLID_NET_SOCKADDR
) やソケットオプション (SOLID_NET_SetSockOpt()
) のサイズを表す整数型です。
ソケットデータ
-
ssize_t SOLID_NET_Recv(SOLID_NET_FD fd, void *mem, size_t len, SOLID_NET_MSG flags)
ソケットからメッセージを受信します。
-
ssize_t SOLID_NET_RecvFrom(SOLID_NET_FD fd, void *mem, size_t len, SOLID_NET_MSG flags, SOLID_NET_SOCKADDR *from, SOLID_NET_SOCKLEN *fromlen)
ソケットからメッセージを受信し、送信元アドレスを取得します。
-
ssize_t SOLID_NET_Send(SOLID_NET_FD fd, const void *dataptr, size_t size, SOLID_NET_MSG flags)
ソケットにメッセージを送信します。
-
ssize_t SOLID_NET_SendMsg(SOLID_NET_FD fd, const SOLID_NET_MSGHDR *message, SOLID_NET_MSG flags)
メッセージ構造体を使用してソケットにメッセージを送信します。
-
ssize_t SOLID_NET_SendTo(SOLID_NET_FD fd, const void *dataptr, size_t size, SOLID_NET_MSG flags, const SOLID_NET_SOCKADDR *to, SOLID_NET_SOCKLEN tolen)
送信先アドレスを指定してソケットにメッセージを送信します。
-
typedef struct _SOLID_NET_MSGHDR SOLID_NET_MSGHDR
-
struct _SOLID_NET_MSGHDR
SOLID_NET_SendMsg()
で送信するメッセージを表す構造体です。-
void *msg_name
-
SOLID_NET_SOCKLEN msg_namelen
非接続型のソケット (e.g.,
SOLID_NET_SOCKET_TYPE_DGRAM
) の場合、送信先のソケットアドレスを指定します。msg_name
はソケットアドレスを表す構造体 (e.g.,SOLID_NET_SOCKADDR_IN
) へのポインタ、msg_namelen
は構造体のサイズを指定します。接続型のソケット (e.g.,
SOLID_NET_SOCKET_TYPE_STREAM
) の場合、それぞれNULL
と0
を指定してください。
-
SOLID_NET_BUF *msg_iov
-
int msg_iovlen
送信するデータを指定します。
msg_iovlen
個のSOLID_NET_BUF
構造体配列を指すポインタをmsg_iov
として指定します。
-
void *msg_control
-
SOLID_NET_SOCKLEN msg_controllen
制御データを指定します。
msg_control
で制御データへのポインタ、msg_controllen
でそのサイズを指定します。制御データを使用しない場合はそれぞれNULL
と0
を指定してください。
-
int msg_flags
このフィールドは無視されます。
-
void *msg_name
-
typedef int SOLID_NET_MSG
メッセージ送受信の動作を制御するビットフラグです。
-
SOLID_NET_MSG_PEEK
返されたメッセージを受信キューに残します。
-
SOLID_NET_MSG_WAITALL
SOLID_NET_SOCKET_TYPE_STREAM
タイプのソケットから受信する場合、アプリケーションが渡したバッファが一杯になるか、接続が切断されるまでブロックします。
-
SOLID_NET_MSG_OOB
Out-of-bandデータを要求します。この意味は実装とプロトコルに依存します。
-
SOLID_NET_MSG_DONTWAIT
現在の呼出しについてノンブロッキングI/Oを有効化します。
-
SOLID_NET_MSG_MORE
SOLID_NET_SOCKET_TYPE_STREAM
タイプのソケットから送信する場合、呼出し元はより多くのデータを送信する予定であることを示し、部分的なパケットの送信を防ぎます。SOLID_NET_SOCKET_TYPE_DGRAM
タイプのソケットから送信する場合、呼出し元は現在のデータグラムがまだ完結しておらず、今後の呼び出しでデータを追加し、そのあとまとめて一つのデータグラムとして送信すべきであることを示します。
-
SOLID_NET_MSG_EOR
送信時、レコードの完結を示します。この意味は実装とプロトコルに依存します。
-
SOLID_NET_MSG_PEEK
ソケットオプション
-
int SOLID_NET_GetSockOpt(SOLID_NET_FD fd, SOLID_NET_SOCKOPTLEVEL level, SOLID_NET_SOCKOPT optname, void *optval, SOLID_NET_SOCKLEN *optlen)
ソケットのオプションを取得します。
-
int SOLID_NET_SetSockOpt(SOLID_NET_FD fd, SOLID_NET_SOCKOPTLEVEL level, SOLID_NET_SOCKOPT optname, const void *optval, SOLID_NET_SOCKLEN optlen)
ソケットのオプションを設定します。
-
typedef int SOLID_NET_SOCKOPTLEVEL
ソケットのオプションが存在するレベルを指定します。以下の値のほかに、
SOLID_NET_IPPROTO_IP
等のプロトコルを指定できます。-
SOLID_NET_SOCKOPTLEVEL_SOCKET
ソケット一般のオプションを含むレベルです。
-
SOLID_NET_SOCKOPTLEVEL_SOCKET
ソケットレベル (SOLID_NET_SOCKOPTLEVEL_SOCKET
)
レベル SOLID_NET_SOCKOPTLEVEL_SOCKET
には以下のオプションが存在します。
-
SOLID_NET_SOCKOPT_SO_REUSEADDR
-
SOLID_NET_SOCKOPT_SO_KEEPALIVE
-
SOLID_NET_SOCKOPT_SO_BROADCAST
-
SOLID_NET_SOCKOPT_SO_ACCEPTCONN
-
SOLID_NET_SOCKOPT_SO_LINGER
-
SOLID_NET_SOCKOPT_SO_RCVBUF
-
SOLID_NET_SOCKOPT_SO_SNDTIMEO
-
SOLID_NET_SOCKOPT_SO_RCVTIMEO
-
SOLID_NET_SOCKOPT_SO_ERROR
-
SOLID_NET_SOCKOPT_SO_TYPE
-
SOLID_NET_SOCKOPT_SO_NO_CHECK
-
typedef struct _SOLID_NET_LINGER SOLID_NET_LINGER
-
struct _SOLID_NET_LINGER
SOLID_NET_SOCKOPT_SO_LINGER
オプションの値を表します。-
int l_onoff
Linger機能の有効・無効を指定します。有効な場合、
SOLID_NET_Close()
とSOLID_NET_Shutdown()
は送信キューが空になるかタイムアウトが発生するまでブロックします。
-
int l_linger
タイムアウト時間を秒単位で指定します。
-
int l_onoff
IPレベル (SOLID_NET_IPPROTO_IP
)
レベル SOLID_NET_IPPROTO_IP
には以下のオプションが存在します。
-
SOLID_NET_SOCKOPT_IP_TTL
-
SOLID_NET_SOCKOPT_IP_ADD_MEMBERSHIP
-
SOLID_NET_SOCKOPT_IP_DROP_MEMBERSHIP
-
SOLID_NET_SOCKOPT_IP_MULTICAST_TTL
-
SOLID_NET_SOCKOPT_IP_MULTICAST_IF
-
SOLID_NET_SOCKOPT_IP_MULTICAST_LOOP
-
typedef struct _SOLID_NET_IP_MREQ SOLID_NET_IP_MREQ
-
struct _SOLID_NET_IP_MREQ
SOLID_NET_SOCKOPT_IP_ADD_MEMBERSHIP
,SOLID_NET_SOCKOPT_IP_DROP_MEMBERSHIP
オプションにおいて、参加・離脱するマルチキャストグループを指定します。-
SOLID_NET_IN_ADDR imr_multiaddr
マルチキャストグループのアドレスを指定します。
-
SOLID_NET_IN_ADDR imr_interface
ローカルインタフェースのアドレスを指定します。
-
SOLID_NET_IN_ADDR imr_multiaddr
IPv6レベル (SOLID_NET_IPPROTO_IPV6
)
レベル SOLID_NET_IPPROTO_IPV6
には以下のオプションが存在します。
-
SOLID_NET_SOCKOPT_IPV6_UNICAST_HOPS
-
SOLID_NET_SOCKOPT_IPV6_CHECKSUM
-
SOLID_NET_SOCKOPT_IPV6_ADD_MEMBERSHIP
-
SOLID_NET_SOCKOPT_IPV6_DROP_MEMBERSHIP
-
SOLID_NET_SOCKOPT_IPV6_MULTICAST_IF
-
SOLID_NET_SOCKOPT_IPV6_MULTICAST_HOPS
-
SOLID_NET_SOCKOPT_IPV6_MULTICAST_LOOP
-
SOLID_NET_SOCKOPT_IPV6_V6ONLY
-
typedef struct _SOLID_NET_IPV6_MREQ SOLID_NET_IPV6_MREQ
-
struct _SOLID_NET_IPV6_MREQ
SOLID_NET_SOCKOPT_IPV6_ADD_MEMBERSHIP
,SOLID_NET_SOCKOPT_IPV6_DROP_MEMBERSHIP
オプションにおいて、参加・離脱するマルチキャストグループを指定します。-
SOLID_NET_IN6_ADDR ipv6mr_multiaddr
マルチキャストグループのアドレスを指定します。
-
unsigned int ipv6mr_interface
ローカルインタフェースを実装依存の方法で指定します。
-
SOLID_NET_IN6_ADDR ipv6mr_multiaddr
TCPレベル (SOLID_NET_IPPROTO_TCP
)
レベル SOLID_NET_IPPROTO_TCP
には以下のオプションが存在します。
UDP-Liteレベル (SOLID_NET_IPPROTO_UDPLITE
)
レベル SOLID_NET_IPPROTO_UDPLITE
には以下のオプションが存在します。
I/O多重化
Select
-
int SOLID_NET_Select(int maxfdp1, SOLID_NET_FDSET *readset, SOLID_NET_FDSET *writeset, SOLID_NET_FDSET *exceptset, SOLID_NET_TIMEVAL *timeout)
Socketsファイルディスクリプタの集合を受け取り、含まれるファイルディスクリプタのいずれかが各集合に対応する条件を満たすか、タイムアウトが発生するまでブロックします。
maxfdp1
は無視されます。
-
typedef struct _SOLID_NET_FDSET SOLID_NET_FDSET
-
struct _SOLID_NET_FDSET
SOLID_NET_Select()
に渡すSocketsファイルディスクリプタの集合です。-
SOLID_NET_FD fds[SOLID_NET_FD_SETSIZE]
含まれるファイルディスクリプタを表す配列です。
注意
SOLID Socketsでは
SOLID_NET_FDSET
はファイルディスクリプタの配列として表現されており、一般的なPOSIXの実装とは異なります。-
SOLID_NET_FD fds[SOLID_NET_FD_SETSIZE]
-
SOLID_NET_FD_SETSIZE
SOLID_NET_FDSET::fds
の要素数を表す整数定数です。デフォルト値は
4
ですが、アプリケーションコードでsolid_sockets.h
をインクルードする前にこれを定義することにより、要素数を変更できます。例:#define SOLID_NET_FD_SETSIZE 64 #include "solid_sockets.h"
注意
コンパイル単位ごとに異なる
SOLID_NET_FD_SETSIZE
の値を指定することは可能ですが、SOLID_NET_FDSET
をアプリケーション内で受け渡しする場合、コンパイル単位間でABIの不一致が起こらないよう注意する必要があります。SOLID_NET_FDSET
を動的割り当てする方法もあります。例:/* size_t input_num_fds; */ /* SOLID_NET_FD input_fds[input_num_fds]; */ SOLID_NET_FDSET *set = (SOLID_NET_FDSET *)SOLID_malloc( offsetof(SOLID_NET_FDSET, fds) + sizeof(SOLID_NET_FD) * input_num_fds); set->num_fds = input_num_fds; memcpy(set->fds, input_fds, sizeof(SOLID_NET_FD) * input_num_fds);
注意
SOLID_NET_FD_SET()
はSOLID_NET_FD_SETSIZE
に基づいてオーバフロー検査を行うため、動的割り当てしたSOLID_NET_FDSET
に対してはSOLID_NET_FD_SET()
は使用できません。
-
int SOLID_NET_FD_ISSET(SOLID_NET_FD fd, const SOLID_NET_FDSET *fdset)
fd
が*fdset
に含まれるかどうかを示すフラグを返します。
-
void SOLID_NET_FD_SET(SOLID_NET_FD fd, SOLID_NET_FDSET *fdset)
fd
を*fdset
に追加します。既に含まれている場合は何もしません。追加後の要素数が
SOLID_NET_FD_SETSIZE
を越える場合、動作は未定義です。アサーションが有効な場合、アボートします。
-
void SOLID_NET_FD_CLR(SOLID_NET_FD fd, SOLID_NET_FDSET *fdset)
fd
を*fdset
から削除します。含まれていない場合は何もしません。
-
void SOLID_NET_FD_ZERO(SOLID_NET_FDSET *fdset)
*fdset
の要素をすべて削除します。
Poll
-
int SOLID_NET_Poll(SOLID_NET_POLLFD *fds, SOLID_NET_NFDS nfds, int timeout)
Socketsファイルディスクリプタと対応するイベントマスクの集合を受け取り、含まれるファイルディスクリプタのいずれかがイベントマスクで表される条件を満たすか、タイムアウトが発生するまでブロックします。
-
typedef unsigned int SOLID_NET_NFDS
SOLID_NET_Poll()
でSOLID_NET_POLLFD
の要素数を表すのに用いられる非負整数型です。
-
typedef struct _SOLID_NET_POLLFD SOLID_NET_POLLFD
-
struct _SOLID_NET_POLLFD
-
SOLID_NET_FD fd
Socketsファイルディスクリプタ を指定します。
-
SOLID_NET_POLLMASK events
ブロック解除条件となるイベントの集合を指定します。
SOLID_NET_POLLMASK_ERR
,SOLID_NET_POLLMASK_NVAL
,SOLID_NET_POLLMASK_HUP
は無視され、常に指定されているものとして扱われます。
-
SOLID_NET_POLLMASK revents
ブロック解除された場合、
SOLID_NET_Poll()
は発生したイベントの集合をこのメンバ変数に格納します。
-
SOLID_NET_FD fd
-
typedef short SOLID_NET_POLLMASK
Socketsファイルで発生するイベントの種類を表すビットフラグです。
-
SOLID_NET_POLLMASK_IN
受信可能なデータが存在する。
-
SOLID_NET_POLLMASK_OUT
送信キューに空きがある。
-
SOLID_NET_POLLMASK_RDNORM
-
SOLID_NET_POLLMASK_WRNORM
-
SOLID_NET_POLLMASK_RDBAND
受信可能なpriority band dataが存在する。この意味は実装とプロトコルに依存します。
-
SOLID_NET_POLLMASK_WRBAND
Priority band dataが送信できる。この意味は実装とプロトコルに依存します。
-
SOLID_NET_POLLMASK_PRI
例外的条件が発生した。この意味は実装とプロトコルに依存します。
-
SOLID_NET_POLLMASK_ERR
エラーが発生した。
-
SOLID_NET_POLLMASK_NVAL
指定されたファイルディスクリプタが無効。
-
SOLID_NET_POLLMASK_HUP
ハングアップした (通信経路が相手方から切断された)。
-
SOLID_NET_POLLMASK_IN
EPoll
-
SOLID_NET_FD SOLID_NET_EPollCreate(SOLID_NET_EPOLL_FLAGS flags)
EPollオブジェクトを作成します。
-
typedef int SOLID_NET_EPOLL_FLAGS
EPollオブジェクトの動作を制御するビットフラグです。
現時点では指定可能なフラグは定義されていません。
0
を指定してください。
-
int SOLID_NET_EPollCtl(SOLID_NET_FD epfd, SOLID_NET_EPOLL_OP op, SOLID_NET_FD fd, const SOLID_NET_EPOLL_EVENT *event)
EPollオブジェクトに監視対象のSocketsファイルディスクリプタを追加、削除、または既存の監視対象の属性を操作します。
-
typedef int SOLID_NET_EPOLL_OP
SOLID_NET_EPollCtl()
でEPollオブジェクトに対して行う操作を指定します。-
SOLID_NET_EPOLL_OP_ADD
監視対象ファイルディスクリプタを追加します。
-
SOLID_NET_EPOLL_OP_MOD
監視対象ファイルディスクリプタの属性を変更します。
-
SOLID_NET_EPOLL_OP_DEL
監視対象ファイルディスクリプタを削除します。
event
引数は無視されます。
-
SOLID_NET_EPOLL_OP_ADD
-
int SOLID_NET_EPollWait(SOLID_NET_FD fd, SOLID_NET_EPOLL_EVENT *events, int maxevents, int timeout)
EPollオブジェクトでイベントが発生するか、タイムアウトが発生するまでブロックします。
-
typedef struct _SOLID_NET_EPOLL_EVENT SOLID_NET_EPOLL_EVENT
-
struct _SOLID_NET_EPOLL_EVENT
EPollオブジェクトである監視対象のファイルディスクリプタに関して、監視するイベント (
SOLID_NET_EPollCtl()
)、または発生したイベント (SOLID_NET_EPollWait()
) を表します。-
SOLID_NET_POLLMASK events
SOLID_NET_EPollCtl()
: 監視対象のイベントの集合を指定します。SOLID_NET_EPollWait()
: 発生したイベントを表します。
-
SOLID_NET_EPOLL_FDFLAGS flags
SOLID_NET_EPollCtl()
: 監視動作を制御します。
-
SOLID_NET_EPOLL_DATA data
SOLID_NET_EPollCtl()
: 監視対象に関連付けるユーザデータを指定します。SOLID_NET_EPollWait()
: 監視対象に関連付けられたユーザデータを返します。
-
SOLID_NET_POLLMASK events
-
typedef union _SOLID_NET_EPOLL_DATA SOLID_NET_EPOLL_DATA
-
union _SOLID_NET_EPOLL_DATA
EPollオブジェクトで監視対象のSocketsファイルディスクリプタに対応付けられるユーザデータを表します。SOLID Sockets実装はこの値をアプリケーションにそのまま返す以外には使用しません。
-
void *ptr
-
uint32_t u32
-
uint64_t u64
-
void *ptr
-
typedef uint16_t SOLID_NET_EPOLL_FDFLAGS
EPollオブジェクトでイベントを監視する際の動作を制御するビットフラグです。
-
SOLID_NET_EPOLL_FDFLAGS_ET
エッジトリガーモードを使用するよう指定します。
-
SOLID_NET_EPOLL_FDFLAGS_ONESHOT
SOLID_NET_EPollWait()
で監視対象が返された後、監視を一時停止することを要求します。監視を再開するにはSOLID_NET_EPOLL_OP_MOD
を指定してSOLID_NET_EPollCtl()
を呼び出します。
-
SOLID_NET_EPOLL_FDFLAGS_ET
イベント通知
-
SOLID_NET_FD SOLID_NET_Event(uint64_t init, SOLID_NET_EVENT_FLAGS flags)
イベント通知オブジェクトを作成します。
DNS
-
int SOLID_NET_GetAddrInfo(const char *nodename, const char *servname, const SOLID_NET_ADDRINFO *hints, SOLID_NET_ADDRINFO **res)
アドレス情報を取得します。
他のSOLID Sockets関数とは異なり、失敗時にはこの関数はエラーコードを返します。
SOLID_NET_GetLastError()
ではエラーコードは取得できません。
-
typedef struct _SOLID_NET_ADDRINFO SOLID_NET_ADDRINFO
-
struct _SOLID_NET_ADDRINFO
SOLID_NET_GetAddrInfo()
の入力としてヒント、または出力として得られたアドレス情報を表します。入力として使用する場合、指定のないメンバ変数はゼロ初期化 (
0
またはNULL
を設定) してください。-
SOLID_NET_AIFLAGS ai_flags
入力:
SOLID_NET_GetAddrInfo()
の動作を制御するフラグを指定します。出力: 値は定義されていません。
-
SOLID_NET_DOMAIN ai_family
アドレスファミリーを指定します。
-
SOLID_NET_SOCKET_TYPE ai_socktype
ソケットの種類を指定します。
-
int ai_protocol
ソケットのプロトコルを指定します。
以上の3つのメンバ変数 (
ai_family
,ai_socktype
,ai_protocol
) の値はSOLID_NET_Socket()
の引数として使用できます。
-
SOLID_NET_SOCKLEN ai_addrlen
-
SOLID_NET_SOCKADDR *ai_addr
出力: ソケットアドレスを表します。
-
char *ai_canonname
出力:
SOLID_NET_AIFLAGS_CANONNAME
が指定され、nodename
が指定された場合、返されたリストのうち最初のSOLID_NET_ADDRINFO
要素では解決された正式名、または解決に失敗した場合はnodename
の内容のコピーが含まれます。
-
struct _SOLID_NET_ADDRINFO *ai_next
リスト構造の中で、次の
SOLID_NET_ADDRINFO
要素を指します。次の要素が存在しない場合はNULL
が含まれます。
-
SOLID_NET_AIFLAGS ai_flags
-
typedef int SOLID_NET_AIFLAGS
SOLID_NET_GetAddrInfo()
の動作を制御するビットフラグです。-
SOLID_NET_AIFLAGS_PASSIVE
SOLID_NET_Bind()
に渡すのに適したソケットアドレスを返すことを要求します。
-
SOLID_NET_AIFLAGS_CANONNAME
nodename
の正式名を解決し、返されたリストの最初のSOLID_NET_ADDRINFO
要素のai_canonname
としてそれを返すことを要求します。
-
SOLID_NET_AIFLAGS_NUMERICHOST
nodename
が数値形式のホストアドレス文字列でない場合は失敗することを要求します。
-
SOLID_NET_AIFLAGS_NUMERICSERV
servname
が数値形式のポート番号文字列でない場合は失敗することを要求します。
-
SOLID_NET_AIFLAGS_V4MAPPED
入力
SOLID_NET_ADDRINFO
のai_family
としてSOLID_NET_DOMAIN_INET6
が指定され、処理の結果IPv4アドレスが見つかったもののIPv6アドレスが見つからなかった場合、IPv4-mapped IPv6アドレスを返します。
-
SOLID_NET_AIFLAGS_ALL
SOLID_NET_AIFLAGS_V4MAPPED
と組み合わせて使用した場合、変換前のIPv4アドレスも同時に返します。
-
SOLID_NET_AIFLAGS_ADDRCONFIG
ローカルシステムでIPv4アドレスが設定されている場合のみIPv4アドレスを返し、IPv6アドレスが設定されている場合のみIPv6アドレスを返します。
-
SOLID_NET_AIFLAGS_PASSIVE
-
void SOLID_NET_FreeAddrInfo(SOLID_NET_ADDRINFO *ai)
SOLID_NET_GetAddrInfo()
から返されたSOLID_NET_ADDRINFO
のリストとそのフィールドai_canonname
,ai_addr
の参照先に使用されたメモリを解放します。ai
は返されたリストの全体ではなく、その一部の要素から作られた新たなリストを指すこともできます。注意
SOLID_NET_GetAddrInfo()
を使用せずにメモリが割り当てられたSOLID_NET_ADDRINFO
への参照を渡した場合の動作は未定義です。SOLID_NET_GetAddrInfo()
がメモリを割り当てる方法は実装依存です。他の方法、例えばSOLID_free()
を使用してメモリを解放できるとは限りません。ai
としてNULL
を指定した場合の動作は未定義です。(この点でfree()
とは異なります。)
エラー
特に指定がない限り、SOLID Sockets関数は失敗時は (int)-1
または SOLID_NET_INVALID_FD
((
SOLID_NET_FD
)-1
) を返します。エラーコードは同じスレッドで SOLID_NET_GetLastError()
を呼び出すことによって取得できます。
エラー情報の取得
エラーコード
-
SOLID_NET_ERR_BASE
SOLID Socketsエラーコードのベース値です (この値自体はエラーコードとしては使用されません)。
<errno.h>
で定義されたPOSIXエラーコードをこの値から引くことによって対応するSOLID Socketsエラーコードが得られます。例えば、SOLID_NET_ERR_ENOENT
の値はSOLID_NET_ERR_BASE - ENOENT
として求められます。この値はSOLIDエラーコードと重複しないよう選択されています。
-
SOLID_NET_ERR_EADDRINUSE
-
SOLID_NET_ERR_EADDRNOTAVAIL
-
SOLID_NET_ERR_EAFNOSUPPORT
-
SOLID_NET_ERR_EAGAIN
-
SOLID_NET_ERR_EALREADY
-
SOLID_NET_ERR_EBADF
-
SOLID_NET_ERR_EBADFD
-
SOLID_NET_ERR_ECONNABORTED
-
SOLID_NET_ERR_ECONNRESET
-
SOLID_NET_ERR_EEXIST
-
SOLID_NET_ERR_EFAULT
-
SOLID_NET_ERR_EHOSTUNREACH
-
SOLID_NET_ERR_EINPROGRESS
-
SOLID_NET_ERR_EINTR
-
SOLID_NET_ERR_EINVAL
-
SOLID_NET_ERR_EIO
-
SOLID_NET_ERR_EISCONN
-
SOLID_NET_ERR_EMSGSIZE
-
SOLID_NET_ERR_ENFILE
-
SOLID_NET_ERR_ENOBUFS
-
SOLID_NET_ERR_ENOENT
-
SOLID_NET_ERR_ENOMEM
-
SOLID_NET_ERR_ENOPROTOOPT
-
SOLID_NET_ERR_ENOSYS
-
SOLID_NET_ERR_ENOTCONN
-
SOLID_NET_ERR_ENOTSOCK
-
SOLID_NET_ERR_EOPNOTSUPP
-
SOLID_NET_ERR_ERANGE
-
SOLID_NET_ERR_EREMOTEIO
-
SOLID_NET_ERR_ESRCH
-
SOLID_NET_ERR_EWOULDBLOCK
POSIXエラーコードに対応するSOLID Socketsエラーコード定数です。
定数
説明
アドレスが使用中
アドレスが利用不可
アドレスファミリーが未サポート
リソースが一時的に利用不可
接続処理がすでに進行中
接続が中止された
接続がリセットされた
ファイルが既に存在する
不正アドレス
ホストに到達できない
処理が進行中
引数が不正
I/Oエラー
ソケットが接続済み
メッセージが大きすぎる
開かれたSocketsファイルが多すぎる
バッファ領域不足
メモリ不足
プロトコルが利用不可
未サポート
ソケットが接続されていない
操作対象がソケットではない
対象が指定の操作を未サポート
結果が表現可能な範囲を超過した
リモートI/Oエラー
現在の状態ではこの操作はブロックする (
SOLID_NET_ERR_EAGAIN
と同じ値)
POSIX互換ラッパー
solid_sockets_compat.h
はPOSIX互換APIを提供するSOLID Socketsのラッパーです。
#include "solid_sockets_compat.h"
このヘッダーをインクルードするとSOLID Sockets API関数をPOSIX互換の名前で呼び出すことができます。SOLID SocketsとPOSIXで機能的にオーバーラップする関数は全て提供されていますが、以下の例外が存在します。
errno
→SOLID_NET_GetLastError()
C標準ライブラリの定義との衝突を避けるために
errno
は定義されていません。SOLID_NET_GetLastError()
とSOLID Socketsのエラーコード定数を使用してください。close()
→closesocket()
,ioctl()
→ioctlsocket()
C標準ライブラリが提供する関数との衝突を避けるために
SOLID_NET_Close()
はclosesocket()
という名前で提供されています。close()
を呼び出してもSOLID Sockets FDを閉じることはできません。read()
とwrite()
は提供されないC標準ライブラリが提供する関数と衝突し、また
recv()
と機能的に重複するため、これらの関数は提供されていません。ソケットに対して操作を行う場合、recv()
等で代替できます。// read(fd, mem, len) SOLID_NET_Read(fd, mem, len); recv(fd, mem, len, 0); // sockets only // write(fd, mem, len) SOLID_NET_Write(fd, mem, len); send(fd, mem, len, 0); // sockets only
readv()
は提供されないSOLID_NET_Readv()
で代替してください。writev()
は提供されないSOLID_NET_Writev()
で代替してください。ソケットに対して操作を行う場合、sendmsg()
で代替することもできます。// writev(fd, iov, iovcnt) SOLID_NET_Writev(fd, iov, iovcnt); struct msghdr msg = {0}; msg.msg_iov = iov; msg.msg_iovlen = iovcnt; sendmsg(fd, &msg, 0); // sockets only
fcntl()
は提供されないSOLID_NET_Fcntl()
で代替してください。fd_set
はSOLID_NET_FDSET
のSOLID Sockets固有の振る舞いに従うPOSIXとの差異を参照してください。