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

recv

関数
接続ソケットからデータを受信する。
DLLWS2_32.dll呼出規約winapiSetLastErrorあり対応OSWindows 8.1 以降

シグネチャ

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

INT recv(
    SOCKET s,
    LPSTR buf,
    INT len,
    SEND_RECV_FLAGS flags
);

パラメーター

名前方向説明
sSOCKETin接続済みのソケットを識別するディスクリプタです。
bufLPSTRout受信データを格納するバッファへのポインタです。
lenINTinbuf パラメータが指すバッファの長さ (バイト単位) です。
flagsSEND_RECV_FLAGSinこの関数の動作に影響を与えるフラグの集合です。以下の Remarks を参照してください。このパラメータに指定できる値の詳細については、Remarks セクションを参照してください。

戻り値の型: INT

公式ドキュメント

recv 関数 (winsock.h) は、接続済みのソケット、またはバインド済みのコネクションレスソケットからデータを受信します。

戻り値

エラーが発生しなかった場合、 recv は受信したバイト数を返し、buf パラメータが指すバッファには受信したデータが格納されます。接続が正常にクローズされた場合は、戻り値は 0 になります。

それ以外の場合は SOCKET_ERROR が返され、 WSAGetLastError を呼び出すことで具体的なエラーコードを取得できます。

エラーコード 意味
WSANOTINITIALISED
この関数を使用する前に、 WSAStartup の呼び出しが成功している必要があります。
WSAENETDOWN
ネットワークサブシステムに障害が発生しました。
WSAEFAULT
buf パラメータが、ユーザーアドレス空間の有効な部分に完全には含まれていません。
WSAENOTCONN
ソケットが接続されていません。
WSAEINTR
(ブロッキング) 呼び出しが WSACancelBlockingCall によってキャンセルされました。
WSAEINPROGRESS
ブロッキングを伴う Windows Sockets 1.1 の呼び出しが進行中であるか、サービスプロバイダーがコールバック関数をまだ処理中です。
WSAENETRESET
コネクション指向のソケットの場合、このエラーは、操作の進行中に障害を検出した keep-alive 動作により接続が切断されたことを示します。データグラムソケットの場合、このエラーは生存時間 (time to live) が期限切れになったことを示します。
WSAENOTSOCK
ディスクリプタがソケットではありません。
WSAEOPNOTSUPP
MSG_OOB が指定されましたが、ソケットが SOCK_STREAM のようなストリーム型ではない、このソケットに関連付けられた通信ドメインで OOB データがサポートされていない、またはソケットが単方向で送信操作のみをサポートしています。
WSAESHUTDOWN
ソケットがシャットダウンされています。howSD_RECEIVE または SD_BOTH を指定して shutdown を呼び出した後は、そのソケットで受信することはできません。
WSAEWOULDBLOCK
ソケットが非ブロッキングとしてマークされており、受信操作がブロックされる状況です。
WSAEMSGSIZE
メッセージが大きすぎて指定されたバッファに収まらず、切り詰められました。
WSAEINVAL
ソケットが bind でバインドされていない、不明なフラグが指定された、SO_OOBINLINE が有効なソケットに対して MSG_OOB が指定された、または (バイトストリームソケットの場合のみ) len が 0 以下でした。
WSAECONNABORTED
タイムアウトまたはその他の障害により仮想回線が終了されました。ソケットは使用できなくなっているため、アプリケーションはこのソケットをクローズする必要があります。
WSAETIMEDOUT
ネットワーク障害、または相手システムが応答しなかったことにより、接続がドロップされました。
WSAECONNRESET
リモート側がハードクローズまたはアボート型クローズを実行したことにより、仮想回線がリセットされました。ソケットは使用できなくなっているため、アプリケーションはこのソケットをクローズする必要があります。UDP データグラムソケットでは、このエラーは以前の送信操作が ICMP の "Port Unreachable" メッセージを引き起こしたことを示します。

解説(Remarks)

recv 関数は、コネクション指向のソケットまたはコネクションレスソケットで受信データを読み取るために使用します。コネクション指向のプロトコルを使用する場合、 recv を呼び出す前にソケットが接続されている必要があります。コネクションレスプロトコルを使用する場合、 recv を呼び出す前にソケットがバインドされている必要があります。

