getsockopt 関数 (winsock.h)

getsockopt 関数は、ソケット オプションを取得します。

構文

int getsockopt(
  [in]      SOCKET s,
  [in]      int    level,
  [in]      int    optname,
  [out]     char   *optval,
  [in, out] int    *optlen
);

パラメーター

[in] s

ソケットを識別する記述子。

[in] level

オプションが定義されているレベル。 例: SOL_SOCKET

[in] optname

値を取得するソケット オプション。 例: SO_ACCEPTCONNoptname 値は、指定されたレベル内で定義されたソケット オプションである必要があります。または動作が未定義です。

[out] optval

要求されたオプションの値が返されるバッファーへのポインター。

[in, out] optlen

optval バッファーのサイズ (バイト単位) へのポインター。

戻り値

エラーが発生しない場合、 getsockopt は 0 を返します。 それ以外の場合は、SOCKET_ERRORの値が返され、 WSAGetLastError を呼び出すことによって特定のエラー コードを取得できます。

エラー コード 意味
WSANOTINITIALIZED
この関数を使用する前に、 WSAStartup 呼び出しが正常に行われる必要があります。
WSAENETDOWN
メモ ネットワーク サブシステムが失敗しました。
 
WSAEFAULT
optval パラメーターまたは optlen パラメーターの 1 つがユーザー アドレス空間の有効な部分ではないか、optlen パラメーターが小さすぎます。
WSAEINPROGRESS
ブロックしている Windows Sockets 1.1 呼び出しが進行中であるか、サービス プロバイダーがコールバック関数を処理しています。
WSAEINVAL
level パラメーターが不明または無効です。
WSAENOPROTOOPT
オプションが不明であるか、指定されたプロトコル ファミリでサポートされていません。
WSAENOTSOCK
記述子はソケットではありません。

注釈

getsockopt 関数は、任意の型のソケットに関連付けられているソケット オプションの現在の値を任意の状態で取得し、結果を optval に格納します。 オプションは複数のプロトコル レベルで存在できますが、常に最上位のソケット レベルに存在します。 オプションは、パケット ルーティングや OOB データ転送などのソケット操作に影響します。

選択したオプションに関連付けられている値は、バッファー optval で返されます。 optlen が指す整数には、最初にこのバッファーのサイズが含まれている必要があります。が返されると、返される値のサイズに設定されます。 SO_LINGERの場合、これは 、LINGER 構造体のサイズになります。 その他のほとんどのオプションでは、整数のサイズになります。

アプリケーションは、指定したパラメーターによって直接または間接的に指されるメモリ領域を割り当てる必要があります。

オプションが setsockopt で設定されなかった場合、 getsockopt は オプションの既定値を返します。

getsockopt では、次のオプションがサポートされています。 Type 列は、 optval でアドレス指定されたデータの種類を識別します。

ソケット オプションの詳細については、「ソケット オプション」を参照してください。

次の optname パラメーターの値の表は、level パラメーターが SOL_SOCKET に設定されている場合に有効です。

