ソケット

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_SOCKETS_LWIPtrue に設定することでアプリケーションにリンクできます。

事前条件

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 fdseti 番目のビットがファイルディスクリプタの値 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関数の返り値として、エラー状態を表すのに用いられます。

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

範囲のサイズをバイト単位で指定します。

typedef struct _SOLID_NET_TIMEVAL SOLID_NET_TIMEVAL
struct _SOLID_NET_TIMEVAL

時間間隔を表す構造体です。

long tv_sec

時間間隔の整数部を秒単位で指定します。

long tv_usec

時間間隔の小数部をマイクロ秒単位で指定します。有効な範囲は [0, 999'999] です。

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
SOLID_NET_IOCTL_FIONREAD

TCPソケットでは、受信メッセージキューに格納されたデータの量をバイト単位で取得し、*(int *)argp に格納します。

UDPソケットでは、受信メッセージキューに存在する最初のメッセージのサイズをバイト単位で取得し、*(int *)argp に格納します。キューが空の場合、0 を返します。

SOLID_NET_IOCTL_FIONBIO

*(int const *)argp の値に基づき、ソケットのノンブロッキングI/Oモードを有効化・無効化します。

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_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() でソケットのオプションを変更する際に対象のプロトコル層を指定するのに用います。

定数

説明

SOLID_NET_IPPROTO_IP

IPv4 protocol

SOLID_NET_IPPROTO_ICMP

ICMP (Internet Control Message Protocol) for IPv4

SOLID_NET_IPPROTO_TCP

TCP (Transmission Control Protocol)

SOLID_NET_IPPROTO_UDP

UDP (User Datagram Protocol)

SOLID_NET_IPPROTO_ICMP

ICMP (Internet Control Message Protocol)

SOLID_NET_IPPROTO_IPV6

IPv6 protocol

SOLID_NET_IPPROTO_ICMPV6

ICMP (Internet Control Message Protocol) for IPv6

SOLID_NET_IPPROTO_UDPLITE

UDP-Lite

SOLID_NET_IPPROTO_RAW

Raw

typedef uint8_t SOLID_NET_SA_FAMILY

アドレスファミリー (ソケットで使用するアドレスの構造) を指定します。

SOLID_NET_SOCKADDR でアドレスファミリーを指定するのに使用します。

SOLID_NET_SA_FAMILY_UNSPEC
SOLID_NET_SA_FAMILY_INET
SOLID_NET_SA_FAMILY_INET6

定数

ソケットアドレス構造体

説明

SOLID_NET_SA_FAMILY_UNSPEC

SOLID_NET_SOCKADDR

未指定

SOLID_NET_SA_FAMILY_INET

SOLID_NET_SOCKADDR_IN

IPv4

SOLID_NET_SA_FAMILY_INET6

SOLID_NET_SOCKADDR_IN6

IPv6

typedef int SOLID_NET_DOMAIN

アドレスファミリー (ソケットで使用するアドレスの構造) を指定します。

SOLID_NET_Socket()SOLID_NET_ADDRINFO でソケットがサポートするアドレスファミリーを指定するのに使用します。

SOLID_NET_SA_FAMILY と値は互換ですが、ベースとなる型が異なります。これら2つの型はお互いに安全にキャストできます。

SOLID_NET_DOMAIN_INET
SOLID_NET_DOMAIN_INET6
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 として表現されます。

typedef uint16_t SOLID_NET_IN_PORT

IPv4/v6ポート番号をネットワークバイトオーダーで指定します。

typedef union _SOLID_NET_IN6_ADDR SOLID_NET_IN6_ADDR
union _SOLID_NET_IN6_ADDR
uint32_t u32_addr[4]
uint8_t u8_addr[16]
uint8_t s6_addr[16]
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 を使用してください。

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

アドレスファミリーを指定します。

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
};
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

リンクローカル・サイトローカルアドレスのスコープを実装依存の方法で指定します。

ソケットの制御

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_SOCKET_TYPE_STREAM
SOLID_NET_SOCKET_TYPE_DGRAM
SOLID_NET_SOCKET_TYPE_RAW
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() でシャットダウンする方向を指定します。

SOLID_NET_SHUTDOWN_RECEIVE
SOLID_NET_SHUTDOWN_SEND
SOLID_NET_SHUTDOWN_BOTH

定数

説明

SOLID_NET_SHUTDOWN_RECEIVE

受信

SOLID_NET_SHUTDOWN_SEND

送信のみ

SOLID_NET_SHUTDOWN_BOTH

受信と送信

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) の場合、それぞれ NULL0 を指定してください。

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 でそのサイズを指定します。制御データを使用しない場合はそれぞれ NULL0 を指定してください。

int msg_flags

このフィールドは無視されます。

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

送信時、レコードの完結を示します。この意味は実装とプロトコルに依存します。

ソケットオプション

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

ソケット一般のオプションを含むレベルです。

typedef int SOLID_NET_SOCKOPT

ソケットのオプションを指定します。各レベルで利用可能なオプションを以下に示します。