ソケットのローカルアドレスが判明している必要があります。サーバーアプリケーションでは、明示的な bind 関数、または暗黙的な accept もしくは WSAAccept 関数を使用します。クライアントアプリケーションでは明示的なバインドは推奨されません。クライアントアプリケーションでは、 connectWSAConnectsendtoWSASendTo、または WSAJoinLeaf を使用することで、ソケットを暗黙的にローカルアドレスへバインドできます。

接続済みソケットおよびコネクションレスソケットのいずれの場合も、 recv 関数は受信メッセージを受け付けるアドレスを制限します。この関数は、接続で指定されたリモートアドレスからのメッセージのみを返します。それ以外のアドレスからのメッセージは (通知なく) 破棄されます。

コネクション指向のソケット (例: SOCK_STREAM 型) の場合、 recv を呼び出すと、指定されたバッファのサイズを上限として、現在利用可能なデータが返されます。ソケットが OOB データのインライン受信用に構成されており (ソケットオプション SO_OOBINLINE)、まだ読み取られていない OOB データがある場合は、OOB データのみが返されます。アプリケーションは ioctlsocket または WSAIoctlSIOCATMARK コマンドを使用して、まだ読み取るべき OOB データが残っているかどうかを判定できます。

コネクションレスソケット (SOCK_DGRAM 型やその他のメッセージ指向ソケット) の場合、データは connect 関数で指定された宛先アドレスからの、キューに格納された最初のデータグラム (メッセージ) から取り出されます。

データグラムまたはメッセージが指定されたバッファより大きい場合、バッファにはデータグラムの先頭部分が格納され、 recv はエラー WSAEMSGSIZE を生成します。信頼性のないプロトコル (例: UDP) では超過したデータは失われます。信頼性のあるプロトコルでは、十分な大きさのバッファで recv を呼び出して正常に読み取られるまで、データはサービスプロバイダーによって保持されます。

ソケットに受信可能なデータがない場合、 recv 呼び出しはブロックし、MSG_PARTIAL フラグを設定しない場合の WSARecv で定義されているブロッキング規則に従ってデータの到着を待機します (ソケットが非ブロッキングの場合を除く)。非ブロッキングの場合は SOCKET_ERROR が返され、エラーコードは WSAEWOULDBLOCK に設定されます。さらにデータが到着するタイミングを判定するには、 selectWSAAsyncSelect、または WSAEventSelect 関数を使用できます。

ソケットがコネクション指向で、リモート側が接続を正常にシャットダウンし、すべてのデータが受信済みの場合、 recv は受信バイト数 0 で直ちに完了します。接続がリセットされた場合、 recv はエラー WSAECONNRESET で失敗します。

flags パラメータを使用すると、関連付けられたソケットに指定されたオプションを超えて、関数呼び出しの動作に影響を与えることができます。この関数の動作はソケットオプションと flags パラメータによって決まります。flags パラメータに指定できる値は、次の値のいずれかをビット単位 OR 演算子で組み合わせて構成します。

意味
MSG_PEEK 受信データを覗き見します。データはバッファにコピーされますが、入力キューからは削除されません。
MSG_OOB 帯域外 (Out Of Band, OOB) データを処理します。
MSG_WAITALL 受信要求は、次のいずれかのイベントが発生した場合にのみ完了します。
  • 呼び出し元が提供したバッファが完全に満たされた。
  • 接続がクローズされた。
  • 要求がキャンセルされた、またはエラーが発生した。
