Fungsi LookupPersistentTcpPortReservation (iphlpapi.h)
Fungsi LookupPersistentTcpPortReservation mencari token untuk reservasi port TCP persisten untuk blok berturut-turut port TCP di komputer lokal.
Sintaks
IPHLPAPI_DLL_LINKAGE ULONG LookupPersistentTcpPortReservation(
[in] USHORT StartPort,
[in] USHORT NumberOfPorts,
[out] PULONG64 Token
);
Parameter
[in] StartPort
Nomor port TCP awal dalam urutan byte jaringan.
[in] NumberOfPorts
Jumlah nomor port TCP yang dicadangkan.
[out] Token
Pointer ke token reservasi port yang dikembalikan jika fungsi berhasil.
Nilai kembali
Jika fungsi berhasil, nilai yang dikembalikan adalah NO_ERROR.
Jika fungsi gagal, nilai yang dikembalikan adalah salah satu kode kesalahan berikut.
Menampilkan kode | Deskripsi |
---|---|
|
Parameter yang tidak valid diteruskan ke fungsi. Kesalahan ini dikembalikan jika nol diteruskan dalam parameter StartPort atau NumberOfPorts . |
|
Elemen tidak ditemukan. Kesalahan ini dikembalikan jika blok port persisten yang ditentukan oleh parameter StartPort dan NumberOfPorts tidak dapat ditemukan. |
|
Gunakan FormatMessage untuk mendapatkan string pesan untuk kesalahan yang dikembalikan. |
Keterangan
Fungsi LookupPersistentTcpPortReservation didefinisikan pada Windows Vista dan yang lebih baru.
Fungsi LookupPersistentTcpPortReservation digunakan untuk mencari token untuk reservasi persisten untuk blok port TCP.
Reservasi persisten untuk blok port TCP dibuat dengan panggilan ke fungsi CreatePersistentTcpPortReservation . Parameter StartPort atau NumberOfPorts yang diteruskan ke fungsi LookupPersistentTcpPortReservation harus cocok dengan nilai yang digunakan saat reservasi persisten untuk blok port TCP dibuat oleh fungsi CreatePersistentTcpPortReservation .
Jika fungsi LookupPersistentTcpPortReservation berhasil, parameter Token yang dikembalikan akan menunjuk ke token untuk reservasi port persisten untuk blok port TCP. Perhatikan bahwa token untuk reservasi persisten tertentu untuk blok port TCP dapat berubah setiap kali sistem dimulai ulang.
Aplikasi dapat meminta penetapan port dari reservasi port TCP dengan membuka soket TCP, lalu memanggil fungsi WSAIoctl yang menentukan SIO_ASSOCIATE_PORT_RESERVATION IOCTL dan meneruskan token reservasi sebelum mengeluarkan panggilan ke fungsi ikat pada soket.
Contoh
Contoh berikut mencari reservasi port TCP persisten lalu membuat soket dan mengalokasikan port dari reservasi port.
#ifndef UNICODE
#define UNICODE
#endif
#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif
#include <Windows.h.>
#include <winsock2.h>
#include <mstcpip.h>
#include <ws2ipdef.h>
#include <iphlpapi.h>
#include <stdio.h>
#include <stdlib.h>
// Need to link with iphlpapi.lib
#pragma comment(lib, "iphlpapi.lib")
// Need to link with Ws2_32.lib for Winsock functions
#pragma comment(lib, "ws2_32.lib")
int wmain(int argc, WCHAR **argv) {
// Declare and initialize variables
int startPort = 0; // host byte order
int numPorts = 0;
USHORT startPortns = 0; // Network byte order
ULONG64 resToken = {0};
unsigned long status = 0;
WSADATA wsaData = { 0 };
int iResult = 0;
SOCKET sock = INVALID_SOCKET;
int iFamily = AF_INET;
int iType = SOCK_STREAM;
int iProtocol = IPPROTO_TCP;
DWORD bytesReturned = 0;
// Note that the sockaddr_in struct works only with AF_INET not AF_INET6
// An application needs to use the sockaddr_in6 for AF_INET6
sockaddr_in service;
sockaddr_in sockName;
int nameLen = sizeof(sockName);
// Validate the parameters
if (argc != 3) {
wprintf(L"usage: %s <Starting Port> <Number of Ports>\n",
argv[0]);
wprintf(L"Look up a persistent TCP port reservation\n");
wprintf(L"Example usage:\n");
wprintf(L" %s 5000 20\n", argv[0]);
wprintf(L" where StartPort=5000 NumPorts=20");
return 1;
}
startPort = _wtoi(argv[1]);
if ( startPort < 0 || startPort> 65535) {
wprintf(L"Starting point must be either 0 or between 1 and 65,535\n");
return 1;
}
startPortns = htons((USHORT) startPort);
numPorts = _wtoi(argv[2]);
if (numPorts < 0) {
wprintf(L"Number of ports must be a positive number\n");
return 1;
}
status = LookupPersistentTcpPortReservation((USHORT) startPortns, (USHORT) numPorts, &resToken);
if( status != NO_ERROR )
{
wprintf(L"LookupPersistentTcpPortReservation returned error: %ld\n",
status);
return 1;
}
wprintf(L"LookupPersistentTcpPortReservation call succeeded\n");
wprintf(L" Token = %I64d\n", resToken);
// Comment out this block if you don't want to create a socket and associate it with the
// persistent reservation
// Initialize Winsock
iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
if (iResult != 0) {
wprintf(L"WSAStartup failed with error = %d\n", iResult);
return 1;
}
sock = socket(iFamily, iType, iProtocol);
if (sock == INVALID_SOCKET)
wprintf(L"socket function failed with error = %d\n", WSAGetLastError());
else {
wprintf(L"socket function succeeded\n");
iResult =
WSAIoctl(sock, SIO_ASSOCIATE_PORT_RESERVATION, (LPVOID) & resToken,
sizeof (ULONG64), NULL, 0, &bytesReturned, NULL, NULL);
if (iResult != 0) {
wprintf
(L"WSAIoctl(SIO_ASSOCIATE_PORT_RESERVATION) failed with error = %d\n",
WSAGetLastError());
} else {
wprintf(L"WSAIoctl(SIO_ASSOCIATE_PORT_RESERVATION) succeeded, bytesReturned = %u\n",
bytesReturned);
service.sin_family = AF_INET;
service.sin_addr.s_addr = INADDR_ANY;
service.sin_port = 0;
iResult = bind(sock, (SOCKADDR*) &service, sizeof(service) );
if (iResult == SOCKET_ERROR)
wprintf(L"bind failed with error = %d\n", WSAGetLastError());
else {
wprintf(L"bind succeeded\n");
iResult = getsockname(sock, (SOCKADDR*) &sockName, &nameLen);
if (iResult == SOCKET_ERROR)
wprintf(L"getsockname failed with error = %d\n", WSAGetLastError() );
else {
wprintf(L"getsockname succeeded\n");
wprintf(L"Port number allocated = %u\n", ntohs(sockName.sin_port) );
}
}
}
if (sock != INVALID_SOCKET) {
iResult = closesocket(sock);
if (iResult == SOCKET_ERROR) {
wprintf(L"closesocket failed with error = %d\n", WSAGetLastError());
}
}
}
WSACleanup();
return 0;
}
Persyaratan
Persyaratan | Nilai |
---|---|
Klien minimum yang didukung | Windows Vista [hanya aplikasi desktop] |
Server minimum yang didukung | Windows Server 2008 [hanya aplikasi desktop] |
Target Platform | Windows |
Header | iphlpapi.h |
Pustaka | Iphlpapi.lib |
DLL | Iphlpapi.dll |
Lihat juga
CreatePersistentTcpPortReservation
CreatePersistentUdpPortReservation
DeletePersistentTcpPortReservation
DeletePersistentUdpPortReservation