Type 説明
SO_ACCEPTCONN BOOL ソケットはリッスンしています。
SO_BROADCAST BOOL ソケットは、ブロードキャスト メッセージの送信と受信用に構成されます。
SO_BSP_STATE CSADDR_INFO ソケットによって使用されるローカル アドレス、ローカル ポート、リモート アドレス、リモート ポート、ソケットの種類、プロトコルを返します。
SO_CONDITIONAL_ACCEPT BOOL setsockopt の以前の呼び出しまたはシステムの既定値から、現在のソケット状態を返します。
SO_CONNECT_TIME DWORD ソケットが接続された秒数を返します。 このソケット オプションは、接続指向プロトコルでのみ有効です。
SO_DEBUG BOOL デバッグが有効になっています。
SO_DONTLINGER BOOL TRUE の場合、SO_LINGER オプションは無効になります。
SO_DONTROUTE BOOL ルーティングが無効になっています。 この設定は成功しますが、AF_INETソケットでは無視されます。は、 WSAENOPROTOOPT を使用AF_INET6ソケットで失敗します。 このオプションは ATM ソケットではサポートされていません。
SO_ERROR INT エラーの状態を取得し、クリアします。
SO_EXCLUSIVEADDRUSE BOOL 他のソケットが同じアドレスとポートにバインドされないようにします。 このオプションは、 バインド 関数を呼び出す前に設定する必要があります。
SO_GROUP_ID GROUP 予約済み。
SO_GROUP_PRIORITY INT 予約済み。
SO_KEEPALIVE BOOL キープアライブが送信されています。 ATM ソケットではサポートされていません。
SO_LINGER LINGER 構造体 現在の残留オプションを返します。
SO_MAX_MSG_SIZE unsigned int メッセージ指向ソケット型のメッセージの最大サイズ (たとえば、SOCK_DGRAM)。 ストリーム指向ソケットには意味がありません。
SO_OOBINLINE BOOL OOB データは、通常のデータ ストリームで受信されています。 (このトピックの説明については、「 Windows ソケット 1.1 ブロッキング ルーチンと EINPROGRESS 」セクションを参照してください)。
SO_PORT_SCALABILITY BOOL ローカル コンピューター上の異なるローカル アドレス ポート ペアに対してワイルドカード ポートを複数回割り当てることで、ポート割り当てを最大化することで、ソケットのローカル ポートのスケーラビリティを有効にします。
SO_PROTOCOL_INFO WSAPROTOCOL_INFO このソケットにバインドされているプロトコルのプロトコル情報の説明。
SO_RCVBUF INT 受信用に予約されたソケットごとのバッファー領域の合計。 これはSO_MAX_MSG_SIZEとは無関係であり、TCP 受信ウィンドウのサイズに必ずしも対応するとは限りません。
SO_REUSEADDR BOOL ソケットは、既に使用されているアドレスにバインドできます。 ATM ソケットには適用されません。
SO_SNDBUF INT 送信用に予約されたソケットごとのバッファー領域の合計。 これはSO_MAX_MSG_SIZEとは無関係であり、TCP 送信ウィンドウのサイズに必ずしも対応するとは限りません。
SO_TYPE INT ソケットの型 (たとえば、SOCK_STREAM)。
PVD_CONFIG サービス プロバイダー依存 ソケット 関連付けられているサービス プロバイダーからの不透明なデータ構造オブジェクト。 このオブジェクトは、サービス プロバイダーの現在の構成情報を格納します。 このデータ構造の正確な形式は、サービス プロバイダー固有です。
 

レベル = IPPROTO_TCP

IPPROTO_TCPソケット オプションのTCP_NODELAY」を参照してください。 レベル = IPPROTO_TCPのソケット オプションの詳細と詳細については、このトピックも参照してください。  

次の optname パラメーターの値の表は、level パラメーターが NSPROTO_IPX に設定されている場合に有効です。

Windows NTでは、すべての IPX オプションがサポートされています。 Windows Me、Windows 98、Windows 95 では、次のオプションのみがサポートされています。
IPX_PTYPE
IPX_FILTERPTYPE
IPX_DSTYPE
IPX_RECVHDR
IPX_MAXSIZE
IPX_ADDRESS
 