基盤となるトランスポートが MSG_WAITALL をサポートしていない場合、またはソケットが非ブロッキングモードの場合、この呼び出しは WSAEOPNOTSUPP で失敗します。また、MSG_WAITALLMSG_OOBMSG_PEEK、または MSG_PARTIAL と併せて指定した場合も、この呼び出しは WSAEOPNOTSUPP で失敗します。このフラグは、データグラムソケットやメッセージ指向ソケットではサポートされません。
注意 recv のようなブロッキングを伴う Winsock 呼び出しを発行する際、Winsock は呼び出しが完了する前にネットワークイベントを待機する必要がある場合があります。この状況では Winsock はアラート可能な待機 (alertable wait) を行い、これは同じスレッドでスケジュールされた非同期プロシージャ呼び出し (APC) によって中断される可能性があります。同じスレッドで進行中のブロッキング Winsock 呼び出しを中断した APC の内部で、別のブロッキング Winsock 呼び出しを発行すると未定義動作となるため、Winsock クライアントは決してこれを試みてはなりません。

サンプルコード

次のコード例は、recv 関数の使用方法を示しています。
#define WIN32_LEAN_AND_MEAN

#include <winsock2.h>
#include <Ws2tcpip.h>
#include <stdio.h>

// Link with ws2_32.lib
#pragma comment(lib, "Ws2_32.lib")

#define DEFAULT_BUFLEN 512
#define DEFAULT_PORT "27015"

int __cdecl main() {

    //----------------------
    // Declare and initialize variables.
    WSADATA wsaData;
    int iResult;

    SOCKET ConnectSocket = INVALID_SOCKET;
    struct sockaddr_in clientService; 

    char *sendbuf = "this is a test";
    char recvbuf[DEFAULT_BUFLEN];
    int recvbuflen = DEFAULT_BUFLEN;
  
    //----------------------
    // Initialize Winsock
    iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
    if (iResult != NO_ERROR) {
      printf("WSAStartup failed: %d\n", iResult);
      return 1;
    }

    //----------------------
    // Create a SOCKET for connecting to server
    ConnectSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (ConnectSocket == INVALID_SOCKET) {
        printf("Error at socket(): %ld\n", WSAGetLastError() );
        WSACleanup();
        return 1;
    }

    //----------------------
    // The sockaddr_in structure specifies the address family,
    // IP address, and port of the server to be connected to.
    clientService.sin_family = AF_INET;
    clientService.sin_addr.s_addr = inet_addr( "127.0.0.1" );
    clientService.sin_port = htons( 27015 );

    //----------------------
    // Connect to server.
    iResult = connect( ConnectSocket, (SOCKADDR*) &clientService, sizeof(clientService) );
    if ( iResult == SOCKET_ERROR) {
        closesocket (ConnectSocket);
        printf("Unable to connect to server: %ld\n", WSAGetLastError());
        WSACleanup();
        return 1;
    }

    // Send an initial buffer
    iResult = send( ConnectSocket, sendbuf, (int)strlen(sendbuf), 0 );
    if (iResult == SOCKET_ERROR) {
        printf("send failed: %d\n", WSAGetLastError());
        closesocket(ConnectSocket);
        WSACleanup();
        return 1;
    }

    printf("Bytes Sent: %ld\n", iResult);

    // shutdown the connection since no more data will be sent
    iResult = shutdown(ConnectSocket, SD_SEND);
    if (iResult == SOCKET_ERROR) {
        printf("shutdown failed: %d\n", WSAGetLastError());
        closesocket(ConnectSocket);
        WSACleanup();
        return 1;
    }

    // Receive until the peer closes the connection
    do {

        iResult = recv(ConnectSocket, recvbuf, recvbuflen, 0);
        if ( iResult > 0 )
            printf("Bytes received: %d\n", iResult);
        else if ( iResult == 0 )
            printf("Connection closed\n");
        else
            printf("recv failed: %d\n", WSAGetLastError());

    } while( iResult > 0 );

    // cleanup
    closesocket(ConnectSocket);
    WSACleanup();

    return 0;
}

サンプルコード

recv 関数の詳細および別のサンプルについては、Getting Started With Winsock を参照してください。

Windows Phone 8: この関数は、Windows Phone 8 以降の Windows Phone ストアアプリでサポートされています。

Windows 8.1 および Windows Server 2012 R2: この関数は、Windows 8.1、Windows Server 2012 R2 以降の Windows ストアアプリでサポートされています。

出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)

各言語での呼び出し定義

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