ソケットレベル (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

タイムアウト時間を秒単位で指定します。

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

ローカルインタフェースのアドレスを指定します。

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

ローカルインタフェースを実装依存の方法で指定します。

TCPレベル (SOLID_NET_IPPROTO_TCP)

レベル SOLID_NET_IPPROTO_TCP には以下のオプションが存在します。

SOLID_NET_SOCKOPT_TCP_NODELAY
SOLID_NET_SOCKOPT_TCP_KEEPALIVE
SOLID_NET_SOCKOPT_TCP_KEEPIDLE
SOLID_NET_SOCKOPT_TCP_KEEPINTVL
SOLID_NET_SOCKOPT_TCP_KEEPCNT

UDP-Liteレベル (SOLID_NET_IPPROTO_UDPLITE)

レベル SOLID_NET_IPPROTO_UDPLITE には以下のオプションが存在します。

SOLID_NET_SOCKOPT_UDPLITE_SEND_CSCOV
SOLID_NET_SOCKOPT_UDPLITE_RECV_CSCOV

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ファイルディスクリプタの集合です。

size_t num_fds

fds の有効な要素数を表します。

SOLID_NET_FD fds[SOLID_NET_FD_SETSIZE]

含まれるファイルディスクリプタを表す配列です。

注意

SOLID Socketsでは SOLID_NET_FDSET はファイルディスクリプタの配列として表現されており、一般的なPOSIXの実装とは異なります。

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() は発生したイベントの集合をこのメンバ変数に格納します。

typedef short SOLID_NET_POLLMASK

Socketsファイルで発生するイベントの種類を表すビットフラグです。

SOLID_NET_POLLMASK_IN

受信可能なデータが存在する。

SOLID_NET_POLLMASK_OUT

送信キューに空きがある。

SOLID_NET_POLLMASK_RDNORM

SOLID_NET_POLLMASK_IN と同等。

SOLID_NET_POLLMASK_WRNORM

SOLID_NET_POLLMASK_OUT と同等。

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

ハングアップした (通信経路が相手方から切断された)。

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 引数は無視されます。

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(): 監視対象に関連付けられたユーザデータを返します。

typedef union _SOLID_NET_EPOLL_DATA SOLID_NET_EPOLL_DATA
union _SOLID_NET_EPOLL_DATA

EPollオブジェクトで監視対象のSocketsファイルディスクリプタに対応付けられるユーザデータを表します。SOLID Sockets実装はこの値をアプリケーションにそのまま返す以外には使用しません。

void *ptr
SOLID_NET_FD fd
uint32_t u32
uint64_t u64
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_FD SOLID_NET_Event(uint64_t init, SOLID_NET_EVENT_FLAGS flags)

イベント通知オブジェクトを作成します。

typedef int SOLID_NET_EVENT_FLAGS

イベント通知オブジェクトの動作を制御するビットフラグです。

SOLID_NET_EVENT_FLAGS_NONBLOCK

ノンブロッキングI/Oモードを有効化します。

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 が含まれます。

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_ADDRINFOai_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アドレスを返します。

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() を呼び出すことによって取得できます。

エラー情報の取得

int SOLID_NET_GetLastError()

現在のスレッドの最後のSOLID Sockets操作のエラーコードを取得します。

const char *SOLID_NET_StrError(int errn)

与えられたエラーコードを説明する文字列を返します。説明が提供されていない場合、NULL を返します。

エラーコード

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エラーコード定数です。

定数

説明

SOLID_NET_ERR_EADDRINUSE

アドレスが使用中

SOLID_NET_ERR_EADDRNOTAVAIL

アドレスが利用不可

SOLID_NET_ERR_EAFNOSUPPORT

アドレスファミリーが未サポート

SOLID_NET_ERR_EAGAIN

リソースが一時的に利用不可

SOLID_NET_ERR_EALREADY

接続処理がすでに進行中

SOLID_NET_ERR_EBADF

不正なSocketsファイルディスクリプタ

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_EINVAL

引数が不正

SOLID_NET_ERR_EIO

I/Oエラー

SOLID_NET_ERR_EISCONN

ソケットが接続済み

SOLID_NET_ERR_EMSGSIZE

メッセージが大きすぎる

SOLID_NET_ERR_ENFILE

開かれたSocketsファイルが多すぎる

SOLID_NET_ERR_ENOBUFS

バッファ領域不足

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

リモートI/Oエラー

SOLID_NET_ERR_EWOULDBLOCK

現在の状態ではこの操作はブロックする (SOLID_NET_ERR_EAGAIN と同じ値)

SOLID_NET_ERR_EAI_FAIL
SOLID_NET_ERR_EAI_FAMILY
SOLID_NET_ERR_EAI_MEMORY
SOLID_NET_ERR_EAI_NONAME
SOLID_NET_ERR_EAI_SERVICE

SOLID_NET_GetAddrInfo() のみで使用されるエラーコードです。

定数

説明

SOLID_NET_ERR_EAI_FAIL

その他のエラー

SOLID_NET_ERR_EAI_FAMILY

アドレスファミリーが未サポート

SOLID_NET_ERR_EAI_MEMORY

メモリ不足

SOLID_NET_ERR_EAI_NONAME

名前を解決できない

SOLID_NET_ERR_EAI_SERVICE

指定されたサービス名を認識できない

POSIX互換ラッパー

solid_sockets_compat.h はPOSIX互換APIを提供するSOLID Socketsのラッパーです。

#include "solid_sockets_compat.h"

このヘッダーをインクルードするとSOLID Sockets API関数をPOSIX互換の名前で呼び出すことができます。SOLID SocketsとPOSIXで機能的にオーバーラップする関数は全て提供されていますが、以下の例外が存在します。

errnoSOLID_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_setSOLID_NET_FDSET のSOLID Sockets固有の振る舞いに従う

POSIXとの差異を参照してください。