Type 説明
IPX_PTYPE INT IPX パケットの種類を取得します。
IPX_FILTERPTYPE INT 受信フィルター パケットの種類を取得します
IPX_DSTYPE INT 送信されるすべてのパケットの SPX ヘッダーのデータ ストリーム フィールドの値を取得します。
IPX_EXTENDED_ADDRESS BOOL 拡張アドレス指定が有効になっているかどうかを確認します。
IPX_RECVHDR BOOL プロトコル ヘッダーがすべての受信ヘッダーで送信されるかどうかを確認します。
IPX_MAXSIZE INT 送信できる最大データ サイズを取得します。
IPX_ADDRESS IPX_ADDRESS_DATA 構造体 IPX がバインドされている特定のアダプターに関する情報を取得します。 アダプターの番号付けは 0 から始まります。 adapternum メンバーは、返却時に入力されます。
IPX_GETNETINFO IPX_NETNUM_DATA 構造 特定の IPX ネットワーク番号に関する情報を取得します。 キャッシュで使用できない場合は、RIP を使用して情報を取得します。
IPX_GETNETINFO_NORIP IPX_NETNUM_DATA 構造 特定の IPX ネットワーク番号に関する情報を取得します。 キャッシュで使用できない場合、 は RIP を使用して情報を取得せず、エラーを返します。
IPX_SPXGETCONNECTIONSTATUS IPX_SPXCONNSTATUS_DATA 構造体 接続された SPX ソケットに関する情報を取得します。
IPX_ADDRESS_NOTIFY IPX_ADDRESS_DATA 構造体 IPX がバインドされているアダプターで変更が発生した場合の状態通知を取得します。
IPX_MAX_ADAPTER_NUM INT 存在するアダプターの最大数を取得し、基本ゼロとして番号を付けます。
IPX_RERIPNETNUMBER IPX_NETNUM_DATA 構造 IPX_GETNETINFOと同様ですが、ネットワーク情報がローカル キャッシュ内にある場合でも、IPX は解決のために RIP を使用するように強制します。
IPX_IMMEDIATESPXACK BOOL ACK を送信する前に SPX 接続を遅延しないように指示します。 やり取りトラフィックのないアプリケーションでは、パフォーマンスを向上させるには、これを TRUE に設定する必要があります。
TCP_MAXSEG INT TCP 最大セグメント サイズを受信します。 Windows 10 以降のバージョンでサポートされています。
 

次の表に、getsockopt 関数でサポートされていない BSD ソケット オプションを表す optname の値を示します。

Type 説明
SO_RCVLOWAT INT 低基準値を受け取ります。
SO_RCVTIMEO INT タイムアウトを受信します。
SO_SNDLOWAT INT 低基準値を送信します。
SO_SNDTIMEO INT タイムアウトを送信します。
TCP_MAXSEG INT TCP の最大セグメント サイズを受信します。 Windows 10より前のバージョンではサポートされていません。
 
メモrecv 関数を使用する場合、SO_RCVTIMEOで指定された期間中にデータが到着しない場合、recv 関数は完了します。 Windows 2000 より前のバージョンの Windows では、その後受信したデータは WSAETIMEDOUT で失敗します。 Windows 2000 以降では、SO_RCVTIMEOで指定された期間内にデータが到着しない場合、 recv 関数は WSAETIMEDOUT を返し、データを受信した場合、 recv は SUCCESS を返します。
 

サポートされていないオプションを指定して getsockopt を呼び出すと、WSAGetLastError から WSAENOPROTOOPT のエラー コードが返されます。

getsockopt 関数でサポートされている optname パラメーターのソケット オプションの詳細を以下に示します。

SO_CONNECT_TIME
このオプションは、ソケットが接続された秒数を返します。 このオプションは、接続指向プロトコルでのみ有効です。

SO_CONNECT_TIME オプションを getsockopt 関数と共に使用して、接続が確立されているかどうかをチェックできます。 このオプションは、 ConnectEx 関数呼び出しの進行中にも使用できます。 接続が確立されている場合、SO_CONNECT_TIME オプションは、接続が確立された期間を決定できます。 ソケットが接続されていない場合、 getsockopt はSOCKET_ERRORを返します。 データを送信せずに、しばらくの間確立された接続があるかどうかを確認するには、次のような接続を確認する必要があります。 アプリケーションでこれらの接続を終了することをお勧めします。

SO_DEBUG
メモ Windows ソケット サービス プロバイダーは、SO_DEBUG オプションがアプリケーションによって設定されている場合、出力デバッグ情報を提供することをお勧めします (ただし、必須ではありません)。 デバッグ情報と、それが使用する形式を生成するためのメカニズムは、このドキュメントの範囲外です。
 
