Win32 API 日本語リファレンス
ホームNetworking.WinSock › WSAConnectByList

WSAConnectByList

関数
アドレス候補一覧から接続可能な相手へ接続する。
DLLWS2_32.dll呼出規約winapiSetLastErrorあり対応OSWindows 8.1 以降

シグネチャ

// WS2_32.dll
#include <windows.h>

BOOL WSAConnectByList(
    SOCKET s,
    SOCKET_ADDRESS_LIST* SocketAddress,
    DWORD* LocalAddressLength,   // optional
    SOCKADDR* LocalAddress,   // optional
    DWORD* RemoteAddressLength,   // optional
    SOCKADDR* RemoteAddress,   // optional
    const TIMEVAL* timeout,   // optional
    OVERLAPPED* Reserved   // optional
);

パラメーター

名前方向
sSOCKETin
SocketAddressSOCKET_ADDRESS_LIST*in
LocalAddressLengthDWORD*inoutoptional
LocalAddressSOCKADDR*outoptional
RemoteAddressLengthDWORD*inoutoptional
RemoteAddressSOCKADDR*outoptional
timeoutTIMEVAL*inoptional
ReservedOVERLAPPED*optional

戻り値の型: BOOL

各言語での呼び出し定義

// WS2_32.dll
#include <windows.h>

BOOL WSAConnectByList(
    SOCKET s,
    SOCKET_ADDRESS_LIST* SocketAddress,
    DWORD* LocalAddressLength,   // optional
    SOCKADDR* LocalAddress,   // optional
    DWORD* RemoteAddressLength,   // optional
    SOCKADDR* RemoteAddress,   // optional
    const TIMEVAL* timeout,   // optional
    OVERLAPPED* Reserved   // optional
);
[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("WS2_32.dll", SetLastError = true, ExactSpelling = true)]
static extern bool WSAConnectByList(
    UIntPtr s,   // SOCKET
    IntPtr SocketAddress,   // SOCKET_ADDRESS_LIST*
    IntPtr LocalAddressLength,   // DWORD* optional, in/out
    IntPtr LocalAddress,   // SOCKADDR* optional, out
    IntPtr RemoteAddressLength,   // DWORD* optional, in/out
    IntPtr RemoteAddress,   // SOCKADDR* optional, out
    IntPtr timeout,   // TIMEVAL* optional
    IntPtr Reserved   // OVERLAPPED* optional
);
<DllImport("WS2_32.dll", SetLastError:=True, ExactSpelling:=True)>
Public Shared Function WSAConnectByList(
    s As UIntPtr,   ' SOCKET
    SocketAddress As IntPtr,   ' SOCKET_ADDRESS_LIST*
    LocalAddressLength As IntPtr,   ' DWORD* optional, in/out
    LocalAddress As IntPtr,   ' SOCKADDR* optional, out
    RemoteAddressLength As IntPtr,   ' DWORD* optional, in/out
    RemoteAddress As IntPtr,   ' SOCKADDR* optional, out
    timeout As IntPtr,   ' TIMEVAL* optional
    Reserved As IntPtr   ' OVERLAPPED* optional
) As Boolean
End Function
' s : SOCKET
' SocketAddress : SOCKET_ADDRESS_LIST*
' LocalAddressLength : DWORD* optional, in/out
' LocalAddress : SOCKADDR* optional, out
' RemoteAddressLength : DWORD* optional, in/out
' RemoteAddress : SOCKADDR* optional, out
' timeout : TIMEVAL* optional
' Reserved : OVERLAPPED* optional
Declare PtrSafe Function WSAConnectByList Lib "ws2_32" ( _
    ByVal s As LongPtr, _
    ByVal SocketAddress As LongPtr, _
    ByVal LocalAddressLength As LongPtr, _
    ByVal LocalAddress As LongPtr, _
    ByVal RemoteAddressLength As LongPtr, _
    ByVal RemoteAddress As LongPtr, _
    ByVal timeout As LongPtr, _
    ByVal Reserved As LongPtr) As Long
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。
import ctypes
from ctypes import wintypes

WSAConnectByList = ctypes.windll.ws2_32.WSAConnectByList
WSAConnectByList.restype = wintypes.BOOL
WSAConnectByList.argtypes = [
    ctypes.c_size_t,  # s : SOCKET
    ctypes.c_void_p,  # SocketAddress : SOCKET_ADDRESS_LIST*
    ctypes.POINTER(wintypes.DWORD),  # LocalAddressLength : DWORD* optional, in/out
    ctypes.c_void_p,  # LocalAddress : SOCKADDR* optional, out
    ctypes.POINTER(wintypes.DWORD),  # RemoteAddressLength : DWORD* optional, in/out
    ctypes.c_void_p,  # RemoteAddress : SOCKADDR* optional, out
    ctypes.c_void_p,  # timeout : TIMEVAL* optional
    ctypes.c_void_p,  # Reserved : OVERLAPPED* optional
]
# GetLastError: use ctypes.GetLastError() (or ctypes.WinDLL(use_last_error=True))
require 'fiddle'
require 'fiddle/import'

