setsockopt 関数 (winsock.h)

setsockopt 関数はソケット オプションを設定します。

構文

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

パラメーター

[in] s

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

[in] level

オプションが定義されているレベル (たとえば、SOL_SOCKET)。

[in] optname

値を設定するソケット オプション (たとえば、SO_BROADCAST)。 optname パラメーターは、指定されたレベル内で定義されたソケット・オプションであるか、動作が未定義である必要があります。

[in] optval

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

[in] optlen

optval パラメーターが指すバッファーのサイズ (バイト単位)。

戻り値

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

エラー コード 意味
WSANOTINITIALISED
この関数を使用する前に 、WSAStartup 呼び出しが正常に行われる必要があります。
WSAENETDOWN
ネットワーク サブシステムが失敗しました。
WSAEFAULT
optval パラメーターが指すバッファーがプロセス・アドレス・スペースの有効な部分に入っていないか、optlen パラメーターが小さすぎます。
WSAEINPROGRESS
ブロックしている Windows Sockets 1.1 呼び出しが進行中であるか、サービス プロバイダーがコールバック関数を処理しています。
WSAEINVAL
level パラメーターが無効であるか、optval パラメーターが指すバッファー内の情報が無効です。
WSAENETRESET
SO_KEEPALIVEが設定されると、接続がタイムアウトしました。
WSAENOPROTOOPT
このオプションは、指定されたプロバイダーまたはソケットに対して不明またはサポートされていません (SO_GROUP_PRIORITYの制限事項を参照してください)。
WSAENOTCONN
SO_KEEPALIVEが設定されると、接続がリセットされました。
WSAENOTSOCK
記述子はソケットではありません。

注釈

setsockopt 関数は、任意の状態の任意の型のソケットに関連付けられているソケット オプションの現在の値を設定します。 オプションは複数のプロトコル レベルで存在できますが、常に最上位のソケット レベルに存在します。 オプションは、通常のデータ ストリームで優先データ (OOB データなど) を受信するかどうか、およびブロードキャスト メッセージをソケットで送信できるかどうかなど、ソケット操作に影響します。

メモバインド関数の前に setsockopt 関数が呼び出された場合、バインドが行われるまで TCP/IP を使用して TCP/IP オプションは検査されません。 この場合、setsockopt 関数呼び出しは常に成功しますが、早期の setsockopt 呼び出しが失敗したため、バインド関数呼び出しが失敗する可能性があります。
 
メモ ソケットが開かれた場合、 setsockopt 呼び出しが行われ、 sendto 呼び出しが行われると、Windows Sockets は暗黙的な バインド 関数呼び出しを実行します。
 
ソケット オプションには、機能または動作を有効または無効にするブール型オプションと、整数値または構造体を必要とするオプションの 2 種類があります。 ブール値オプションを有効にするには、 optval パラメーターは 0 以外の整数を指します。 オプション optval を無効にするには、0 に等しい整数をポイントします。 optlen パラメーターは、ブールオプションのsizeof(int)場合と等しい必要があります。 その他のオプションの場合、 optval はオプションの目的の値を含む整数または構造体を指し、 optlen は整数または構造体の長さです。

次の表に、 setsockopt 関数でサポートされる一般的なオプションの一部を示します。 Type 列は 、optval パラメーターによってアドレス指定されるデータの型を識別します。 [説明] 列には、ソケット オプションに関する基本的な情報が記載されています。 ソケット オプションの詳細な一覧と詳細な情報 (既定値など) については、「 ソケット オプション」の詳細なトピックを参照してください。

レベル = SOL_SOCKET

[値] 説明
SO_BROADCAST BOOL ブロードキャスト データを送信するためのソケットを構成します。
SO_CONDITIONAL_ACCEPT BOOL プロトコル スタックではなく、受信接続をアプリケーションで受け入れるか拒否できるようにします。
SO_DEBUG BOOL デバッグ出力を有効にします。 現在、Microsoft プロバイダーはデバッグ情報を出力しません。
SO_DONTLINGER BOOL 未送信のデータが送信されるまでの待機を閉じるのをブロックしません。 このオプションを設定することは、l_onoffが 0 に設定された SO_LINGER を設定することと同じです。
SO_DONTROUTE BOOL 他のインターフェイスでルーティングされるのではなく、ソケットがバインドされているインターフェイスで送信データを送信するかどうかを設定します。 このオプションは ATM ソケットではサポートされていません (エラーが発生します)。
SO_GROUP_PRIORITY INT 予約済み。
SO_KEEPALIVE BOOL ソケット接続のキープアライブ パケットの送信を有効にします。 ATM ソケットではサポートされていません (エラーが発生します)。
SO_LINGER 残る 未提出のデータが存在する場合は、閉じると残ります。
SO_OOBINLINE BOOL バインドされていないデータを通常のデータと一緒にインラインで返す必要があることを示します。 このオプションは、帯域外データをサポートする接続指向プロトコルでのみ有効です。 このトピックの詳細については、「 プロトコルの独立した帯域外データ」を参照してください。
SO_RCVBUF INT 受信用に予約するソケット単位の合計バッファー領域を指定します。
SO_REUSEADDR BOOL 既に使用されているアドレスにソケットをバインドすることを許可します。 詳細については、 バインドを参照してください。 ATM ソケットには適用されません。
SO_EXCLUSIVEADDRUSE BOOL ソケットを排他アクセス用にバインドできるようにします。 管理特権は必要ありません。
SO_RCVTIMEO DWORD 受信呼び出しをブロックするためのタイムアウトをミリ秒単位で設定します。
SO_SNDBUF INT 送信用に予約するソケット単位の合計バッファー領域を指定します。
SO_SNDTIMEO DWORD 送信呼び出しをブロックするためのタイムアウト (ミリ秒単位)。
SO_UPDATE_ACCEPT_CONTEXT INT リッスンしているソケットのコンテキストで受け入れるソケットを更新します。
PVD_CONFIG サービス プロバイダー依存 このオブジェクトは、ソケットに関連付けられているサービス プロバイダーの構成情報を格納 します。 このデータ構造の正確な形式は、サービス プロバイダー固有です。
  レベル = SOL_SOCKETのソケット オプションの詳細と詳細については、「SOL_SOCKET ソケット オプション」を参照してください。