SO_ERROR
SO_ERROR オプションはソケットベースのエラー コードを返してリセットします。これは、 WSAGetLastError 関数呼び出しと WSASetLastError 関数呼び出しを使用して処理されるスレッドごとのエラー コードとは異なります。 ソケットを使用した正常な呼び出しでは、SO_ERROR オプションによって返されるソケット ベースのエラー コードはリセットされません。
SO_EXCLUSIVEADDRUSE
他のソケットが同じアドレスとポートにバインドされないようにします。 バインド関数を呼び出す前に、このオプションを設定する必要があります。 詳細については、 SO_EXCLUSIVEADDRUSE リファレンスを参照してください。
SO_GROUP_ID
メモ このオプションは予約されています。 このオプションは、 getsockopt に対しても排他的です。値は NULL である必要があります。
 
SO_GROUP_PRIORITY
このオプションは予約されています。 グループの優先度は、ソケット グループ内の他のソケットに対する指定されたソケットの優先順位を示します。 値は負でない整数であり、優先度が最も高い値に対応する 0 です。 優先度の値は、リソースが不足する可能性があるリソースを割り当てる方法に関する、基になるサービス プロバイダーへのヒントを表します。 たとえば、2 つ以上のソケットが両方ともデータを送信する準備ができたら常に、最も優先度の高いソケット (SO_GROUP_PRIORITYの最小値) を最初に処理し、残りは相対的な優先順位に従って順番に処理する必要があります。

WSAENOPROTOOPT エラー・コードは、非グループ・ソケットの場合、またはグループ・ソケットをサポートしていないサービス・プロバイダーの場合に示されます。

SO_KEEPALIVE
アプリケーションは、tcp/IP サービス プロバイダーが SO_KEEPALIVE ソケット オプションをオンにすることで、TCP 接続でのキープアライブ パケットの使用を有効にすることを要求できます。 このオプションは、ソケットのキープアライブ オプションの現在の値を照会します。 Windows ソケット プロバイダーは、キープアライブの使用をサポートする必要はありません。有効な場合、正確なセマンティクスは実装固有ですが、IETF Web サイトで利用可能な RFC 1122 で指定されているインターネット ホストの要件に関するセクション 4.2.3.6 に準拠する必要があります。 キープアライブの結果として接続が切断された場合、エラー コード WSAENETRESET はソケットで進行中の呼び出しに返され、それ以降の呼び出しは WSAENOTCONN で失敗します。 SO_KEEPALIVE は ATM ソケットではサポートされていません。また、ATM ソケットでキープアライブ パケットを使用できるように要求すると、ソケットからエラーが返されます。
SO_LINGER
SO_LINGERは、未格納データがソケットでキューに入れられて closesocket が実行されたときに実行されるアクションを制御します。 SO_LINGER設定が closesocket のセマンティクスに影響する方法については、「 closesocket」を参照してください。 アプリケーションは、(optval パラメーターによって指される) LENGTH 構造体を取得することによって、現在の動作を取得します。
SO_MAX_MSG_SIZE
これは、特定のサービス プロバイダーによって実装されるメッセージ指向ソケット型 (たとえば、SOCK_DGRAM) のメッセージの最大送信 (送信) サイズを示す、取得専用ソケット オプションです。 バイト ストリーム指向ソケットには意味がありません。 受信メッセージの最大サイズを確認するためのプロビジョニングはありません。
SO_PROTOCOL_INFO
これは、このソケットに関連付けられている WSAPROTOCOL_INFO 構造体を提供する取得専用オプションです。 この構造体の詳細については、「 WSAEnumProtocols 」を参照してください。
SO_SNDBUF
Windows ソケットの実装でSO_RCVBUFオプションとSO_SNDBUFオプションがサポートされている場合、アプリケーションは異なるバッファー サイズ (大きいまたは小さい) を要求できます。 setsockopt の呼び出しは、実装で要求された金額全体が提供されなかった場合でも成功する可能性があります。 アプリケーションは、実際に指定されたバッファー サイズをチェックするために、同じオプションを使用してこの関数を呼び出す必要があります。
SO_REUSEADDR
既定では、ソケットは既に使用されているローカル アドレスにバインドできません ( bind を参照)。 ただし、場合によっては、この方法でアドレスを再利用する必要があります。 すべての接続はローカル アドレスとリモート アドレスの組み合わせによって一意に識別されるため、リモート アドレスが異なる限り、同じローカル アドレスに 2 つのソケットをバインドしても問題はありません。 目的のアドレスが既に別のソケットで使用されているため、ソケット上のバインドを許可しないように Windows ソケット プロバイダーに通知するには、バインドを発行する前に、アプリケーションでソケットの SO_REUSEADDR ソケット オプションを設定する必要があります。 オプションは バインド時にのみ解釈されることに注意してください。したがって、既存のアドレスにバインドされていないソケットでオプションを設定する必要はありません (ただし無害です)。 バインド 後にオプションを設定またはリセットしても、このソケットやその他のソケットには影響しません。 SO_REUSEADDRは ATM ソケットには適用されず、再利用とアドレス指定の要求ではエラーは発生しませんが、ATM ソケットが使用中の場合には影響しません。
PVD_CONFIG
このオプションは、ソケット s に関連付けられているサービス プロバイダーから不透明なデータ構造オブジェクトを取得します。 このオブジェクトは、サービス プロバイダーの現在の構成情報を格納します。 このデータ構造の正確な形式は、サービス プロバイダー固有です。
TCP_NODELAY
TCP_NODELAY オプションは、TCP/IP サービス プロバイダーに固有です。 TCP_NODELAY オプションが有効になっている場合 (およびその逆) 場合、Nagle アルゴリズムは無効になります。 Nagle アルゴリズム (RFC 896 で説明) は、ホストから送信される小さなパケットの数を減らすのに非常に効果的です。 このプロセスでは、未確認のデータが既にフライト中の場合は送信データをバッファリングするか、フルサイズのパケットを送信できるようになるまで送信データをバッファリングします。 Windows ソケットの実装では、アプリケーション プロトコルの大部分で Nagle アルゴリズムが大幅なパフォーマンス向上を実現できるため、既定で Nagle アルゴリズムを有効にすることを強くお勧めします。 ただし、一部のアプリケーションでは、このアルゴリズムによってパフォーマンスが低下する可能性があり、同じオプションを使用して setsockopt を使用して無効にすることができます。 これらは、多数の小さなメッセージが送信され、メッセージ間の遅延が維持されるアプリケーションです。
メモgetsockopt などのブロッキング Winsock 呼び出しを発行する場合、Winsock は、呼び出しが完了する前にネットワーク イベントを待機する必要がある場合があります。 Winsock は、この状況でアラート可能な待機を実行します。この待機は、同じスレッドでスケジュールされた非同期プロシージャ 呼び出し (APC) によって中断される可能性があります。 同じスレッドで進行中の Winsock 呼び出しを中断した APC 内で別のブロック Winsock 呼び出しを発行すると、未定義の動作が発生し、Winsock クライアントが試行することはできません。
 

