setsockopt 関数 (winsock2.h)
setsockopt 関数はソケット オプションを設定します。
構文
int WSAAPI 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 を呼び出すことによって特定のエラー コードを取得できます。
エラー コード | 意味 |
---|---|
この関数を使用する前に、 WSAStartup 呼び出しが正常に行われる必要があります。 | |
ネットワーク サブシステムが失敗しました。 | |
optval パラメーターが指すバッファーがプロセス・アドレス・スペースの有効な部分にないか、optlen パラメーターが小さすぎます。 | |
ブロックしている Windows Sockets 1.1 呼び出しが進行中であるか、サービス プロバイダーがコールバック関数を処理しています。 | |
level パラメーターが無効であるか、optval パラメーターが指すバッファー内の情報が無効です。 | |
SO_KEEPALIVEが設定されると、接続がタイムアウトしました。 | |
このオプションは、指定されたプロバイダーまたはソケットに対して不明であるか、サポートされていません (SO_GROUP_PRIORITY制限事項を参照してください)。 | |
SO_KEEPALIVEが設定されると、接続がリセットされました。 | |
記述子はソケットではありません。 |
解説
setsockopt 関数は、任意の型のソケットに関連付けられているソケット オプションの現在の値を任意の状態で設定します。 オプションは複数のプロトコル レベルで存在できますが、常に最上位のソケット レベルに存在します。 オプションは、優先データ (OOB データなど) を通常のデータ ストリームで受信するかどうか、およびブロードキャスト メッセージをソケットで送信できるかどうかなど、ソケット操作に影響します。
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 関数を示します。#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.1と Windows Server 2012 R2: この関数は、Windows 8.1、Windows Server 2012 R2 以降の Windows ストア アプリでサポートされています。
要件
サポートされている最小のクライアント | Windows 8.1、 Windows Vista [デスクトップ アプリ |UWP アプリ] |
サポートされている最小のサーバー | Windows Server 2003 [デスクトップ アプリのみ | UWP アプリ] |
対象プラットフォーム | Windows |
ヘッダー | winsock2.h (Winsock2.h を含む) |
Library | Ws2_32.lib |
[DLL] | Ws2_32.dll |