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 を呼び出すことによって特定のエラー コードを取得できます。

エラー コード 意味
WSANOTINITIALISED
この関数を使用する前に 、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 サービス プロバイダー依存 ソケット s に関連付けられているサービス プロバイダーからの不透明なデータ構造オブジェクト。 このオブジェクトは、サービス プロバイダーの現在の構成情報を格納します。 このデータ構造の正確な形式は、サービス プロバイダー固有です。
 

レベル = IPPROTO_TCP

ソケット オプションのTCP_NODELAY IPPROTO_TCP参照してください。 また、レベル = 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 から始まります。 アダプター数値メンバーは、戻り時に入力されます。
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 存在するアダプターの最大数を取得し、基本 0 として番号を付けます。
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 Sockets サービス プロバイダーは、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 パラメーターによって指される) LINGER 構造体を取得することによって、現在の動作を取得します。
SO_MAX_MSG_SIZE
これは、特定のサービス プロバイダーによって実装されるメッセージ指向ソケットの種類 (たとえば、SOCK_DGRAM) のメッセージの最大送信 (送信) サイズを示す取得専用ソケット オプションです。 バイト ストリーム指向のソケットには意味がありません。 受信メッセージの最大サイズを確認するためのプロビジョニングはありません。
SO_PROTOCOL_INFO
これは、このソケットに関連付けられている WSAPROTOCOL_INFO 構造体を提供する取得専用オプションです。 この構造体の詳細については、 WSAEnumProtocols を参照してください。
SO_SNDBUF
Windows Sockets の実装でSO_RCVBUFオプションとSO_SNDBUF オプションがサポートされている場合、アプリケーションはさまざまなバッファー サイズ (大きいまたは小さい) を要求できます。 setsockopt の呼び出しは、実装が要求された金額全体を提供しなかった場合でも成功する可能性があります。 アプリケーションは、実際に指定されたバッファー サイズを確認するために、同じオプションを使用してこの関数を呼び出す必要があります。
SO_REUSEADDR
既定では、ソケットは、既に使用されているローカル アドレスにバインド ( バインドを参照) することはできません。 ただし、場合によっては、この方法でアドレスを再利用する必要があります。 すべての接続はローカル アドレスとリモート アドレスの組み合わせによって一意に識別されるため、リモート アドレスが異なる限り、同じローカル アドレスに 2 つのソケットをバインドしても問題はありません。 目的のアドレスが既に別のソケットで使用されているため、ソケット上のバインドを許可しないことを Windows Sockets プロバイダーに通知するには、バインドを発行する前に、アプリケーションでソケットのSO_REUSEADDR ソケット オプションを設定する必要があります。 このオプションは バインド時にのみ解釈されることに注意してください。したがって、既存のアドレスにバインドされないソケットにオプションを設定することは不要です (無害です)。 バインド 後のオプションの設定またはリセットは、このソケットまたはその他のソケットには影響しません。 SO_REUSEADDRは ATM ソケットには適用されず、再利用とアドレス指定の要求ではエラーは発生しませんが、ATM ソケットが使用中の場合には影響しません。
PVD_CONFIG
このオプションは、ソケット s に関連付けられているサービス プロバイダーから不透明なデータ構造オブジェクトを取得します。 このオブジェクトは、サービス プロバイダーの現在の構成情報を格納します。 このデータ構造の正確な形式は、サービス プロバイダー固有です。
TCP_NODELAY
TCP_NODELAY オプションは、TCP/IP サービス プロバイダーに固有です。 TCP_NODELAY オプションが有効になっている場合 (またはその逆) には、Nagle アルゴリズムが無効になります。 Nagle アルゴリズム (RFC 896 で説明) は、ホストから送信される小さなパケットの数を減らすのに非常に効果的です。 このプロセスでは、未確認のデータが既に処理中の場合は送信データのバッファリング、またはフルサイズのパケットを送信できるようになるまで送信データのバッファリングを行います。 Windows Sockets の実装では、アプリケーション プロトコルの大部分に対して 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.1および Windows 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