コード例

次のコード サンプルは、 getsockopt 関数の使用方法を示しています。
#include <stdio.h>
#include "winsock2.h"
#include <windows.h>

void main() {

  //---------------------------------------
  // Declare variables
  WSADATA wsaData;
  SOCKET ListenSocket;
  sockaddr_in service;

  //---------------------------------------
  // Initialize Winsock
  int iResult = WSAStartup( MAKEWORD(2,2), &wsaData );
  if( iResult != NO_ERROR )
    printf("Error at WSAStartup\n");

  //---------------------------------------
  // Create a listening socket
  ListenSocket = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );
  if (ListenSocket == INVALID_SOCKET) {
    printf("Error at socket()\n");
    WSACleanup();
    return;
  }

  //---------------------------------------
  // Bind the socket to the local IP address
  // and port 27015
  hostent* thisHost;
  char* ip;
  u_short port;
  port = 27015;
  thisHost = gethostbyname("");
  ip = inet_ntoa (*(struct in_addr *)*thisHost->h_addr_list);

  service.sin_family = AF_INET;
  service.sin_addr.s_addr = inet_addr(ip);
  service.sin_port = htons(port);
 
  if ( bind( ListenSocket,(SOCKADDR*) &service, sizeof(service) )  == SOCKET_ERROR ) {
    printf("bind failed\n");
    closesocket(ListenSocket);
    return;
  }

  //---------------------------------------
  // Initialize variables and call getsockopt. 
  // The SO_ACCEPTCONN parameter is a socket option 
  // that tells the function to check whether the 
  // socket has been put in listening mode or not. 
  // The various socket options return different
  // information about the socket. This call should
  // return 0 to the optVal parameter, since the socket
  // is not in listening mode.
  int optVal;
  int optLen = sizeof(int);

  if (getsockopt(ListenSocket, 
    SOL_SOCKET, 
    SO_ACCEPTCONN, 
    (char*)&optVal, 
    &optLen) != SOCKET_ERROR)
    printf("SockOpt Value: %ld\n", optVal);

  //---------------------------------------
  // Put the listening socket in listening mode.
  if (listen( ListenSocket, 100 ) == SOCKET_ERROR) {
    printf("error listening\n");
  } 

  //---------------------------------------
  // Call getsockopt again to verify that 
  // the socket is in listening mode.
  if (getsockopt(ListenSocket, 
    SOL_SOCKET, 
    SO_ACCEPTCONN, 
    (char*)&optVal, 
    &optLen) != SOCKET_ERROR)
    printf("SockOpt Value: %ld\n", optVal);

  WSACleanup();
  return;
}

