WSAConnectByNameA 関数 (winsock2.h)
WSAConnectByName 関数は、指定したホストとポートへの接続を確立します。 この関数は、ホスト名とポートを指定してネットワーク エンドポイントにすばやく接続できるようにするために提供されます。
この関数は、IPv4 アドレスと IPv6 アドレスの両方をサポートします。
構文
BOOL WSAConnectByNameA(
[in] SOCKET s,
[in] LPCSTR nodename,
[in] LPCSTR servicename,
[in, out] LPDWORD LocalAddressLength,
[out] LPSOCKADDR LocalAddress,
[in, out] LPDWORD RemoteAddressLength,
[out] LPSOCKADDR RemoteAddress,
[in] const timeval *timeout,
LPWSAOVERLAPPED Reserved
);
パラメーター
[in] s
接続されていないソケットを識別する記述子。
[in] nodename
IPv4 または IPv6 に接続するホストの名前またはホストの IP アドレスを含む、NULL-terminated 文字列。
[in] servicename
NULL-terminated string。IPv4 または IPv6 に接続するホストのサービス名または宛先ポートが含まれます。
サービス名は、ポート番号の文字列エイリアスです。 たとえば、"http" は、インターネット エンジニアリング タスク フォース (IETF) によって HTTP プロトコルの Web サーバーで使用される既定のポートとして定義されているポート 80 のエイリアスです。 ポート番号が指定されていない場合に、servicename パラメーターに指定できる値を次のファイルに示します。
%WINDIR%\system32\drivers\etc\services
[in, out] LocalAddressLength
入力時に、呼び出し元によって提供される LocalAddress バッファーのサイズ (バイト単位) へのポインター。 出力時に、LocalAddress バッファーに格納されているローカル アドレスの SOCKADDR のサイズ (バイト単位) へのポインターが、呼び出しの正常完了時にシステムによって入力されます。
[out] LocalAddress
接続のローカル アドレスを受け取る SOCKADDR 構造体へのポインター。 パラメーターのサイズは、LocalAddressLengthで返
[in, out] RemoteAddressLength
入力時に、呼び出し元によって提供される RemoteAddress バッファーのサイズ (バイト単位) へのポインター。 出力時に、呼び出しが正常に完了したときに、システムによって埋め込まれた RemoteAddress バッファーに格納されているリモート アドレスの
[out] RemoteAddress
接続のリモート アドレスを受け取る SOCKADDR 構造体へのポインター。 これは、getpeername 関数によって返されるのと同じ情報です。 このパラメーターは NULL
[in] timeout
呼び出しを中止する前にリモート アプリケーションからの応答を待機する時間 (ミリ秒単位)。
Reserved
将来の実装用に予約されています。 このパラメーターは、NULL
戻り値
接続が確立された場合、
呼び出しが失敗した場合は、FALSE が返されます。 WSAGetLastError を呼び出して、拡張エラー情報を取得できます。
リターン コード | 形容 |
---|---|
|
nodename パラメーターとして渡されたホストに到達できませんでした。 |
|
無効なパラメーターが関数に渡されました。 |
|
十分なメモリを割り当てませんでした。 |
|
無効なソケットが関数に渡されました。 |
|
タイムアウト パラメーターを超える前に、リモート アプリケーションからの応答を受信できませんでした。 |
備考
WSAConnectByName は、特定のポート上のリモート ホストへの迅速かつ透過的な接続を可能にするために提供されています。 IPv6 と IPv4 の両方のバージョンと互換性があります。
IPv6 と IPv4 の両方の通信を有効にするには、次の方法を使用します。
- wsAConnectByNameを呼び出す前に、AF_INET6 アドレス ファミリ用に作成されたソケットで
setsockopt 関数呼び出して、 IPV6_V6ONLY ソケット オプションを無効にする必要があります。 これは、レベルの パラメーターを IPPROTO_IPV6 に設定し (IPPROTO_IPV6 Socket Optionsを参照)、optname パラメーターを IPV6_V6ONLYに設定し、optvalue パラメーター値を 0 に設定して、ソケットで setsockopt 関数を呼び出すことによって実現されます。
WSAConnectByName
WSAConnectByName
Windows 10 より前のバージョンでは、アプリケーションが特定のローカル アドレスまたはポートにバインドする必要がある場合、WSAConnectByName
この制限は、Windows 10 から削除されました。
RemoteAddress と LocalAddress パラメーターは、ジェネリック データ型である SOCKADDR 構造体を指します。 WSAConnectByName
例えば:
//Need to #include <mswsock.h> for SO_UPDATE_CONNECT_CONTEXT
int iResult = 0;
iResult = setsockopt( s, SOL_SOCKET, SO_UPDATE_CONNECT_CONTEXT, NULL, 0 );
例
WSAConnectByName
#ifndef UNICODE
#define UNICODE
#endif
#define WIN32_LEAN_AND_MEAN
#include <winsock2.h>
#include <Ws2tcpip.h>
#include <mswsock.h> // Need for SO_UPDATE_CONNECT_CONTEXT
#include <stdio.h>
// Link with ws2_32.lib
#pragma comment(lib, "Ws2_32.lib")
SOCKET
OpenAndConnect(LPWSTR NodeName, LPWSTR PortName)
{
SOCKET ConnSocket = INVALID_SOCKET;
int ipv6only = 0;
int iResult;
BOOL bSuccess;
SOCKADDR_STORAGE LocalAddr = {0};
SOCKADDR_STORAGE RemoteAddr = {0};
DWORD dwLocalAddr = sizeof(LocalAddr);
DWORD dwRemoteAddr = sizeof(RemoteAddr);
ConnSocket = socket(AF_INET6, SOCK_STREAM, 0);
if (ConnSocket == INVALID_SOCKET){
wprintf(L"socket failed with error: %d\n", WSAGetLastError());
return INVALID_SOCKET;
}
iResult = setsockopt(ConnSocket, IPPROTO_IPV6,
IPV6_V6ONLY, (char*)&ipv6only, sizeof(ipv6only) );
if (iResult == SOCKET_ERROR){
wprintf(L"setsockopt for IPV6_V6ONLY failed with error: %d\n",
WSAGetLastError());
closesocket(ConnSocket);
return INVALID_SOCKET;
}
bSuccess = WSAConnectByName(ConnSocket, NodeName,
PortName, &dwLocalAddr,
(SOCKADDR*)&LocalAddr,
&dwRemoteAddr,
(SOCKADDR*)&RemoteAddr,
NULL,
NULL);
if (!bSuccess){
wprintf(L"WsaConnectByName failed with error: %d\n", WSAGetLastError());
closesocket(ConnSocket);
return INVALID_SOCKET;
}
iResult = setsockopt(ConnSocket, SOL_SOCKET,
SO_UPDATE_CONNECT_CONTEXT, NULL, 0);
if (iResult == SOCKET_ERROR){
wprintf(L"setsockopt for SO_UPDATE_CONNECT_CONTEXT failed with error: %d\n",
WSAGetLastError());
closesocket(ConnSocket);
return INVALID_SOCKET;
}
return ConnSocket;
}
int __cdecl wmain(int argc, wchar_t **argv)
{
//-----------------------------------------
// Declare and initialize variables
WSADATA wsaData;
int iResult;
SOCKET s = INVALID_SOCKET;
// Validate the parameters
if (argc != 3) {
wprintf(L"usage: %ws <Nodename> <Portname>\n", argv[0]);
wprintf(L"wsaconnectbyname establishes a connection to a specified host and port.\n");
wprintf(L"%ws www.contoso.com 8080\n", argv[0]);
return 1;
}
// Initialize Winsock
iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
if (iResult != 0) {
wprintf(L"WSAStartup failed: %d\n", iResult);
return 1;
}
wprintf(L"WsaConnectByName with following parameters:\n");
wprintf(L"\tNodename = %ws\n", argv[1]);
wprintf(L"\tPortname (or port) = %ws\n\n", argv[2]);
//--------------------------------
// Call our function that uses the WsaConnectByName.
s = OpenAndConnect(argv[1], argv[2]);
if ( s == INVALID_SOCKET ) {
wprintf(L"WsaConnectByName failed with error: %d\n", WSAGetLastError());
WSACleanup();
return 1;
}
else
{
wprintf(L"WsaConnectByName succeeded\n");
closesocket(s);
WSACleanup();
return 0;
}
}
手記
winsock2.h ヘッダーは、UNICODE プリプロセッサ定数の定義に基づいて、この関数の ANSI または Unicode バージョンを自動的に選択するエイリアスとして WSAConnectByName を定義します。 エンコードに依存しないエイリアスをエンコードに依存しないコードと組み合わせて使用すると、コンパイルエラーやランタイム エラーが発生する不一致が発生する可能性があります。 詳細については、「関数プロトタイプの 規則」を参照してください。
必要条件
要件 | 価値 |
---|---|
サポートされる最小クライアント | Windows 8.1、Windows Vista [デスクトップ アプリ |UWP アプリ] |
サポートされる最小サーバー | Windows Server 2008 [デスクトップ アプリ |UWP アプリ] |
ターゲット プラットフォーム の |
ウィンドウズ |
ヘッダー | winsock2.h |
ライブラリ | Ws2_32.lib |
DLL | Ws2_32.dll |
関連項目
SOCKADDR の
WSAConnect の
WSAConnectByList の
WSAGetLastError の
getaddrinfo を
getpeername を