レベル = IPPROTO_TCP

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

レベル = NSPROTO_IPX

説明
IPX_PTYPE INT IPX パケットの種類を設定します。
IPX_FILTERPTYPE INT 受信フィルターのパケットの種類を設定します
IPX_STOPFILTERPTYPE INT IPX_FILTERTYPEで設定されたフィルターの種類のフィルター処理を停止します
IPX_DSTYPE INT 送信されるすべてのパケットの SPX ヘッダーのデータ ストリーム フィールドの値を設定します。
IPX_EXTENDED_ADDRESS BOOL 拡張アドレス指定を有効にするかどうかを設定します。
IPX_RECVHDR BOOL プロトコル ヘッダーがすべての受信ヘッダーで送信されるかどうかを設定します。
IPX_RECEIVE_BROADCAST BOOL ブロードキャスト パケットがソケット上にある可能性があることを示します。 既定では TRUE に設定されています。 ブロードキャストを使用しないアプリケーションでは、システム パフォーマンスを向上させるために、これを FALSE に設定する必要があります。
IPX_IMMEDIATESPXACK BOOL ACK を送信する前に SPX 接続を遅延しないように指示します。 前後のトラフィックがないアプリケーションでは、パフォーマンスを向上させるためにこれを TRUE に設定する必要があります。
 

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

setsockopt でサポートされていない BSD オプションを次の表に示します。