IrDA ソケットに関する注意事項

  • Af_irda.h ヘッダー ファイルは明示的に含まれている必要があります。
  • Windows は WSAENETDOWN を返し、基になるトランシーバー ドライバーが IrDA プロトコル スタックを使用して初期化に失敗したことを示します。
  • IrDA では、いくつかの特別なソケット オプションがサポートされています。
    Type 説明
    IRLMP_ENUMDEVICES *DEVICELIST 範囲内のデバイスについて説明します。
    IRLMP_IAS_QUERY *IAS_QUERY IAS 属性を取得します。
     

IrDA ソケット接続を開始する前に、使用可能なすべての IrDA デバイスの一覧を返す getsockopt(,,IRLMP_ENUMDEVICES,,,) 関数呼び出しを実行して、デバイス アドレスを取得する必要があります。 関数呼び出しから返されたデバイス アドレスは 、SOCKADDR_IRDA 構造体にコピーされ、その後の connect 関数呼び出しの呼び出しによって使用されます。

検出は、次の 2 つの方法で実行できます。

  1. まず、IRLMP_ENUMDEVICES オプションを指定して getsockopt 関数呼び出しを実行すると、アイドル状態の各アダプターで 1 つの検出が実行されます。 検出されたデバイスとキャッシュされたデバイス (アクティブなアダプター上) の一覧がすぐに返されます。

    次のコードは、この方法を示しています。

    #include <winsock2.h>
    #include <ws2tcpip.h>
    #include <af_irda.h>
    #include <stdio.h>
    #include <windows.h>
    
    // link with Ws2_32.lib
    
    int __cdecl main()
    {
    
        //-----------------------------------------
        // Declare and initialize variables
        WSADATA wsaData;
    
        int iResult;
        int i;
        DWORD dwError;
    
        SOCKET Sock = INVALID_SOCKET;
    
    #define DEVICE_LIST_LEN    10
    
    
        SOCKADDR_IRDA DestSockAddr = { AF_IRDA, 0, 0, 0, 0, "SampleIrDAService" };
    
        unsigned char DevListBuff[sizeof (DEVICELIST) -
                                  sizeof (IRDA_DEVICE_INFO) +
                                  (sizeof (IRDA_DEVICE_INFO) * DEVICE_LIST_LEN)];
    
        int DevListLen = sizeof (DevListBuff);
        PDEVICELIST pDevList;
    
        pDevList = (PDEVICELIST) & DevListBuff;
    
        // Initialize Winsock
        iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
        if (iResult != 0) {
            printf("WSAStartup failed: %d\n", iResult);
            return 1;
        }
    
        Sock = socket(AF_IRDA, SOCK_STREAM, 0);
        if (Sock == INVALID_SOCKET) {
            dwError = WSAGetLastError();
            printf
                ("socket failed trying to create an AF_IRDA socket with error %d\n",
                 dwError);
    
            if (dwError == WSAEAFNOSUPPORT) {
                printf("Check that the local computer has an infrared device\n");
                printf
                    ("and a device driver is installed for the infrared device\n");
            }
            WSACleanup();
            return 1;
        }
        // Sock is not in connected state
        iResult = getsockopt(Sock, SOL_IRLMP, IRLMP_ENUMDEVICES,
                             (char *) pDevList, &DevListLen);
        if (iResult == SOCKET_ERROR) {
            printf("getsockopt failed with error %d\n", WSAGetLastError());
            WSACleanup();
            return 1;
        }
    
        if (pDevList->numDevice == 0) {
            // no devices discovered or cached
            // not a bad idea to run a couple of times
            printf("No IRDA devices were discovered or cached\n");
        } else {
            // one per discovered device
            for (i = 0; i < (int) pDevList->numDevice; i++) {
                // typedef struct _IRDA_DEVICE_INFO
                // {
                //     u_char    irdaDeviceID[4];
                //     char      irdaDeviceName[22];
                //     u_char    irdaDeviceHints1;
                //     u_char    irdaDeviceHints2;
                //     u_char    irdaCharSet;
                // } _IRDA_DEVICE_INFO;
    
                // pDevList->Device[i]. see _IRDA_DEVICE_INFO for fields
                // display the device names and let the user select one
            }
        }
    
        // assume the user selected the first device [0]
        memcpy(&DestSockAddr.irdaDeviceID[0], &pDevList->Device[0].irdaDeviceID[0],
               4);
    
        iResult = connect(Sock, (const struct sockaddr *) &DestSockAddr,
                          sizeof (SOCKADDR_IRDA));
        if (iResult == SOCKET_ERROR) {
            printf("connect failed with error %d\n", WSAGetLastError());
        } else
            printf("connect to first IRDA device was successful\n");
    
        WSACleanup();
        return 0;
    }
    
    
  2. IrDA デバイス アドレスの検出を実行する 2 番目の方法は、遅延検出を実行することです。この方法では、スタックによって最後に実行された検出から検出されたデバイスの一覧が変更されるまで、アプリケーションには通知されません。
