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

WSAConnectByNameA

関数
ホスト名とサービス名を指定して接続を確立する。
DLLWS2_32.dll文字セットANSI (-A)呼出規約winapiSetLastErrorあり対応OSWindows 8.1 以降

シグネチャ

// WS2_32.dll  (ANSI / -A)
#include <windows.h>

BOOL WSAConnectByNameA(
    SOCKET s,
    LPCSTR nodename,
    LPCSTR servicename,
    DWORD* LocalAddressLength,   // optional
    SOCKADDR* LocalAddress,   // optional
    DWORD* RemoteAddressLength,   // optional
    SOCKADDR* RemoteAddress,   // optional
    const TIMEVAL* timeout,   // optional
    OVERLAPPED* Reserved   // optional
);

パラメーター

名前方向説明
sSOCKETin未接続でバインド済みのソケット(ストリーム型)。
nodenameLPCSTRin接続先のホスト名またはIPアドレス文字列(ANSI)。
servicenameLPCSTRin接続先のサービス名またはポート番号文字列(ANSI)。
LocalAddressLengthDWORD*inoutoptional入出力。LocalAddressバッファのサイズと実際の長さを示すポインタ。
LocalAddressSOCKADDR*outoptional接続に使われたローカルアドレスを受け取るSOCKADDRへのポインタ。NULL可。
RemoteAddressLengthDWORD*inoutoptional入出力。RemoteAddressバッファのサイズと実際の長さを示すポインタ。
RemoteAddressSOCKADDR*outoptional接続先のリモートアドレスを受け取るSOCKADDRへのポインタ。NULL可。
timeoutTIMEVAL*inoptional接続試行のタイムアウト時間を示すTIMEVALへのポインタ。NULLで既定値。
ReservedOVERLAPPED*optional予約済み。必ずNULLを指定する。

戻り値の型: BOOL

各言語での呼び出し定義

// WS2_32.dll  (ANSI / -A)
#include <windows.h>

