SOCK_NOTIFY_REGISTRATION
構造体サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。
フィールド
| フィールド | 型 | サイズ | x64 | x86 | 説明 |
|---|---|---|---|---|---|
| socket | SOCKET | 8/4 | +0 | +0 | WSASocket、socket、WSAAccept、accept、または WSADuplicateSocket の各関数のいずれかで開かれた Winsock ソケットへのハンドルです。サポートされるのは Microsoft Winsock プロバイダーのソケットのみです。 |
| completionKey | void* | 8/4 | +8 | +4 | そのソケットに対して通知が送信されるときに、PostQueuedCompletionStatus 関数の dwCompletionKey パラメーターに使用される値です。このパラメーターは登録の作成時に使用されます。完了キーを変更するには、登録を削除して再登録してください。 |
| eventFilter | WORD | 2 | +16 | +8 | 要求する通知を示すフラグのセットです。次の値 ( SOCK_NOTIFY_REGISTER_EVENT_NONE。通知を発行しません。
SOCK_NOTIFY_REGISTER_EVENT_IN。ブロックせずにデータを読み取れるようになったときに通知を発行します。
SOCK_NOTIFY_REGISTER_EVENT_OUT。ブロックせずにデータを書き込めるようになったときに通知を発行します。
SOCK_NOTIFY_REGISTER_EVENT_HANGUP。ストリーム指向の接続が切断または中止されたときに通知を発行します。
SOCK_NOTIFY_REGISTER_EVENTS_ALL。値は |
| operation | BYTE | 1 | +18 | +10 | 登録に対して実行する操作を示します。一度に実行できる操作は最大 1 つです。これらの値は SOCK_NOTIFY_OP_NONE。登録に関する操作を行いません。アプリケーションが ProcessSocketNotifications を呼び出し、通知の受信のみを目的とする場合に使用します。 SOCK_NOTIFY_OP_ENABLE。登録を有効にします。SOCK_NOTIFY_EVENT_DISABLE 通知を受け取るまで、通知を再度有効にしてはなりません。 SOCK_NOTIFY_OP_DISABLE。登録を無効にしますが、基になるデータ構造は破棄しません。これは登録を削除するものではなく、新しい通知のキューへの登録を抑止するだけである点に注意してください。既にキューに入れられている通知は、SOCK_NOTIFY_EVENT_DISABLE イベントを受け取るまで配信される可能性があります。 SOCK_NOTIFY_OP_REMOVE。以前に登録した通知を削除します。有効な通知と無効な通知のどちらも削除できます。SOCK_NOTIFY_EVENT_REMOVE 通知が発行され、その完了キーに対して再登録しない限り、以降は通知が発行されないことが保証されます。 |
| triggerFlags | BYTE | 1 | +19 | +11 | トリガーの動作を示すフラグのセットです ( SOCK_NOTIFY_TRIGGER_ONESHOT。次の通知が配信された時点で、登録は無効化されます (削除はされません)。 SOCK_NOTIFY_TRIGGER_PERSISTENT。登録は、明示的に無効化または削除されるまで有効なままです。 SOCK_NOTIFY_TRIGGER_LEVEL。登録はレベルトリガー通知に対するものです。エッジトリガーとは併用できません。エッジトリガーかレベルトリガーのいずれか一方を指定する必要があります。 SOCK_NOTIFY_TRIGGER_EDGE。登録はエッジトリガー通知に対するものです。レベルトリガーとは併用できません。エッジトリガーかレベルトリガーのいずれか一方を指定する必要があります。 通知が供給されるのは、登録が有効な場合のみです。登録が無効な間、通知はキューに入れられません。あるソケットに対して通知がキューに入れられる際、それらは 1 つの通知に統合されます。そのため、ソケットの 1 つのイベントマスクで複数のイベントが表される場合があります。 登録が有効な場合、レベルトリガー通知は、目的の条件が成立している間は常に供給されます。 登録が有効な場合、エッジトリガー通知は、条件が不成立から成立へと変化するたびに供給されます。通知がキューに入れられるには、登録が有効な間に条件が変化する必要があります。したがって、登録後は、通知が確実に受け取れるようにソケットの受信バッファーを完全に読み切っておく必要があります。 |
| registrationResult | DWORD | 4 | +20 | +12 | ProcessSocketNotifications の呼び出しが成功した後、registrationResult には登録の成功または失敗を示すコードが格納されます。ERROR_SUCCESS の値は、登録が成功したことを示します。 |
公式ドキュメント
ProcessSocketNotifications 関数に渡す情報を表します。
詳細およびコード例については、Winsock socket state notifications を参照してください。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
各言語での定義
#include <windows.h>
// SOCK_NOTIFY_REGISTRATION (x64 24 / x86 16 バイト)
typedef struct SOCK_NOTIFY_REGISTRATION {
SOCKET socket;
void* completionKey;
WORD eventFilter;
BYTE operation;
BYTE triggerFlags;
DWORD registrationResult;
} SOCK_NOTIFY_REGISTRATION;using System;
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct SOCK_NOTIFY_REGISTRATION
{
public UIntPtr socket;
public IntPtr completionKey;
public ushort eventFilter;
public byte operation;
public byte triggerFlags;
public uint registrationResult;
}Imports System.Runtime.InteropServices
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure SOCK_NOTIFY_REGISTRATION
Public socket As UIntPtr
Public completionKey As IntPtr
Public eventFilter As UShort
Public operation As Byte
Public triggerFlags As Byte
Public registrationResult As UInteger
End Structureimport ctypes
from ctypes import wintypes
class SOCK_NOTIFY_REGISTRATION(ctypes.Structure):
_fields_ = [
("socket", ctypes.c_size_t),
("completionKey", ctypes.c_void_p),
("eventFilter", ctypes.c_ushort),
("operation", ctypes.c_ubyte),
("triggerFlags", ctypes.c_ubyte),
("registrationResult", wintypes.DWORD),
]#[repr(C)]
pub struct SOCK_NOTIFY_REGISTRATION {
pub socket: usize,
pub completionKey: *mut core::ffi::c_void,
pub eventFilter: u16,
pub operation: u8,
pub triggerFlags: u8,
pub registrationResult: u32,
}import "golang.org/x/sys/windows"
type SOCK_NOTIFY_REGISTRATION struct {
socket uintptr
completionKey uintptr
eventFilter uint16
operation byte
triggerFlags byte
registrationResult uint32
}type
SOCK_NOTIFY_REGISTRATION = record
socket: NativeUInt;
completionKey: Pointer;
eventFilter: Word;
operation: Byte;
triggerFlags: Byte;
registrationResult: DWORD;
end;const SOCK_NOTIFY_REGISTRATION = extern struct {
socket: usize,
completionKey: ?*anyopaque,
eventFilter: u16,
operation: u8,
triggerFlags: u8,
registrationResult: u32,
};type
SOCK_NOTIFY_REGISTRATION {.bycopy.} = object
socket: uint
completionKey: pointer
eventFilter: uint16
operation: uint8
triggerFlags: uint8
registrationResult: uint32struct SOCK_NOTIFY_REGISTRATION
{
size_t socket;
void* completionKey;
ushort eventFilter;
ubyte operation;
ubyte triggerFlags;
uint registrationResult;
}HSP用 定義
HSP3.7/3.8 は構造体機能が無いため4byte整数配列(dim)+peek/poke で操作(32/64bitでサイズ・位置が異なる場合はタブで分割)。IronHSP は NSTRUCT(#defstruct/stdim/->)で32/64bit共通。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x86 レイアウト)
; SOCK_NOTIFY_REGISTRATION サイズ: 16 バイト(x86)
dim st, 4 ; 4byte整数×4(構造体サイズ 16 / 4 切り上げ)
; socket : SOCKET (+0, 4byte) st.0 = 値 / 値 = st.0 (lpoke/lpeek も可)
; completionKey : void* (+4, 4byte) st.1 = 値 / 値 = st.1 (lpoke/lpeek も可)
; eventFilter : WORD (+8, 2byte) wpoke st,8,値 / 値 = wpeek(st,8)
; operation : BYTE (+10, 1byte) poke st,10,値 / 値 = peek(st,10)
; triggerFlags : BYTE (+11, 1byte) poke st,11,値 / 値 = peek(st,11)
; registrationResult : DWORD (+12, 4byte) st.3 = 値 / 値 = st.3 (lpoke/lpeek も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; SOCK_NOTIFY_REGISTRATION サイズ: 24 バイト(x64)
dim st, 6 ; 4byte整数×6(構造体サイズ 24 / 4 切り上げ)
; socket : SOCKET (+0, 8byte) qpoke st,0,値 / qpeek(st,0) ※IronHSPのみ。3.7/3.8は lpoke st,0,下位 : lpoke st,4,上位
; completionKey : void* (+8, 8byte) qpoke st,8,値 / qpeek(st,8) ※IronHSPのみ。3.7/3.8は lpoke st,8,下位 : lpoke st,12,上位
; eventFilter : WORD (+16, 2byte) wpoke st,16,値 / 値 = wpeek(st,16)
; operation : BYTE (+18, 1byte) poke st,18,値 / 値 = peek(st,18)
; triggerFlags : BYTE (+19, 1byte) poke st,19,値 / 値 = peek(st,19)
; registrationResult : DWORD (+20, 4byte) st.5 = 値 / 値 = st.5 (lpoke/lpeek も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
#defstruct global SOCK_NOTIFY_REGISTRATION
#field intptr socket
#field intptr completionKey
#field short eventFilter
#field byte operation
#field byte triggerFlags
#field int registrationResult
#endstruct
stdim st, SOCK_NOTIFY_REGISTRATION ; NSTRUCT 変数を確保
st->socket = 100
mes "socket=" + st->socket