前の表の Type 列に示されている DEVICELIST 構造体は、デバイスの説明の拡張可能な配列です。 IrDA は、指定されたバッファーに収まる限り多くのデバイス記述を入力します。 デバイスの説明は、sockaddr_irda構造を形成するために必要なデバイス識別子と、デバイスを記述する表示可能な文字列で構成されます。

前の表の Type 列に示されている IAS_QUERY 構造は、ピア デバイスの IAS データベースから 1 つのクラスの 1 つの属性を取得するために使用されます。 アプリケーションは、クエリを実行するデバイスとクラス、および属性と属性の種類を指定します。 デバイスは、 以前に getsockopt(IRLMP_ENUMDEVICES) の呼び出しによって取得されていることに注意してください。 アプリケーションは、返されるパラメーターに必要なサイズのバッファーを割り当てる必要があります。

多くのレベルのソケット オプションは、IrDA にとって意味がありません。SO_LINGERとSO_DONTLINGERのみがサポートされます。

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

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

要件

要件
サポートされている最小のクライアント Windows 8.1、Windows Vista [デスクトップ アプリ |UWP アプリ]
サポートされている最小のサーバー Windows Server 2003 [デスクトップ アプリのみ | UWP アプリ]
対象プラットフォーム Windows
ヘッダー winsock.h (Winsock2.h を含む)
Library Ws2_32.lib
[DLL] Ws2_32.dll

こちらもご覧ください

IPPROTO_IP ソケット オプション

IPPROTO_IPV6 ソケット オプション

IPPROTO_RM ソケット オプション

IPPROTO_TCP ソケット オプション

IPPROTO_UDP ソケット オプション

NSPROTO_IPX ソケット オプション

SOL_APPLETALK ソケット オプション

SOL_IRLMP ソケット オプション

SOL_SOCKET ソケット オプション

ソケット オプション

WSAAsyncSelect

WSAConnect

WSAGetLastError

WSAIoctl

WSASetLastError

Winsock 関数

ioctlsocket

Recv

setsockopt

socket