BOOL WSAConnectByNameA(
    SOCKET s,
    LPCSTR nodename,
    LPCSTR servicename,
    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", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
static extern bool WSAConnectByNameA(
    UIntPtr s,   // SOCKET
    [MarshalAs(UnmanagedType.LPStr)] string nodename,   // LPCSTR
    [MarshalAs(UnmanagedType.LPStr)] string servicename,   // LPCSTR
    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", CharSet:=CharSet.Ansi, SetLastError:=True, ExactSpelling:=True)>
Public Shared Function WSAConnectByNameA(
    s As UIntPtr,   ' SOCKET
    <MarshalAs(UnmanagedType.LPStr)> nodename As String,   ' LPCSTR
    <MarshalAs(UnmanagedType.LPStr)> servicename As String,   ' LPCSTR
    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
' nodename : LPCSTR
' servicename : LPCSTR
' 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 WSAConnectByNameA Lib "ws2_32" ( _
    ByVal s As LongPtr, _
    ByVal nodename As String, _
    ByVal servicename As String, _
    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

WSAConnectByNameA = ctypes.windll.ws2_32.WSAConnectByNameA
WSAConnectByNameA.restype = wintypes.BOOL
WSAConnectByNameA.argtypes = [
    ctypes.c_size_t,  # s : SOCKET
    wintypes.LPCSTR,  # nodename : LPCSTR
    wintypes.LPCSTR,  # servicename : LPCSTR
    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')
WSAConnectByNameA = Fiddle::Function.new(
  lib['WSAConnectByNameA'],
  [
    Fiddle::TYPE_UINTPTR_T,  # s : SOCKET
    Fiddle::TYPE_VOIDP,  # nodename : LPCSTR
    Fiddle::TYPE_VOIDP,  # servicename : LPCSTR
    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 WSAConnectByNameA(
        s: usize,  // SOCKET
        nodename: *const u8,  // LPCSTR
        servicename: *const u8,  // LPCSTR
        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", CharSet = CharSet.Ansi, SetLastError = true)]
public static extern bool WSAConnectByNameA(UIntPtr s, [MarshalAs(UnmanagedType.LPStr)] string nodename, [MarshalAs(UnmanagedType.LPStr)] string servicename, IntPtr LocalAddressLength, IntPtr LocalAddress, IntPtr RemoteAddressLength, IntPtr RemoteAddress, IntPtr timeout, IntPtr Reserved);
"@
$api = Add-Type -MemberDefinition $sig -Name 'WS2_32_WSAConnectByNameA' -Namespace Win32 -PassThru
# $api::WSAConnectByNameA(s, nodename, servicename, LocalAddressLength, LocalAddress, RemoteAddressLength, RemoteAddress, timeout, Reserved)
#uselib "WS2_32.dll"
#func global WSAConnectByNameA "WSAConnectByNameA" sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr
; WSAConnectByNameA s, nodename, servicename, varptr(LocalAddressLength), varptr(LocalAddress), varptr(RemoteAddressLength), varptr(RemoteAddress), varptr(timeout), varptr(Reserved)   ; 戻り値は stat
; s : SOCKET -> "sptr"
; nodename : LPCSTR -> "sptr"
; servicename : LPCSTR -> "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 WSAConnectByNameA "WSAConnectByNameA" sptr, str, str, var, var, var, var, var, var
; res = WSAConnectByNameA(s, nodename, servicename, LocalAddressLength, LocalAddress, RemoteAddressLength, RemoteAddress, timeout, Reserved)
; s : SOCKET -> "sptr"
; nodename : LPCSTR -> "str"
; servicename : LPCSTR -> "str"
; 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 WSAConnectByNameA(SOCKET s, LPCSTR nodename, LPCSTR servicename, DWORD* LocalAddressLength, SOCKADDR* LocalAddress, DWORD* RemoteAddressLength, SOCKADDR* RemoteAddress, TIMEVAL* timeout, OVERLAPPED* Reserved)
#uselib "WS2_32.dll"
#cfunc global WSAConnectByNameA "WSAConnectByNameA" intptr, str, str, var, var, var, var, var, var
; res = WSAConnectByNameA(s, nodename, servicename, LocalAddressLength, LocalAddress, RemoteAddressLength, RemoteAddress, timeout, Reserved)
; s : SOCKET -> "intptr"
; nodename : LPCSTR -> "str"
; servicename : LPCSTR -> "str"
; 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")
	procWSAConnectByNameA = ws2_32.NewProc("WSAConnectByNameA")
)

// s (SOCKET), nodename (LPCSTR), servicename (LPCSTR), 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 := procWSAConnectByNameA.Call(
	uintptr(s),
	uintptr(unsafe.Pointer(windows.BytePtrFromString(nodename))),
	uintptr(unsafe.Pointer(windows.BytePtrFromString(servicename))),
	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 WSAConnectByNameA(
  s: NativeUInt;   // SOCKET
  nodename: PAnsiChar;   // LPCSTR
  servicename: PAnsiChar;   // LPCSTR
  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 'WSAConnectByNameA';
result := DllCall("WS2_32\WSAConnectByNameA"
    , "UPtr", s   ; SOCKET
    , "AStr", nodename   ; LPCSTR
    , "AStr", servicename   ; LPCSTR
    , "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
●WSAConnectByNameA(s, nodename, servicename, LocalAddressLength, LocalAddress, RemoteAddressLength, RemoteAddress, timeout, Reserved) = DLL("WS2_32.dll", "bool WSAConnectByNameA(int, char*, char*, void*, void*, void*, void*, void*, void*)")
# 呼び出し: WSAConnectByNameA(s, nodename, servicename, LocalAddressLength, LocalAddress, RemoteAddressLength, RemoteAddress, timeout, Reserved)
# s : SOCKET -> "int"
# nodename : LPCSTR -> "char*"
# servicename : LPCSTR -> "char*"
# 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)。