uv_udp_t — UDPハンドル¶
UDPハンドルは、クライアントとサーバーの両方のUDP通信をカプセル化します。
データ型¶
-
type uv_udp_t¶
UDPハンドルの型です。
-
type uv_udp_send_t¶
UDP送信要求の型です。
-
enum uv_udp_flags¶
次の関数とコールバックで使うフラグです:
uv_udp_bind()およびuv_udp_recv_cb。enum uv_udp_flags { /* Disables dual stack mode. */ UV_UDP_IPV6ONLY = 1, /* * Indicates message was truncated because read buffer was too small. The * remainder was discarded by the OS. Used in uv_udp_recv_cb. */ UV_UDP_PARTIAL = 2, /* * Indicates if SO_REUSEADDR will be set when binding the handle. * This sets the SO_REUSEPORT socket flag on the BSDs (except for * DragonFlyBSD), OS X, and other platforms where SO_REUSEPORTs don't * have the capability of load balancing, as the opposite of what * UV_UDP_REUSEPORT would do. On other Unix platforms, it sets the * SO_REUSEADDR flag. What that means is that multiple threads or * processes can bind to the same address without error (provided * they all set the flag) but only the last one to bind will receive * any traffic, in effect "stealing" the port from the previous listener. */ UV_UDP_REUSEADDR = 4, /* * Indicates that the message was received by recvmmsg, so the buffer provided * must not be freed by the recv_cb callback. */ UV_UDP_MMSG_CHUNK = 8, /* * Indicates that the buffer provided has been fully utilized by recvmmsg and * that it should now be freed by the recv_cb callback. When this flag is set * in uv_udp_recv_cb, nread will always be 0 and addr will always be NULL. */ UV_UDP_MMSG_FREE = 16, /* * Indicates if IP_RECVERR/IPV6_RECVERR will be set when binding the handle. * This sets IP_RECVERR for IPv4 and IPV6_RECVERR for IPv6 UDP sockets on * Linux. This stops the Linux kernel from suppressing some ICMP error messages * and enables full ICMP error reporting for faster failover. * This flag is no-op on platforms other than Linux. */ UV_UDP_LINUX_RECVERR = 32, /* * Indicates if SO_REUSEPORT will be set when binding the handle. * This sets the SO_REUSEPORT socket option on supported platforms. * Unlike UV_UDP_REUSEADDR, this flag will make multiple threads or * processes that are binding to the same address and port "share" * the port, which means incoming datagrams are distributed across * the receiving sockets among threads or processes. * * This flag is available only on Linux 3.9+, DragonFlyBSD 3.6+, * FreeBSD 12.0+, Solaris 11.4, and AIX 7.2.5+ for now. */ UV_UDP_REUSEPORT = 64, /* * Indicates that recvmmsg should be used, if available. The uv_alloc_cb * for this handle should create buffers that are multiples of 64 KiB. */ UV_UDP_RECVMMSG = 256 };
-
typedef void (*uv_udp_send_cb)(uv_udp_send_t *req, int status)¶
次の関数へ渡すコールバックの型定義です:
uv_udp_send()。データの送信後に呼び出します。
-
typedef void (*uv_udp_recv_cb)(uv_udp_t *handle, ssize_t nread, const uv_buf_t *buf, const struct sockaddr *addr, unsigned flags)¶
次の関数へ渡すコールバックの型定義です:
uv_udp_recv_start()。エンドポイントがデータを受信したときに呼び出します。handle: UDPハンドル。
nread: 受信したバイト数です。読み取るデータがなくなると0になります。0は空のデータグラムの受信を示す場合もあります(この場合、addrはNULLではありません)。伝送エラーを検出すると0未満になります。次の関数、recvmmsg(2)を使っている場合、それ以上のチャンクは受信せず、バッファを安全に解放できます。
buf:
uv_buf_t型の受信データを格納したバッファです。addr:
struct sockaddr*型の、送信元アドレスを格納した構造体です。NULLの場合もあります。コールバックの実行中だけ有効です。flags: 1つ以上のUV_UDP_*定数をORで組み合わせたものです。
バッファを解放する責任は呼び出された側にあり、libuvは再利用しません。エラー時には、次の条件を満たすヌルバッファの場合があります: buf->base == NULLかつbuf->len == 0。
次の関数、recvmmsg(2)を使う場合、各チャンクにはUV_UDP_MMSG_CHUNKフラグが設定されており、解放してはいけません。エラーがなければ、最後に次の条件のコールバックを呼び出します: nreadは0、addrはNULL、バッファは最初に確保したデータを指し、UV_UDP_MMSG_CHUNKフラグは解除され、UV_UDP_MMSG_FREEフラグが設定されます。UDPソケットエラーが起きると、nreadは0未満になります。どちらの場合も、呼び出された側は渡されたバッファを安全に解放できます。
バージョン1.40.0での変更: 次のフラグを追加しました: UV_UDP_MMSG_FREE。
注記
受信コールバックは、読み取るデータがないときにはnread == 0かつaddr == NULLで呼び出します。空のUDPパケットを受信したときにはnread == 0かつaddr != NULLで呼び出します。
-
enum uv_membership¶
マルチキャストアドレスのメンバーシップの型です。
typedef enum { UV_LEAVE_GROUP = 0, UV_JOIN_GROUP } uv_membership;
公開メンバー¶
-
uv_udp_t *uv_udp_send_t.handle¶
この送信要求を実行しているUDPハンドルです。
関連項目
次の型のuv_handle_tメンバーも適用されます。
API¶
-
int uv_udp_init(uv_loop_t *loop, uv_udp_t *handle)¶
新しいUDPハンドルを初期化します。実際のソケットは必要になるまで作成しません。成功時は0を返します。
-
int uv_udp_init_ex(uv_loop_t *loop, uv_udp_t *handle, unsigned int flags)¶
指定したフラグでハンドルを初期化します。次のパラメーター、flagsの下位8ビットをソケットドメインとして使い、そのドメインのソケットを作成します。指定したドメインが
AF_UNSPECなら、次の関数と同じく、ソケットは作成しません:uv_udp_init()。残りのビットには、次のフラグを設定できます:
UV_UDP_RECVMMSG: 設定していて、プラットフォームがサポートしていれば、recvmmsg(2)を使います。このハンドルの
uv_alloc_cbは、64 KiBの倍数のバッファを作成してください。
バージョン1.7.0で追加。
バージョン1.37.0での変更: 次のフラグを追加しました: UV_UDP_RECVMMSG。
-
int uv_udp_open_ex(uv_udp_t *handle, uv_os_sock_t sock, unsigned int flags)¶
既存のファイルディスクリプターまたはWindows SOCKETをUDPハンドルとして開きます。
- パラメーター:
handle – UDPハンドルです。次の関数で初期化しておく必要があります:
uv_udp_init()。sock – ハンドルに関連付ける既存のソケットです。
flags – ソケットの動作を制御するフラグです。
UV_UDP_REUSEADDRおよびUV_UDP_REUSEPORTをサポートしています。
- 戻り値:
成功時は0、失敗時は0未満のエラーコードを返します。
バージョン1.52.0で追加。
-
int uv_udp_open(uv_udp_t *handle, uv_os_sock_t sock)¶
既存のファイルディスクリプターまたはWindows SOCKETをUDPハンドルとして開きます。
Unixだけ: sock引数の唯一の要件は、データグラムの契約に従うことです(未接続モードで動作し、sendmsg()/recvmsg()をサポートするなど)。つまり、rawソケットやnetlinkソケットなど、ほかのデータグラム型ソケットも渡せます。
バージョン1.2.1での変更: ファイルディスクリプターを非ブロッキングモードに設定するようになりました。
注記
渡されたファイルディスクリプターまたはSOCKETの型は検査しませんが、有効なデータグラムソケットを表す必要があります。
内部でSO_REUSEADDRソケットオプションを無条件に設定します。つまり、ユーザーの意図にかかわらず再利用フラグは常に有効です。より細かく制御するには、次の関数を使ってください:
uv_udp_open_ex()。
-
int uv_udp_bind(uv_udp_t *handle, const struct sockaddr *addr, unsigned int flags)¶
UDPハンドルをIPアドレスとポートへバインドします。
- パラメーター:
handle – UDPハンドルです。次の関数で初期化しておく必要があります:
uv_udp_init()。addr – struct sockaddr_inまたはstruct sockaddr_in6型の、バインド先アドレスとポートを格納した構造体です。
flags – ソケットのバインド方法を指定します。
UV_UDP_IPV6ONLY,UV_UDP_REUSEADDR,UV_UDP_REUSEPORTおよびUV_UDP_RECVERRをサポートしています。
- 戻り値:
成功時は0、失敗時は0未満のエラーコードを返します。
バージョン1.49.0での変更: 次のフラグを追加しました:
UV_UDP_REUSEPORT。注記
UV_UDP_REUSEPORTフラグは、現在、Linux 3.9以降、DragonFlyBSD 3.6以降、FreeBSD 12.0以降、Solaris 11.4、AIX 7.2.5以降だけで利用できます。それ以外ではUV_ENOTSUPエラーを返します。負荷分散機能があるプラットフォームでは、SO_REUSEPORT`sについて、flagsに``UV_UDP_REUSEADDR`とUV_UDP_REUSEPORTを同時に指定できます。この場合、SO_REUSEPORTの動作が常にSO_REUSEADDRより優先されます。負荷分散機能がないプラットフォームでは、SO_REUSEPORT`sについて、flagsに``UV_UDP_REUSEADDR`とUV_UDP_REUSEPORTを同時に指定すると、UV_ENOTSUPエラーで失敗します。
-
int uv_udp_connect(uv_udp_t *handle, const struct sockaddr *addr)¶
UDPハンドルをリモートアドレスとポートに関連付けます。このハンドルから送るすべてのメッセージは、その宛先へ自動的に送信されます。切断するには次の組み合わせを指定します: NULL addr(addrにNULLを指定します)。すでに接続済みのハンドルでuv_udp_connect()を呼び出すと、UV_EISCONNエラーになります。未接続のハンドルを切断しようとすると、UV_ENOTCONNエラーを返します。
- パラメーター:
handle – UDPハンドルです。次の関数で初期化しておく必要があります:
uv_udp_init()。addr – struct sockaddr_inまたはstruct sockaddr_in6型の、関連付けるアドレスとポートを格納した構造体です。
- 戻り値:
成功時は0、失敗時は0未満のエラーコードを返します。
バージョン1.27.0で追加。
-
int uv_udp_getpeername(const uv_udp_t *handle, struct sockaddr *name, int *namelen)¶
接続済みのUDPハンドルのリモートIPとポートを取得します。未接続の場合は、次のエラーを返します: UV_ENOTCONN。
- パラメーター:
handle – UDPハンドルです。次の関数、
uv_udp_init()で初期化し、バインドしておく必要があります。name – アドレスデータを格納する構造体へのポインターです。IPv4とIPv6をサポートするには、struct sockaddr_storageを使ってください。
namelen – 入力時には、次のフィールドのデータを示します: name。出力時には、そのうちどれだけ格納したかを示します。
- 戻り値:
成功時は0、失敗時は0未満のエラーコードを返します。
バージョン1.27.0で追加。
-
int uv_udp_getsockname(const uv_udp_t *handle, struct sockaddr *name, int *namelen)¶
UDPハンドルのローカルIPとポートを取得します。
- パラメーター:
handle – UDPハンドルです。次の関数、
uv_udp_init()で初期化し、バインドしておく必要があります。name – アドレスデータを格納する構造体へのポインターです。IPv4とIPv6をサポートするには、struct sockaddr_storageを使ってください。
namelen – 入力時には、次のフィールドのデータを示します: name。出力時には、そのうちどれだけ格納したかを示します。
- 戻り値:
成功時は0、失敗時は0未満のエラーコードを返します。
-
int uv_udp_set_membership(uv_udp_t *handle, const char *multicast_addr, const char *interface_addr, uv_membership membership)¶
マルチキャストアドレスのメンバーシップを設定します。
- パラメーター:
handle – UDPハンドルです。次の関数で初期化しておく必要があります:
uv_udp_init()。multicast_addr – メンバーシップを設定するマルチキャストアドレスです。
interface_addr – インターフェイスのアドレスです。
membership – 次のいずれかを指定してください:
UV_JOIN_GROUPまたはUV_LEAVE_GROUP。
- 戻り値:
成功時は0、失敗時は0未満のエラーコードを返します。
-
int uv_udp_set_source_membership(uv_udp_t *handle, const char *multicast_addr, const char *interface_addr, const char *source_addr, uv_membership membership)¶
送信元を指定するマルチキャストグループのメンバーシップを設定します。
- パラメーター:
handle – UDPハンドルです。次の関数で初期化しておく必要があります:
uv_udp_init()。multicast_addr – メンバーシップを設定するマルチキャストアドレスです。
interface_addr – インターフェイスのアドレスです。
source_addr – 送信元アドレスです。
membership – 次のいずれかを指定してください:
UV_JOIN_GROUPまたはUV_LEAVE_GROUP。
- 戻り値:
成功時は0、失敗時は0未満のエラーコードを返します。
バージョン1.32.0で追加。
-
int uv_udp_set_multicast_loop(uv_udp_t *handle, int on)¶
IPマルチキャストのループフラグを設定します。マルチキャストパケットをローカルソケットへループバックさせます。
- パラメーター:
handle – UDPハンドルです。次の関数、
uv_udp_init_ex()でAF_INETまたはAF_INET6を指定して初期化するか、次の関数、uv_udp_bind()でアドレスへ明示的にバインドするか、次の関数、uv_udp_send()またはuv_udp_recv_start()で暗黙にバインドしておく必要があります。on – 有効にするには1、無効にするには0を指定します。
- 戻り値:
成功時は0、失敗時は0未満のエラーコードを返します。
-
int uv_udp_set_multicast_ttl(uv_udp_t *handle, int ttl)¶
マルチキャストのTTLを設定します。
- パラメーター:
handle – UDPハンドルです。次の関数、
uv_udp_init_ex()でAF_INETまたはAF_INET6を指定して初期化するか、次の関数、uv_udp_bind()でアドレスへ明示的にバインドするか、次の関数、uv_udp_send()またはuv_udp_recv_start()で暗黙にバインドしておく必要があります。ttl – 1から255です。
- 戻り値:
成功時は0、失敗時は0未満のエラーコードを返します。
-
int uv_udp_set_multicast_interface(uv_udp_t *handle, const char *interface_addr)¶
データを送受信するマルチキャストインターフェイスを設定します。
- パラメーター:
handle – UDPハンドルです。次の関数、
uv_udp_init_ex()でAF_INETまたはAF_INET6を指定して初期化するか、次の関数、uv_udp_bind()でアドレスへ明示的にバインドするか、次の関数、uv_udp_send()またはuv_udp_recv_start()で暗黙にバインドしておく必要があります。interface_addr – インターフェイスのアドレスです。
- 戻り値:
成功時は0、失敗時は0未満のエラーコードを返します。
-
int uv_udp_set_broadcast(uv_udp_t *handle, int on)¶
ブロードキャストを有効または無効にします。
- パラメーター:
handle – UDPハンドルです。次の関数、
uv_udp_init_ex()でAF_INETまたはAF_INET6を指定して初期化するか、次の関数、uv_udp_bind()でアドレスへ明示的にバインドするか、次の関数、uv_udp_send()またはuv_udp_recv_start()で暗黙にバインドしておく必要があります。on – 有効にするには1、無効にするには0を指定します。
- 戻り値:
成功時は0、失敗時は0未満のエラーコードを返します。
-
int uv_udp_set_ttl(uv_udp_t *handle, int ttl)¶
生存時間(TTL)を設定します。
- パラメーター:
handle – UDPハンドルです。次の関数、
uv_udp_init_ex()でAF_INETまたはAF_INET6を指定して初期化するか、次の関数、uv_udp_bind()でアドレスへ明示的にバインドするか、次の関数、uv_udp_send()またはuv_udp_recv_start()で暗黙にバインドしておく必要があります。ttl – 1から255です。
- 戻り値:
成功時は0、失敗時は0未満のエラーコードを返します。
-
int uv_udp_send(uv_udp_send_t *req, uv_udp_t *handle, const uv_buf_t bufs[], unsigned int nbufs, const struct sockaddr *addr, uv_udp_send_cb send_cb)¶
UDPソケットでデータを送信します。ソケットを事前に次の関数、
uv_udp_bind()でバインドしていなければ、0.0.0.0(すべてのインターフェイスを表すIPv4アドレス)とランダムなポート番号へバインドします。Windowsでは、addrが未指定アドレス(
0.0.0.0または::)を指すよう初期化されている場合、localhostを指すよう変更します。これはLinuxの動作に合わせるためです。接続済みのUDPハンドルでは、addrをNULLに設定してください。それ以外はUV_EISCONNエラーを返します。
未接続のUDPハンドルでは、addrをNULLにできません。そうするとUV_EDESTADDRREQエラーを返します。
- パラメーター:
req – UDP要求ハンドルです。初期化は不要です。
handle – UDPハンドルです。次の関数で初期化しておく必要があります:
uv_udp_init()。bufs – 送信するバッファのリストです。
nbufs – 次のリスト内のバッファ数です: bufs。
addr – struct sockaddr_inまたはstruct sockaddr_in6型の、リモートピアのアドレスとポートを格納した構造体です。
send_cb – データの送信後に呼び出すコールバックです。
- 戻り値:
成功時は0、失敗時は0未満のエラーコードを返します。
バージョン1.19.0での変更: 次のアドレス、
0.0.0.0と::をlocalhostへ対応付ける処理を追加しました。バージョン1.27.0での変更: 接続済みソケットのサポートを追加しました。
-
int uv_udp_try_send(uv_udp_t *handle, const uv_buf_t bufs[], unsigned int nbufs, const struct sockaddr *addr)¶
次の関数、
uv_udp_send()と同じですが、即座に完了できない場合も送信要求をキューに入れません。接続済みのUDPハンドルでは、addrをNULLに設定してください。それ以外はUV_EISCONNエラーを返します。
未接続のUDPハンドルでは、addrをNULLにできません。そうするとUV_EDESTADDRREQエラーを返します。
- 戻り値:
0以上: 送信したバイト数(指定したバッファサイズと一致します)。0未満: 負のエラーコード(即座に送信できない場合は、
UV_EAGAINを返します)。
バージョン1.27.0での変更: 接続済みソケットのサポートを追加しました。
-
int uv_udp_try_send2(uv_udp_t *handle, unsigned int count, uv_buf_t *bufs[
/*count*/], unsigned int nbufs[/*count*/], struct sockaddr *addrs[/*count*/], unsigned int flags)¶ 次の関数、
uv_udp_try_send()と同様ですが、複数のデータグラムを送信できます。次の関数を簡潔に抽象化しています: sendmmsg(2)。この関数をサポートしないプラットフォームでは、sendmsg(2)を使うループへフォールバックします。ハンドルは完全に初期化する必要があります。先にc:func:uv_udp_bindを呼び出してください。- 戻り値:
0以上: 送信したデータグラム数。0になるのは、countが0だった場合だけです。0未満: 負のエラーコード。最初のデータグラムの送信に失敗した場合だけ負の値となり、それ以外は正の送信数を返します。即座に送信できないときは、
UV_EAGAINになります。次の関数へフォールバックしてください:uv_udp_send()。
バージョン1.50.0で追加。
-
int uv_udp_recv_start(uv_udp_t *handle, uv_alloc_cb alloc_cb, uv_udp_recv_cb recv_cb)¶
データの受信を準備します。ソケットを事前に次の関数、
uv_udp_bind()でバインドしていなければ、0.0.0.0(すべてのインターフェイスを表すIPv4アドレス)とランダムなポート番号へバインドします。- パラメーター:
handle – UDPハンドルです。次の関数で初期化しておく必要があります:
uv_udp_init()。alloc_cb – 一時記憶領域が必要なときに呼び出すコールバックです。
recv_cb – 受信したデータを渡して呼び出すコールバックです。
- 戻り値:
成功時は0、失敗時は0未満のエラーコードを返します。
注記
次の関数、recvmmsg(2)を使う場合、1回に受信するメッセージ数の上限は、alloc_cbが確保したバッファに収まる最大サイズのデータグラム数です。また、udp_recv用のsuggested_sizeは、alloc_cbで常に最大サイズのデータグラム1個分のサイズに設定されます。
バージョン1.35.0での変更: 対応プラットフォームでrecvmmsg(2)のサポートを追加しました。このハンドルの
uv_alloc_cbは、64 KiBの倍数のバッファを作成してください。バージョン1.37.0での変更: recvmmsg(2)のサポートは暗黙には有効にならなくなりました。次のフラグ、UV_UDP_RECVMMSGを、次の関数へ渡して明示的に要求してください:
uv_udp_init_ex()。バージョン1.39.0での変更:
uv_udp_using_recvmmsg()をalloc_cb内で使い、現在のハンドルとプラットフォームでrecvmmsg(2)向けサイズのバッファを確保すべきか判断できます。
-
int uv_udp_using_recvmmsg(uv_udp_t *handle)¶
UDPハンドルを次のフラグ、UV_UDP_RECVMMSG付きで作成し、プラットフォームがrecvmmsg(2)をサポートしていれば1、それ以外は0を返します。
バージョン1.39.0で追加。
-
int uv_udp_recv_stop(uv_udp_t *handle)¶
受信データグラムの監視を停止します。
- パラメーター:
handle – UDPハンドルです。次の関数で初期化しておく必要があります:
uv_udp_init()。
- 戻り値:
成功時は0、失敗時は0未満のエラーコードを返します。
-
size_t uv_udp_get_send_queue_size(const uv_udp_t *handle)¶
次の値を返します: handle->send_queue_size。
バージョン1.19.0で追加。
-
size_t uv_udp_get_send_queue_count(const uv_udp_t *handle)¶
次の値を返します: handle->send_queue_count。
バージョン1.19.0で追加。
関連項目
次の型のuv_handle_tAPI関数も適用されます。