INT recv(
    SOCKET s,
    LPSTR buf,
    INT len,
    SEND_RECV_FLAGS flags
);
[DllImport("WS2_32.dll", SetLastError = true, ExactSpelling = true)]
static extern int recv(
    UIntPtr s,   // SOCKET
    [MarshalAs(UnmanagedType.LPStr)] System.Text.StringBuilder buf,   // LPSTR out
    int len,   // INT
    int flags   // SEND_RECV_FLAGS
);
<DllImport("WS2_32.dll", SetLastError:=True, ExactSpelling:=True)>
Public Shared Function recv(
    s As UIntPtr,   ' SOCKET
    <MarshalAs(UnmanagedType.LPStr)> buf As System.Text.StringBuilder,   ' LPSTR out
    len As Integer,   ' INT
    flags As Integer   ' SEND_RECV_FLAGS
) As Integer
End Function
' s : SOCKET
' buf : LPSTR out
' len : INT
' flags : SEND_RECV_FLAGS
Declare PtrSafe Function recv Lib "ws2_32" ( _
    ByVal s As LongPtr, _
    ByVal buf As String, _
    ByVal len As Long, _
    ByVal flags As Long) As Long
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。
import ctypes
from ctypes import wintypes

recv = ctypes.windll.ws2_32.recv
recv.restype = ctypes.c_int
recv.argtypes = [
    ctypes.c_size_t,  # s : SOCKET
    wintypes.LPSTR,  # buf : LPSTR out
    ctypes.c_int,  # len : INT
    ctypes.c_int,  # flags : SEND_RECV_FLAGS
]
# GetLastError: use ctypes.GetLastError() (or ctypes.WinDLL(use_last_error=True))
require 'fiddle'
require 'fiddle/import'

lib = Fiddle.dlopen('WS2_32.dll')
recv = Fiddle::Function.new(
  lib['recv'],
  [
    Fiddle::TYPE_UINTPTR_T,  # s : SOCKET
    Fiddle::TYPE_VOIDP,  # buf : LPSTR out
    Fiddle::TYPE_INT,  # len : INT
    Fiddle::TYPE_INT,  # flags : SEND_RECV_FLAGS
  ],
  Fiddle::TYPE_INT)
#[link(name = "ws2_32")]
extern "system" {
    fn recv(
        s: usize,  // SOCKET
        buf: *mut u8,  // LPSTR out
        len: i32,  // INT
        flags: i32  // SEND_RECV_FLAGS
    ) -> i32;
}
// crates: windows-sys provides ready-made bindings for this API.
$sig = @"
[DllImport("WS2_32.dll", SetLastError = true)]
public static extern int recv(UIntPtr s, [MarshalAs(UnmanagedType.LPStr)] System.Text.StringBuilder buf, int len, int flags);
"@
$api = Add-Type -MemberDefinition $sig -Name 'WS2_32_recv' -Namespace Win32 -PassThru
# $api::recv(s, buf, len, flags)
#uselib "WS2_32.dll"
#func global recv "recv" sptr, sptr, sptr, sptr
; recv s, varptr(buf), len, flags   ; 戻り値は stat
; s : SOCKET -> "sptr"
; buf : LPSTR out -> "sptr"
; len : INT -> "sptr"
; flags : SEND_RECV_FLAGS -> "sptr"
; ※HSP3.7は #func のため戻り値はシステム変数 stat に格納されます。
出力引数:
#uselib "WS2_32.dll"
#cfunc global recv "recv" sptr, var, int, int
; res = recv(s, buf, len, flags)
; s : SOCKET -> "sptr"
; buf : LPSTR out -> "var"
; len : INT -> "int"
; flags : SEND_RECV_FLAGS -> "int"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
出力引数:
; INT recv(SOCKET s, LPSTR buf, INT len, SEND_RECV_FLAGS flags)
#uselib "WS2_32.dll"
#cfunc global recv "recv" intptr, var, int, int
; res = recv(s, buf, len, flags)
; s : SOCKET -> "intptr"
; buf : LPSTR out -> "var"
; len : INT -> "int"
; flags : SEND_RECV_FLAGS -> "int"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
import (
	"golang.org/x/sys/windows"
	"unsafe"
)