lib = Fiddle.dlopen('WS2_32.dll')
WSAConnectByList = Fiddle::Function.new(
  lib['WSAConnectByList'],
  [
    Fiddle::TYPE_UINTPTR_T,  # s : SOCKET
    Fiddle::TYPE_VOIDP,  # SocketAddress : SOCKET_ADDRESS_LIST*
    Fiddle::TYPE_VOIDP,  # LocalAddressLength : DWORD* optional, in/out
    Fiddle::TYPE_VOIDP,  # LocalAddress : SOCKADDR* optional, out
    Fiddle::TYPE_VOIDP,  # RemoteAddressLength : DWORD* optional, in/out
    Fiddle::TYPE_VOIDP,  # RemoteAddress : SOCKADDR* optional, out
    Fiddle::TYPE_VOIDP,  # timeout : TIMEVAL* optional
    Fiddle::TYPE_VOIDP,  # Reserved : OVERLAPPED* optional
  ],
  Fiddle::TYPE_INT)
#[link(name = "ws2_32")]
extern "system" {
    fn WSAConnectByList(
        s: usize,  // SOCKET
        SocketAddress: *mut SOCKET_ADDRESS_LIST,  // SOCKET_ADDRESS_LIST*
        LocalAddressLength: *mut u32,  // DWORD* optional, in/out
        LocalAddress: *mut SOCKADDR,  // SOCKADDR* optional, out
        RemoteAddressLength: *mut u32,  // DWORD* optional, in/out
        RemoteAddress: *mut SOCKADDR,  // SOCKADDR* optional, out
        timeout: *const TIMEVAL,  // TIMEVAL* optional
        Reserved: *mut OVERLAPPED  // OVERLAPPED* optional
    ) -> i32;
}
// crates: windows-sys provides ready-made bindings for this API.
$sig = @"
[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("WS2_32.dll", SetLastError = true)]
public static extern bool WSAConnectByList(UIntPtr s, IntPtr SocketAddress, IntPtr LocalAddressLength, IntPtr LocalAddress, IntPtr RemoteAddressLength, IntPtr RemoteAddress, IntPtr timeout, IntPtr Reserved);
"@
$api = Add-Type -MemberDefinition $sig -Name 'WS2_32_WSAConnectByList' -Namespace Win32 -PassThru
# $api::WSAConnectByList(s, SocketAddress, LocalAddressLength, LocalAddress, RemoteAddressLength, RemoteAddress, timeout, Reserved)
#uselib "WS2_32.dll"
#func global WSAConnectByList "WSAConnectByList" sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr
; WSAConnectByList s, varptr(SocketAddress), varptr(LocalAddressLength), varptr(LocalAddress), varptr(RemoteAddressLength), varptr(RemoteAddress), varptr(timeout), varptr(Reserved)   ; 戻り値は stat
; s : SOCKET -> "sptr"
; SocketAddress : SOCKET_ADDRESS_LIST* -> "sptr"
; LocalAddressLength : DWORD* optional, in/out -> "sptr"
; LocalAddress : SOCKADDR* optional, out -> "sptr"
; RemoteAddressLength : DWORD* optional, in/out -> "sptr"
; RemoteAddress : SOCKADDR* optional, out -> "sptr"
; timeout : TIMEVAL* optional -> "sptr"
; Reserved : OVERLAPPED* optional -> "sptr"
; ※HSP3.7は #func のため戻り値はシステム変数 stat に格納されます。
出力引数:
#uselib "WS2_32.dll"
#cfunc global WSAConnectByList "WSAConnectByList" sptr, var, var, var, var, var, var, var
; res = WSAConnectByList(s, SocketAddress, LocalAddressLength, LocalAddress, RemoteAddressLength, RemoteAddress, timeout, Reserved)
; s : SOCKET -> "sptr"
; SocketAddress : SOCKET_ADDRESS_LIST* -> "var"
; LocalAddressLength : DWORD* optional, in/out -> "var"
; LocalAddress : SOCKADDR* optional, out -> "var"
; RemoteAddressLength : DWORD* optional, in/out -> "var"
; RemoteAddress : SOCKADDR* optional, out -> "var"
; timeout : TIMEVAL* optional -> "var"
; Reserved : OVERLAPPED* optional -> "var"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
出力引数:
; BOOL WSAConnectByList(SOCKET s, SOCKET_ADDRESS_LIST* SocketAddress, DWORD* LocalAddressLength, SOCKADDR* LocalAddress, DWORD* RemoteAddressLength, SOCKADDR* RemoteAddress, TIMEVAL* timeout, OVERLAPPED* Reserved)
#uselib "WS2_32.dll"
#cfunc global WSAConnectByList "WSAConnectByList" intptr, var, var, var, var, var, var, var
; res = WSAConnectByList(s, SocketAddress, LocalAddressLength, LocalAddress, RemoteAddressLength, RemoteAddress, timeout, Reserved)
; s : SOCKET -> "intptr"
; SocketAddress : SOCKET_ADDRESS_LIST* -> "var"
; LocalAddressLength : DWORD* optional, in/out -> "var"
; LocalAddress : SOCKADDR* optional, out -> "var"
; RemoteAddressLength : DWORD* optional, in/out -> "var"
; RemoteAddress : SOCKADDR* optional, out -> "var"
; timeout : TIMEVAL* optional -> "var"
; Reserved : OVERLAPPED* optional -> "var"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
import (
	"golang.org/x/sys/windows"
	"unsafe"
)

