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

エラー コード 意味
WSANOTINITIALIZED
この関数を使用する前に 、WSAStartup 呼び出しが正常に行われる必要があります。
WSAENETDOWN
ネットワーク サブシステムが失敗しました。
WSAEFAULT
optval パラメーターが指すバッファーがプロセス・アドレス・スペースの有効な部分にないか、optlen パラメーターが小さすぎます。
WSAEINPROGRESS
ブロックしている Windows ソケット 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 ソケットは暗黙的な バインド 関数呼び出しを実行します。
 
ソケット オプションには、機能または動作を有効または無効にするブール型オプションと、整数値または構造体を必要とするオプションの 2 種類があります。 Boolean オプションを有効にするには、 optval パラメーターは 0 以外の整数を指します。 オプション optval を無効にするには、0 に等しい整数をポイントします。 ブール値オプションの 場合、optlen パラメーターは と sizeof(int) 等しい必要があります。 その他のオプションの場合、 optval はオプションの目的の値を含む整数または構造体を指し、 optlen は整数または構造体の長さです。

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

レベル = SOL_SOCKET

Type 説明
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 サービス プロバイダー依存 このオブジェクトは、ソケット s に関連付けられているサービス プロバイダーの構成情報を格納します。 このデータ構造の正確な形式は、サービス プロバイダー固有です。
  レベル = SOL_SOCKETのソケット オプションの詳細と詳細については、「SOL_SOCKET ソケット オプション」を参照してください。

レベル = IPPROTO_TCP

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

レベル = NSPROTO_IPX

Type 説明
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 オプションを次の表に示します。

Type 説明
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) によって中断される可能性があります。 同じスレッドで進行中の Winsock 呼び出しを中断した APC 内で別のブロック 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、IRLMP_IAS_SET setsockopt オプションと共に使用され、ローカル IAS データベースを管理します。


// #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_QUERYは、ピアの IAS データベースに対してクエリを実行するために、IRLMP_IAS_QUERY setsockopt オプションと共に使用されます。


// #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