var (
	ws2_32 = windows.NewLazySystemDLL("WS2_32.dll")
	procrecv = ws2_32.NewProc("recv")
)

// s (SOCKET), buf (LPSTR out), len (INT), flags (SEND_RECV_FLAGS)
r1, _, err := procrecv.Call(
	uintptr(s),
	uintptr(buf),
	uintptr(len),
	uintptr(flags),
)
_ = err  // syscall.Errno (valid when the call sets last-error)
_ = r1   // INT
function recv(
  s: NativeUInt;   // SOCKET
  buf: PAnsiChar;   // LPSTR out
  len: Integer;   // INT
  flags: Integer   // SEND_RECV_FLAGS
): Integer; stdcall;
  external 'WS2_32.dll' name 'recv';
result := DllCall("WS2_32\recv"
    , "UPtr", s   ; SOCKET
    , "Ptr", buf   ; LPSTR out
    , "Int", len   ; INT
    , "Int", flags   ; SEND_RECV_FLAGS
    , "Int")   ; return: INT
●recv(s, buf, len, flags) = DLL("WS2_32.dll", "int recv(int, char*, int, int)")
# 呼び出し: recv(s, buf, len, flags)
# s : SOCKET -> "int"
# buf : LPSTR out -> "char*"
# len : INT -> "int"
# flags : SEND_RECV_FLAGS -> "int"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。
const std = @import("std");

extern "ws2_32" fn recv(
    s: usize, // SOCKET
    buf: [*c]u8, // LPSTR out
    len: i32, // INT
    flags: i32 // SEND_RECV_FLAGS
) callconv(std.os.windows.WINAPI) i32;
proc recv(
    s: uint,  # SOCKET
    buf: ptr char,  # LPSTR out
    len: int32,  # INT
    flags: int32  # SEND_RECV_FLAGS
): int32 {.importc: "recv", stdcall, dynlib: "WS2_32.dll".}
pragma(lib, "ws2_32");
extern(Windows)
int recv(
    size_t s,   // SOCKET
    char* buf,   // LPSTR out
    int len,   // INT
    int flags   // SEND_RECV_FLAGS
);
ccall((:recv, "WS2_32.dll"), stdcall, Int32,
      (Csize_t, Ptr{UInt8}, Int32, Int32),
      s, buf, len, flags)
# s : SOCKET -> Csize_t
# buf : LPSTR out -> Ptr{UInt8}
# len : INT -> Int32
# flags : SEND_RECV_FLAGS -> Int32
# stdcall は 32bit のみ意味を持つ(x64 では無視)。
local ffi = require("ffi")
ffi.cdef[[
int32_t recv(
    uintptr_t s,
    char* buf,
    int32_t len,
    int32_t flags);
]]
local ws2_32 = ffi.load("ws2_32")
-- ws2_32.recv(s, buf, len, flags)
-- s : SOCKET
-- buf : LPSTR out
-- len : INT
-- flags : SEND_RECV_FLAGS
-- 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
const koffi = require('koffi');
const lib = koffi.load('WS2_32.dll');
const recv = lib.func('__stdcall', 'recv', 'int32_t', ['uintptr_t', 'char *', 'int32_t', 'int32_t']);
// recv(s, buf, len, flags)
// s : SOCKET -> 'uintptr_t'
// buf : LPSTR out -> 'char *'
// len : INT -> 'int32_t'
// flags : SEND_RECV_FLAGS -> 'int32_t'
// 出力ポインタは koffi.out(...) で包む。構造体は koffi.struct で定義。
const lib = Deno.dlopen("WS2_32.dll", {
  recv: { parameters: ["usize", "buffer", "i32", "i32"], result: "i32" },
});
// lib.symbols.recv(s, buf, len, flags)
// s : SOCKET -> "usize"
// buf : LPSTR out -> "buffer"
// len : INT -> "i32"
// flags : SEND_RECV_FLAGS -> "i32"
// 文字列引数は "buffer"(NUL 終端のバイト列を Uint8Array で渡す)。
// 値渡し構造体は { struct: [ ...field types... ] } を使用。
<?php
$ffi = FFI::cdef(<<<C
int32_t recv(
    size_t s,
    char* buf,
    int32_t len,
    int32_t flags);
C, "WS2_32.dll");
// $ffi->recv(s, buf, len, flags);
// s : SOCKET
// buf : LPSTR out
// len : INT
// flags : SEND_RECV_FLAGS
// 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
// WINAPI(stdcall): x64 では呼出規約が統一されるため問題なし。x86 では __stdcall 対応のラッパが必要な場合あり。
import com.sun.jna.*;
import com.sun.jna.ptr.*;
import com.sun.jna.win32.StdCallLibrary;
import com.sun.jna.win32.W32APIOptions;