説明
SO_ACCEPTCONN BOOL ソケットがリッスン モードかどうかを返します。 このオプションは、接続指向プロトコルでのみ有効です。 このソケット オプションは、この設定ではサポートされていません。
SO_RCVLOWAT INT 下位互換性のために BSD UNIX からのソケット オプションが含まれています。 このオプションは、ソケット入力操作で処理する最小バイト数を設定します。
SO_SNDLOWAT INT 下位互換性のために BSD UNIX からのソケット オプションが含まれています。 このオプションは、ソケット出力操作で処理する最小バイト数を設定します。
SO_TYPE INT 指定されたソケットのソケットの種類 (SOCK_STREAMまたはSOCK_DGRAMを返します。たとえば、ソケットの種類の設定では、このソケット オプションはサポートされていません。
 
メモsetsockopt などのブロッキング Winsock 呼び出しを発行する場合、Winsock は、呼び出しが完了する前にネットワーク イベントを待機する必要がある場合があります。 Winsock は、この状況でアラート可能な待機を実行します。この待機は、同じスレッドでスケジュールされた非同期プロシージャ 呼び出し (APC) によって中断される可能性があります。 APC 内で別のブロッキング Winsock 呼び出しを発行して、同じスレッドで進行中の Winsock 呼び出しを中断すると、未定義の動作が発生し、Winsock クライアントが試行することはできません。
 

コード例

次の例では、 setsockopt 関数を示します。
#ifndef UNICODE
#define UNICODE
#endif

#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif

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

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

int main()
{

    //---------------------------------------
    // Declare variables
    WSADATA wsaData;

    SOCKET ListenSocket;
    sockaddr_in service;

    int iResult = 0;

    BOOL bOptVal = FALSE;
    int bOptLen = sizeof (BOOL);

    int iOptVal = 0;
    int iOptLen = sizeof (int);

    //---------------------------------------
    // Initialize Winsock
    iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
    if (iResult != NO_ERROR) {
        wprintf(L"Error at WSAStartup()\n");
        return 1;
    }
    //---------------------------------------
    // Create a listening socket
    ListenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (ListenSocket == INVALID_SOCKET) {
        wprintf(L"socket function failed with error: %u\n", WSAGetLastError());
        WSACleanup();
        return 1;
    }
    //---------------------------------------
    // 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);

    iResult = bind(ListenSocket, (SOCKADDR *) & service, sizeof (service));
    if (iResult == SOCKET_ERROR) {
        wprintf(L"bind failed with error %u\n", WSAGetLastError());
        closesocket(ListenSocket);
        WSACleanup();
        return 1;
    }
    //---------------------------------------
    // Initialize variables and call setsockopt. 
    // The SO_KEEPALIVE parameter is a socket option 
    // that makes the socket send keepalive messages
    // on the session. The SO_KEEPALIVE socket option
    // requires a boolean value to be passed to the
    // setsockopt function. If TRUE, the socket is
    // configured to send keepalive messages, if FALSE
    // the socket configured to NOT send keepalive messages.
    // This section of code tests the setsockopt function
    // by checking the status of SO_KEEPALIVE on the socket
    // using the getsockopt function.

    bOptVal = TRUE;

    iResult = getsockopt(ListenSocket, SOL_SOCKET, SO_KEEPALIVE, (char *) &iOptVal, &iOptLen);
    if (iResult == SOCKET_ERROR) {
        wprintf(L"getsockopt for SO_KEEPALIVE failed with error: %u\n", WSAGetLastError());
    } else
        wprintf(L"SO_KEEPALIVE Value: %ld\n", iOptVal);

    iResult = setsockopt(ListenSocket, SOL_SOCKET, SO_KEEPALIVE, (char *) &bOptVal, bOptLen);
    if (iResult == SOCKET_ERROR) {
        wprintf(L"setsockopt for SO_KEEPALIVE failed with error: %u\n", WSAGetLastError());
    } else
        wprintf(L"Set SO_KEEPALIVE: ON\n");

    iResult = getsockopt(ListenSocket, SOL_SOCKET, SO_KEEPALIVE, (char *) &iOptVal, &iOptLen);
    if (iResult == SOCKET_ERROR) {
        wprintf(L"getsockopt for SO_KEEPALIVE failed with error: %u\n", WSAGetLastError());
    } else
        wprintf(L"SO_KEEPALIVE Value: %ld\n", iOptVal);

    closesocket(ListenSocket);
    WSACleanup();
    return 0;
}


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

IrDA 用 Windows ソケットを使用してアプリケーションを開発する場合は、次の点に注意してください。

  • Af_irda.h ヘッダー ファイルは明示的に含まれている必要があります。
  • IrDA には、次のソケット オプションが用意されています。
    [値] Type 説明
    IRLMP_IAS_SET *IAS_SET IAS 属性を設定します
     

IRLMP_IAS_SET ソケット オプションを使用すると、アプリケーションはローカル IAS で 1 つのクラスの 1 つの属性を設定できます。 アプリケーションは、設定するクラス、属性、および属性の型を指定します。 アプリケーションは、渡されたパラメーターに必要なサイズのバッファーを割り当てる必要があります。

IrDA は、IrDA ベースの情報を格納する IAS データベースを提供します。 IAS データベースへの制限付きアクセスは Windows Sockets 2 インターフェイスを通じて利用できますが、このようなアクセスは通常アプリケーションでは使用されず、主に Windows ソケット 2 IrDA 規則に準拠していない Windows 以外のデバイスへの接続をサポートするために存在します。

次の構造体 IAS_SETは、ローカル IAS データベースを管理するために、IRLMP_IAS_SET setsockopt オプションと共に使用されます。


// #include <Af_irda.h> for this struct

typedef struct _IAS_SET {
    u_char      irdaClassName[IAS_MAX_CLASSNAME];
    char      irdaAttribName[IAS_MAX_ATTRIBNAME];
    u_long    irdaAttribType;
    union
    {
              LONG irdaAttribInt;
              struct
              {
                   u_long   Len;
                   u_char    OctetSeq[IAS_MAX_OCTET_STRING];
              } irdaAttribOctetSeq;
              struct
              {
                   u_long    Len;
                   u_long    CharSet;
                   u_char    UsrStr[IAS_MAX_USER_STRING];
              } irdaAttribUsrStr;
    } irdaAttribute;
} IAS_SET, *PIAS_SET, FAR *LPIASSET;

ピアの IAS データベースに対してクエリを実行するには、IRLMP_IAS_QUERY setsockopt オプションと共にIAS_QUERY次の構造体を使用します。


// #include <Af_irda.h> for this struct

typedef struct _WINDOWS_IAS_QUERY {
        u_char   irdaDeviceID[4];
        char     irdaClassName[IAS_MAX_CLASSNAME];
        char     irdaAttribName[IAS_MAX_ATTRIBNAME];
        u_long   irdaAttribType;
        union
        {
                  LONG    irdaAttribInt;
                  struct
                  {
                          u_long  Len;
                          u_char  OctetSeq[IAS_MAX_OCTET_STRING];
                  } irdaAttribOctetSeq;
                  struct
                  {
                          u_long  Len;
                          u_long  CharSet;
                          u_char  UsrStr[IAS_MAX_USER_STRING];
                  } irdaAttribUsrStr;
        } irdaAttribute;
} IAS_QUERY, *PIAS_QUERY, FAR *LPIASQUERY;

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

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

WSAEventSelect

WSAIoctl

Winsock 関数

bind

getsockopt

ioctlsocket

socket