var (
	ws2_32 = windows.NewLazySystemDLL("WS2_32.dll")
	procWSAConnectByList = ws2_32.NewProc("WSAConnectByList")
)

// s (SOCKET), SocketAddress (SOCKET_ADDRESS_LIST*), LocalAddressLength (DWORD* optional, in/out), LocalAddress (SOCKADDR* optional, out), RemoteAddressLength (DWORD* optional, in/out), RemoteAddress (SOCKADDR* optional, out), timeout (TIMEVAL* optional), Reserved (OVERLAPPED* optional)
r1, _, err := procWSAConnectByList.Call(
	uintptr(s),
	uintptr(SocketAddress),
	uintptr(LocalAddressLength),
	uintptr(LocalAddress),
	uintptr(RemoteAddressLength),
	uintptr(RemoteAddress),
	uintptr(timeout),
	uintptr(Reserved),
)
_ = err  // syscall.Errno (valid when the call sets last-error)
_ = r1   // BOOL
function WSAConnectByList(
  s: NativeUInt;   // SOCKET
  SocketAddress: Pointer;   // SOCKET_ADDRESS_LIST*
  LocalAddressLength: Pointer;   // DWORD* optional, in/out
  LocalAddress: Pointer;   // SOCKADDR* optional, out
  RemoteAddressLength: Pointer;   // DWORD* optional, in/out
  RemoteAddress: Pointer;   // SOCKADDR* optional, out
  timeout: Pointer;   // TIMEVAL* optional
  Reserved: Pointer   // OVERLAPPED* optional
): BOOL; stdcall;
  external 'WS2_32.dll' name 'WSAConnectByList';
result := DllCall("WS2_32\WSAConnectByList"
    , "UPtr", s   ; SOCKET
    , "Ptr", SocketAddress   ; SOCKET_ADDRESS_LIST*
    , "Ptr", LocalAddressLength   ; DWORD* optional, in/out
    , "Ptr", LocalAddress   ; SOCKADDR* optional, out
    , "Ptr", RemoteAddressLength   ; DWORD* optional, in/out
    , "Ptr", RemoteAddress   ; SOCKADDR* optional, out
    , "Ptr", timeout   ; TIMEVAL* optional
    , "Ptr", Reserved   ; OVERLAPPED* optional
    , "Int")   ; return: BOOL
●WSAConnectByList(s, SocketAddress, LocalAddressLength, LocalAddress, RemoteAddressLength, RemoteAddress, timeout, Reserved) = DLL("WS2_32.dll", "bool WSAConnectByList(int, void*, void*, void*, void*, void*, void*, void*)")
# 呼び出し: WSAConnectByList(s, SocketAddress, LocalAddressLength, LocalAddress, RemoteAddressLength, RemoteAddress, timeout, Reserved)
# s : SOCKET -> "int"
# SocketAddress : SOCKET_ADDRESS_LIST* -> "void*"
# LocalAddressLength : DWORD* optional, in/out -> "void*"
# LocalAddress : SOCKADDR* optional, out -> "void*"
# RemoteAddressLength : DWORD* optional, in/out -> "void*"
# RemoteAddress : SOCKADDR* optional, out -> "void*"
# timeout : TIMEVAL* optional -> "void*"
# Reserved : OVERLAPPED* optional -> "void*"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。