public interface Ws2_32 extends StdCallLibrary {
    Ws2_32 INSTANCE = Native.load("ws2_32", Ws2_32.class);
    int recv(
        long s,   // SOCKET
        byte[] buf,   // LPSTR out
        int len,   // INT
        int flags   // SEND_RECV_FLAGS
    );
}
@[Link("ws2_32")]
lib LibWS2_32
  fun recv = recv(
    s : LibC::SizeT,   # SOCKET
    buf : UInt8*,   # LPSTR out
    len : Int32,   # INT
    flags : Int32   # SEND_RECV_FLAGS
  ) : Int32
end
# 構造体/GUID/enum は lib 内に対応する型定義が必要。
# 呼出規約: x64 は規約統一のため OK。x86(32bit)は WINAPI=stdcall だが Crystal の fun に stdcall 付与構文がなく非対応。
import 'dart:ffi';
import 'package:ffi/ffi.dart';

typedef recvNative = Int32 Function(UintPtr, Pointer<Utf8>, Int32, Int32);
typedef recvDart = int Function(int, Pointer<Utf8>, int, int);
final recv = DynamicLibrary.open('WS2_32.dll')
    .lookupFunction<recvNative, recvDart>('recv');
// s : SOCKET -> UintPtr
// buf : LPSTR out -> Pointer<Utf8>
// len : INT -> Int32
// flags : SEND_RECV_FLAGS -> Int32
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。
{$mode objfpc}{$H+}
function recv(
  s: NativeUInt;   // SOCKET
  buf: PAnsiChar;   // LPSTR out
  len: Integer;   // INT
  flags: Integer   // SEND_RECV_FLAGS
): Integer; stdcall;
  external 'WS2_32.dll' name 'recv';
import Foreign
import Foreign.C.Types
import Foreign.C.String

foreign import stdcall safe "recv"
  c_recv :: CUIntPtr -> CString -> Int32 -> Int32 -> IO Int32
-- s : SOCKET -> CUIntPtr
-- buf : LPSTR out -> CString
-- len : INT -> Int32
-- flags : SEND_RECV_FLAGS -> Int32
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。
open Ctypes
open Foreign

let recv =
  foreign "recv"
    (size_t @-> string @-> int32_t @-> int32_t @-> returning int32_t)
(* s : SOCKET -> size_t *)
(* buf : LPSTR out -> string *)
(* len : INT -> int32_t *)
(* flags : SEND_RECV_FLAGS -> int32_t *)
(* foreign は cdecl 前提。x64 Windows では WINAPI と一致。構造体は ctypes structure を定義のこと。 *)
(cffi:define-foreign-library ws2_32 (t "WS2_32.dll"))
(cffi:use-foreign-library ws2_32)

(cffi:defcfun ("recv" recv :convention :stdcall) :int32
  (s :uint64)   ; SOCKET
  (buf :pointer)   ; LPSTR out
  (len :int32)   ; INT
  (flags :int32))   ; SEND_RECV_FLAGS
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。
use Win32::API;
my $recv = Win32::API::More->new('WS2_32',
    'int recv(WPARAM s, LPSTR buf, int len, int flags)');
# my $ret = $recv->Call($s, $buf, $len, $flags);
# s : SOCKET -> WPARAM
# buf : LPSTR out -> LPSTR
# len : INT -> int
# flags : SEND_RECV_FLAGS -> int
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。

関連項目

公式の関連項目
使用する型