WSAAccept 関数 (winsock2.h)
WSAAccept 関数は、条件関数の戻り値に基づいて条件付きで接続を受け入れ、サービス フローの仕様の品質を提供し、接続データの転送を許可します。
構文
SOCKET WSAAPI WSAAccept(
[in] SOCKET s,
[out] sockaddr *addr,
[in, out] LPINT addrlen,
[in] LPCONDITIONPROC lpfnCondition,
[in] DWORD_PTR dwCallbackData
);
パラメーター
[in] s
listen 関数の呼び出し後に接続をリッスンしているソケット 識別する記述子。
[out] addr
接続エンティティのアドレスを受け取る sockaddr 構造体への省略可能なポインター (通信層の既知)。 addr パラメーターの正確な形式は、ソケットの作成時に確立されたアドレス ファミリによって決まります。
[in, out] addrlen
addr パラメーターが指す sockaddr 構造体の長さをバイト単位で格納する整数への省略可能なポインター。
[in] lpfnCondition
パラメーターとして渡された呼び出し元情報に基づいて受け入れ/拒否の決定を行い、必要に応じて、この関数の結果パラメーターに適切な値を割り当てることでソケット グループを作成または結合する、アプリケーションが指定したオプションの条件関数 アドレス。 このパラメーターが NULL
[in] dwCallbackData
条件関数に渡される dwCallbackData パラメーターの値として、アプリケーション指定の条件関数に返されるコールバック データ。 このパラメーターは、
戻り値
エラーが発生しない場合、WSAAccept
エラー コード | 意味 |
---|---|
|
アクセス許可によって禁止されている方法でソケットにアクセスしようとしました。 このエラーは、提供された接続要求がタイムアウトまたは取り消された場合に返されます。 |
|
ターゲット マシンがアクティブに拒否したため、接続できませんでした。 このエラーは、条件関数 (CF_REJECT) の戻り値で示されているように、接続要求が強制的に拒否された場合に返されます。 |
|
既存の接続がリモート ホストによって強制的に閉じられました。 このエラーは、着信接続が示されたが、その後、呼び出しを受け入れる前にリモート ピアによって終了された場合に返されます。 |
|
システムは、呼び出しでポインター引数を使用しようとしたときに、無効なポインター アドレスを検出しました。 このエラーは、 |
|
WSACancelBlockingCall |
|
ブロック操作は現在実行中です。 このエラーは、ブロックしている Windows ソケット 1.1 呼び出しが進行中の場合に返されます。 |
|
無効な引数が指定されました。
このエラーは、wsAAcceptを |
|
開いているソケットが多すぎます。 このエラーは、WSAAccept への入力時にキューが空でない場合 |
|
ソケット操作で、ネットワークが停止しました。 このエラーは、ネットワーク サブシステムが失敗した場合に返されます。 |
|
システムに十分なバッファー領域がなかったか、キューがいっぱいであるため、ソケットに対する操作を実行できませんでした。 このエラーは、使用可能なバッファー領域がない場合に返されます。 |
|
ソケットではないものに対して操作が試行されました。 このエラーは、s パラメーターで渡されたソケット記述子がソケットでない場合に返されます。 |
|
プロトコル ファミリがシステムに構成されていないか、実装が存在しません。 このエラーは、参照先のソケットが接続指向サービスをサポートする型でない場合に返されます。 |
|
非ブロッキング ソケット操作をすぐに完了できませんでした。 このエラーは、ソケットが非ブロッキングとしてマークされていて、受け入れられる接続がない場合に返されます。 |
|
アプリケーションが WSAStartup |
これは通常、ホスト名の解決中に一時的なエラーであり、ローカル サーバーが権限のあるサーバーから応答を受信しなかったことを意味します。 このエラーは、条件関数 (CF_DEFER) の戻り値で示されているように、接続要求の受け入れが遅延された場合に返されます。 |
備考
既定モードのソケット (ブロック) は、アプリケーションが WSAAccept
アプリケーションが WSAAccept
addr パラメーターは、通信層に知られているように、接続エンティティのアドレスが入力された結果パラメーターです。
addr パラメーターの正確な形式は、通信が行われているアドレス ファミリによって決まります。
条件関数のプロトタイプは、次のように、Winsock2.h
ヘッダー ファイルで LPCONDITIONPROCとして定義されます。
int CALLBACK
ConditionFunc(
IN LPWSABUF lpCallerId,
IN LPWSABUF lpCallerData,
IN OUT LPQOS lpSQOS,
IN OUT LPQOS lpGQOS,
IN LPWSABUF lpCalleeId,
IN LPWSABUF lpCalleeData,
OUT GROUP FAR * g,
IN DWORD_PTR dwCallbackData
);
ConditionFunc は、アプリケーション指定のコールバック関数のプレースホルダーです。 実際の条件関数は、DLL またはアプリケーション モジュール内に存在する必要があります。 これはモジュール定義ファイルにエクスポートされます。
lpCallerId パラメーターは、接続エンティティのアドレスを含む WSABUF 構造体を指します。ここで、len パラメーターはバッファーの長さ (バイト単位)、buf パラメーターはバッファーへのポインターです。
lpCallerData は、ユーザー データを含む値パラメーターです。 これらのパラメーターの情報は、接続要求と共に送信されます。 呼び出し元 ID または呼び出し元データが使用できない場合、対応するパラメーターは NULL
lpSQOS パラメーターは、呼び出し元によって指定されたソケット の FLOWSPEC 構造体を参照し、その後にプロバイダー固有の追加パラメーターが続きます。 送信側または受信フローの指定値は、単一方向ソケットに対して適切に無視されます。
NULL 値は、呼び出し元が提供するサービス品質がなく、ネゴシエーションが不可能であることを示します。 lpSQOS ポインター
lpCalleeId は、接続されたエンティティのローカル アドレスを含むパラメーターです。 lpCalleeId が指す WSABUF の buf 部分は、sockaddr 構造体を指しています。 sockaddr 構造体は、アドレス ファミリに従って解釈されます (通常は、sockaddr を、構造体 sockaddr_inなどのアドレス ファミリに固有の型にキャストします)。
lpCalleeData は、接続エンティティにユーザー データを返すために条件関数によって使用される結果パラメーターです。
g パラメーターは、条件関数内で割り当てられ、次のいずれかのアクションを示します。
- g が既存のソケット グループ識別子
場合は、このグループによって設定されたすべての要件が満たされていれば、 の をこのグループに追加します。 - g = SG_UNCONSTRAINED_GROUP
場合は、制約のないソケット グループを作成し、最初のメンバーとして します。 - g = SG_CONSTRAINED_GROUP
場合は、制約付きソケット グループを作成し、最初のメンバーとして します。 - g = 0 の場合、グループ操作は実行されません。
条件関数に渡される dwCallbackData パラメーター値は、元の WSAAccept 呼び出しで dwCallbackData パラメーターとして渡される値です。 この値は、Windows ソケット バージョン 2 クライアントによってのみ解釈されます。 これにより、クライアントは、WSAAccept 呼び出しサイトから条件関数にコンテキスト情報を渡すことができます。 これにより、接続を受け入れるかどうかを判断するために必要な追加情報が条件関数に提供されます。 一般的な使用法は、このソケットが関連付けられているアプリケーション定義オブジェクトへの参照を含むデータ構造に (適切にキャストされた) ポインターを渡すことです。
コード例
次の例では、WSAAccept 関数の使用を示します。#include <winsock2.h>
#include <stdio.h>
#include <windows.h>
/* Define an example conditional function that depends on the pQos field */
int CALLBACK ConditionAcceptFunc(
LPWSABUF lpCallerId,
LPWSABUF lpCallerData,
LPQOS pQos,
LPQOS lpGQOS,
LPWSABUF lpCalleeId,
LPWSABUF lpCalleeData,
GROUP FAR * g,
DWORD_PTR dwCallbackData
)
{
if (pQos != NULL) {
RtlZeroMemory(pQos, sizeof(QOS));
return CF_ACCEPT;
} else
return CF_REJECT;
}
int main() {
/* Declare and initialize variables */
WSADATA wsaData;
SOCKET ListenSocket, AcceptSocket;
struct sockaddr_in saClient;
int iClientSize = sizeof(saClient);
u_short port = 27015;
char* ip;
sockaddr_in service;
int error;
/* Initialize Winsock */
error = WSAStartup(MAKEWORD(2,2), &wsaData);
if (error) {
printf("WSAStartup() failed with error: %d\n", error);
return 1;
}
/* Create a TCP listening socket */
ListenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (ListenSocket == INVALID_SOCKET) {
printf("socket() failed with error: %d\n", WSAGetLastError() );
WSACleanup();
return 1;
}
/*-----------------------------------------
* Set up the sock addr structure that the listening socket
* will be bound to. In this case, the structure holds the
* local IP address and the port specified. */
service.sin_family = AF_INET;
service.sin_port = htons(port);
hostent* thisHost;
thisHost = gethostbyname("");
ip = inet_ntoa (*(struct in_addr *)*thisHost->h_addr_list);
service.sin_addr.s_addr = inet_addr(ip);
/*-----------------------------------------
* Bind the listening socket to the IP address.
* and port number specified by the sockaddr structure. */
error = bind(ListenSocket, (SOCKADDR *) &service, sizeof(SOCKADDR));
if (error == SOCKET_ERROR) {
printf("bind() failed with error: %d\n", WSAGetLastError() );
closesocket(ListenSocket);
WSACleanup();
return 1;
}
/* Make the socket listen for incoming connection requests */
error = listen(ListenSocket, 1);
if (error == SOCKET_ERROR) {
printf("listen() failed with error: %d\n", WSAGetLastError() );
closesocket(ListenSocket);
WSACleanup();
return 1;
}
printf("Listening...\n");
/*-----------------------------------------
* Accept an incoming connection request on the
* listening socket and transfer control to the
* accepting socket. */
AcceptSocket = WSAAccept(ListenSocket, (SOCKADDR*) &saClient, &iClientSize,
&ConditionAcceptFunc, NULL);
/* Now do some work with the AcceptSocket
* At this point, the application could
* handle data transfer on the socket, or other socket
* functionality.*/
/* Then clean up and quit */
closesocket(AcceptSocket);
closesocket(ListenSocket);
WSACleanup();
return 0;
}
Windows Phone 8: この機能は、Windows Phone 8 以降の Windows Phone ストア アプリでサポートされています。
必要条件
要件 | 価値 |
---|---|
サポートされる最小クライアント | Windows 8.1、Windows Vista [デスクトップ アプリ |UWP アプリ] |
サポートされる最小サーバー | Windows Server 2003 [デスクトップ アプリ |UWP アプリ] |
ターゲット プラットフォーム の |
ウィンドウズ |
ヘッダー | winsock2.h |
ライブラリ | Ws2_32.lib |
DLL | Ws2_32.dll |
関連項目
WSAAsyncSelect の
WSAConnect の
WSASocket の
を受け入れる
を選択
sockaddr を
ソケット