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 を呼び出すことによって特定のエラー コードを取得できます。
エラー コード | Meaning |
---|---|
この関数を使用する前に、 WSAStartup 呼び出しが正常に行われる必要があります。 | |
ネットワーク サブシステムが失敗しました。 | |
optval パラメーターが指すバッファーがプロセス・アドレス・スペースの有効な部分にないか、optlen パラメーターが小さすぎます。 | |
ブロックしている Windows ソケット 1.1 呼び出しが進行中であるか、サービス プロバイダーがコールバック関数を処理しています。 | |
level パラメーターが無効であるか、optval パラメーターが指すバッファー内の情報が無効です。 | |
SO_KEEPALIVEが設定されると、接続がタイムアウトしました。 | |
このオプションは、指定されたプロバイダーまたはソケットに対して不明またはサポートされていません (SO_GROUP_PRIORITYの制限事項を参照してください)。 | |
SO_KEEPALIVEが設定されると、接続がリセットされました。 | |
記述子はソケットではありません。 |
注釈
setsockopt 関数は、任意の型のソケットに関連付けられているソケット オプションの現在の値を任意の状態で設定します。 オプションは複数のプロトコル レベルで存在できますが、常に最上位のソケット レベルに存在します。 オプションは、通常のデータ ストリームで優先データ (OOB データなど) を受信するかどうか、およびソケットでブロードキャスト メッセージを送信できるかどうかなど、ソケット操作に影響します。
sizeof(int)
と等しい必要があります。 その他のオプションの場合、 optval はオプションの目的の値を含む整数または構造体を指し、 optlen は整数または構造体の長さです。
次の表に 、setsockopt 関数でサポートされる一般的なオプションの一部を示します。 Type 列は、 optval パラメーターによってアドレス指定されるデータの型を識別します。 [説明] 列には、ソケット オプションに関するいくつかの基本情報が表示されます。 ソケット オプションの詳細な一覧と詳細な情報 (既定値など) については、「 ソケット オプション」の詳細なトピックを参照してください。
level = SOL_SOCKET
価値 | タイプ | Description |
---|---|---|
SO_BROADCAST | ブール | ブロードキャスト データを送信するためのソケットを構成します。 |
SO_CONDITIONAL_ACCEPT | ブール | 着信接続をプロトコル スタックではなく、アプリケーションで受け入れるか拒否できるようにします。 |
SO_DEBUG | ブール | デバッグ出力を有効にします。 現在、Microsoft プロバイダーはデバッグ情報を出力しません。 |
SO_DONTLINGER | ブール | 送信されていないデータの送信を待機するクローズをブロックしません。 このオプションを設定することは、l_onoffを 0 に設定した SO_LINGER を設定することと同じです。 |
SO_DONTROUTE | ブール | 他のインターフェイスでルーティングされるのではなく、ソケットがバインドされているインターフェイスで送信データを送信するかどうかを設定します。 このオプションは ATM ソケットではサポートされていません (エラーが発生します)。 |
SO_GROUP_PRIORITY | 整数 (int) | 引っ込み思案。 |
SO_KEEPALIVE | ブール | ソケット接続のキープアライブ パケットの送信を有効にします。 ATM ソケットではサポートされていません (エラーが発生します)。 |
SO_LINGER | ぐずぐず | 未入データが存在する場合は、閉じても残ります。 |
SO_OOBINLINE | ブール | バインドされていないデータを通常のデータと一緒にインラインで返す必要があることを示します。 このオプションは、帯域外データをサポートする接続指向プロトコルでのみ有効です。 このトピックの説明については、「 プロトコルに依存しない帯域外データ」を参照してください。 |
SO_RCVBUF | 整数 (int) | 受信用に予約されているソケットごとのバッファー領域の合計を指定します。 |
SO_REUSEADDR | ブール | ソケットが既に使用されているアドレスにバインドできるようにします。 詳細については、 バインドを参照してください。 ATM ソケットには適用されません。 |
SO_EXCLUSIVEADDRUSE | ブール | ソケットを排他アクセスにバインドできるようにします。 管理特権は必要ありません。 |
SO_RCVTIMEO | ダブルワード | 受信呼び出しをブロックするためのタイムアウトをミリ秒単位で設定します。 |
SO_SNDBUF | 整数 (int) | 送信用に予約されているソケットごとのバッファー領域の合計を指定します。 |
SO_SNDTIMEO | ダブルワード | 送信呼び出しをブロックするためのタイムアウト (ミリ秒単位)。 |
SO_UPDATE_ACCEPT_CONTEXT | UINT_PTR | リッスンしているソケットのコンテキストを使用して、受け入れ側ソケットを更新します。 |
PVD_CONFIG | サービス プロバイダー依存 | このオブジェクトは、ソケットに関連付けられているサービス プロバイダーの構成情報を格納 します。 このデータ構造の正確な形式は、サービス プロバイダー固有です。 |
level = IPPROTO_TCP
ソケット オプションのTCP_NODELAY IPPROTO_TCP参照してください。 また、レベル = IPPROTO_TCPのソケット オプションの詳細と詳細については、このトピックを参照してください。
level = NSPROTO_IPX
価値 | タイプ | Description |
---|---|---|
IPX_PTYPE | 整数 (int) | IPX パケットの種類を設定します。 |
IPX_FILTERPTYPE | 整数 (int) | 受信フィルター パケットの種類を設定します。 |
IPX_STOPFILTERPTYPE | 整数 (int) | IPX_FILTERTYPEで設定されたフィルターの種類のフィルター処理を停止します |
IPX_DSTYPE | 整数 (int) | 送信されるすべてのパケットの SPX ヘッダーのデータ ストリーム フィールドの値を設定します。 |
IPX_EXTENDED_ADDRESS | ブール | 拡張アドレス指定を有効にするかどうかを設定します。 |
IPX_RECVHDR | ブール | プロトコル ヘッダーがすべての受信ヘッダーで送信されるかどうかを設定します。 |
IPX_RECEIVE_BROADCAST | ブール | ブロードキャスト パケットがソケット上にある可能性があることを示します。 既定では TRUE に設定されます。 ブロードキャストを使用しないアプリケーションでは、システム パフォーマンスを向上させるために、これを FALSE に設定する必要があります。 |
IPX_IMMEDIATESPXACK | ブール | ACK を送信する前に SPX 接続を遅延しないように指示します。 前後のトラフィックがないアプリケーションでは、パフォーマンスを向上させるためにこれを TRUE に設定する必要があります。 |
レベル = NSPROTO_IPXのソケット オプションの詳細と詳細については、「NSPROTO_IPX ソケット オプション」を参照してください。
setsockopt でサポートされていない BSD オプションを次の表に示します。
価値 | タイプ | Description |
---|---|---|
SO_ACCEPTCONN | ブール | ソケットがリッスン モードであるかどうかを返します。 このオプションは、接続指向プロトコルでのみ有効です。 このソケット オプションは、この設定ではサポートされていません。 |
SO_RCVLOWAT | 整数 (int) | 下位互換性のために BSD UNIX のソケット オプションが含まれています。 このオプションは、ソケット入力操作で処理する最小バイト数を設定します。 |
SO_SNDLOWAT | 整数 (int) | 下位互換性のために BSD UNIX のソケット オプションが含まれています。 このオプションは、ソケット出力操作で処理する最小バイト数を設定します。 |
SO_TYPE | 整数 (int) | 特定のソケットのソケットの種類 (SOCK_STREAMまたはSOCK_DGRAMを返します。たとえば、このソケット オプションは、ソケットの種類の設定ではサポートされていません。 |
コード例
次の例では、 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 には、次のソケット オプションがあります。
価値 タイプ Meaning 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_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.1 および Windows Server 2012 R2: この関数は、Windows 8.1、Windows Server 2012 R2 以降の Windows ストア アプリでサポートされています。
Requirements
Requirement | 価値 |
---|---|
サポートされる最小クライアント | Windows 8.1、Windows Vista [デスクトップ アプリ |UWP アプリ] |
サポートされる最小サーバー | Windows Server 2003 [デスクトップ アプリ |UWP アプリ] |
ターゲット プラットフォーム の | ウィンドウズ |
Header | winsock.h (Winsock2.h を含む) |
Library | Ws2_32.lib |
DLL | Ws2_32.dll |