Bagikan melalui


Kode Kontrol SIO_ASSOCIATE_PORT_RESERVATION

Deskripsi

Kode kontrol SIO_ASSOCIATE_PORT_RESERVATION mengaitkan soket dengan reservasi persisten atau runtime untuk blok TCP atau UDP yang diidentifikasi oleh token reservasi port. IOCTL ini harus dikeluarkan sebelum soket terikat. Jika dan ketika soket terikat, port yang ditetapkan untuknya akan dipilih dari reservasi port yang diidentifikasi oleh token yang diberikan. Jika tidak ada port yang tersedia dari reservasi yang ditentukan, panggilan fungsi ikatan akan gagal.

Untuk melakukan operasi ini, panggil fungsi WSAIoctl atau WSPIoctl dengan parameter berikut.

int WSAIoctl(
  (socket) s,             // descriptor identifying a socket
  SIO_ASSOCIATE_PORT_RESERVATION, // dwIoControlCode
  (LPVOID) lpvInBuffer,  // pointer to an INET_PORT_RESERVATION_TOKEN
  (DWORD) cbInBuffer,    // size, in bytes, of the input buffer
  NULL,           // lpvOutBuffer is a pointer to the output buffer
  0,              // cbOutBuffer is the size, in bytes, of the output buffer
  (LPDWORD) lpcbBytesReturned,    // number of bytes returned
  (LPWSAOVERLAPPED) lpOverlapped,   // OVERLAPPED structure
  (LPWSAOVERLAPPED_COMPLETION_ROUTINE) lpCompletionRoutine,  // completion routine
);
int WSPIoctl(
  (socket) s,             // descriptor identifying a socket
  SIO_ASSOCIATE_PORT_RESERVATION, // dwIoControlCode
  (LPVOID) lpvInBuffer,  // pointer to an INET_PORT_RESERVATION_TOKEN
  (DWORD) cbInBuffer,    // size, in bytes, of the input buffer
  NULL,           // lpvOutBuffer is a pointer to the output buffer
  0,              // cbOutBuffer is the size, in bytes, of the output buffer
  (LPDWORD) lpcbBytesReturned,    // number of bytes returned
  (LPWSAOVERLAPPED) lpOverlapped,   // OVERLAPPED structure
  (LPWSAOVERLAPPED_COMPLETION_ROUTINE) lpCompletionRoutine,  // completion routine
  (LPWSATHREADID) lpThreadId,   // a WSATHREADID structure
  (LPINT) lpErrno   // a pointer to the error code.
);

Parameter

s

Deskriptor yang mengidentifikasi soket.

dwIoControlCode

Kode kontrol untuk operasi. Gunakan SIO_ASSOCIATE_PORT_RESERVATION untuk operasi ini.

lpvInBuffer

Penunjuk ke buffer input. Parameter ini berisi pointer ke struktur INET_PORT_RESERVATION_TOKEN dengan token untuk reservasi port TCP atau UDP untuk dikaitkan dengan soket.

cbInBuffer

Ukuran, dalam byte, dari buffer input. Parameter ini harus setidaknya ukuran struktur INET_PORT_RESERVATION_TOKEN .

lpvOutBuffer

Penunjuk ke buffer output. Parameter ini tidak digunakan untuk operasi ini.

cbOutBuffer

Ukuran, dalam byte, dari buffer output. Parameter ini harus diatur ke nol.

lpcbBytesReturned

Penunjuk ke variabel yang menerima ukuran, dalam byte, dari data yang disimpan dalam buffer output.

Jika buffer output terlalu kecil, panggilan gagal, WSAGetLastError mengembalikan WSAEINVAL, dan parameter lpcbBytesReturned menunjuk ke nilai DWORD nol.

Jika lpOverlapped adalah NULL, nilai DWORD yang diarahkan oleh parameter lpcbBytesReturned yang dikembalikan pada panggilan yang berhasil tidak boleh nol.

Jika parameter lpOverlapped bukan NULL untuk soket yang tumpang tindih, operasi yang tidak dapat segera diselesaikan akan dimulai, dan penyelesaian akan ditunjukkan di lain waktu. Nilai DWORD yang ditunjukkan oleh parameter lpcbBytesReturned yang dikembalikan mungkin nol karena ukuran data yang disimpan tidak dapat ditentukan sampai operasi yang tumpang tindih selesai. Status penyelesaian akhir dapat diambil ketika metode penyelesaian yang sesuai disinyalir ketika operasi telah selesai.

lpvOverlapped

Penunjuk ke struktur WSAOVERLAPPED .

Jika soket dibuat tanpa atribut yang tumpang tindih, parameter lpOverlapped diabaikan.

Jika s dibuka dengan atribut yang tumpang tindih dan parameter lpOverlapped bukan NULL, operasi dilakukan sebagai operasi yang tumpang tindih (asinkron). Dalam hal ini, parameter lpOverlapped harus menunjuk ke struktur WSAOVERLAPPED yang valid.

Untuk operasi yang tumpang tindih, fungsi WSAIoctl atau WSPIoctl segera kembali, dan metode penyelesaian yang sesuai disinyalir ketika operasi telah selesai. Jika tidak, fungsi tidak kembali sampai operasi selesai atau terjadi kesalahan.

lpCompletionRoutine

Jenis: LPWSAOVERLAPPED_COMPLETION_ROUTINE _In_opt_

Penunjuk ke rutinitas penyelesaian yang dipanggil ketika operasi telah selesai (diabaikan untuk soket yang tidak tumpang tindih).

lpThreadId

Penunjuk ke struktur WSATHREADID yang akan digunakan oleh penyedia dalam panggilan berikutnya ke WPUQueueApc. Penyedia harus menyimpan struktur WSATHREADID yang direferensikan (bukan penunjuk ke yang sama) sampai setelah fungsi WPUQueueApc kembali.

Catatan Parameter ini hanya berlaku untuk fungsi WSPIoctl .

lpErrno

Penunjuk ke kode kesalahan.

Catatan Parameter ini hanya berlaku untuk fungsi WSPIoctl .

Nilai kembali

Jika operasi berhasil diselesaikan, fungsi WSAIoctl atau WSPIoctl mengembalikan nol.

Jika operasi gagal atau tertunda, fungsi WSAIoctl atau WSPIoctl mengembalikan SOCKET_ERROR. Untuk mendapatkan informasi kesalahan yang diperluas, panggil WSAGetLastError.

Kode kesalahan Makna
WSA_IO_PENDING Operasi I/O yang tumpang tindih sedang berlangsung. Nilai ini dikembalikan jika operasi yang tumpang tindih berhasil dimulai dan penyelesaian akan ditunjukkan di lain waktu.
WSA_OPERATION_ABORTED Operasi I/O telah dibatalkan karena keluarnya utas atau permintaan aplikasi. Kesalahan ini dikembalikan jika operasi yang tumpang tindih dibatalkan karena penutupan soket atau eksekusi perintah SIO_FLUSH IOCTL .
WSAEACCES Upaya dilakukan untuk mengakses soket dengan cara yang dilarang oleh izin aksesnya. Kesalahan ini dikembalikan dalam beberapa kondisi untuk reservasi port persisten yang mencakup hal berikut: pengguna tidak memiliki hak istimewa administratif yang diperlukan di komputer lokal atau aplikasi tidak berjalan dalam shell yang ditingkatkan sebagai Administrator bawaan (RunAs administrator).
WSAEFAULT Sistem mendeteksi alamat penunjuk yang tidak valid dalam mencoba menggunakan argumen penunjuk dalam panggilan. Kesalahan ini dikembalikan dari parameter lpvInBuffer, lpvoutBuffer, lpcbBytesReturned, lpOverlapped atau lpCompletionRoutine tidak sepenuhnya terkandung dalam bagian ruang alamat pengguna yang valid.
WSAEINPROGRESS Operasi pemblokiran saat ini sedang dijalankan. Kesalahan ini dikembalikan jika fungsi dipanggil saat panggilan balik sedang berlangsung.
WSAEINTR Operasi pemblokiran terganggu oleh panggilan ke WSACancelBlockingCall. Kesalahan ini dikembalikan jika operasi pemblokiran terganggu.
WSAEINVAL Argumen yang tidak valid disediakan. Kesalahan ini dikembalikan jika parameter dwIoControlCode bukan perintah yang valid, atau parameter input tertentu tidak dapat diterima, atau perintah tidak berlaku untuk jenis soket yang ditentukan.
WSAENETDOWN Operasi soket mengalami jaringan mati. Kesalahan ini dikembalikan jika subsistem jaringan gagal.
WSAENOTSOCK Operasi dicoba pada sesuatu yang bukan soket. Kesalahan ini dikembalikan jika deskriptor bukan soket.
WSAEOPNOTSUPP Operasi yang dicoba tidak didukung untuk jenis objek yang direferensikan. Kesalahan ini dikembalikan jika perintah IOCTL yang ditentukan tidak didukung. Kesalahan ini juga dikembalikan jika SIO_ASSOCIATE_PORT_RESERVATION IOCTL tidak didukung oleh penyedia transportasi. Kesalahan ini juga dikembalikan ketika upaya untuk menggunakan SIO_ASSOCIATE_PORT_RESERVATION IOCTL dibuat pada soket selain UDP atau TCP.

Keterangan

IOCTL SIO_ASSOCIATE_PORT_RESERVATION didukung pada Windows Vista dan versi sistem operasi yang lebih baru.

Aplikasi dan layanan yang perlu memesan port termasuk dalam dua kategori. Kategori pertama mencakup komponen yang membutuhkan port tertentu sebagai bagian dari operasinya. Komponen tersebut umumnya akan lebih suka menentukan port yang diperlukan pada waktu penginstalan (dalam manifes aplikasi, misalnya). Kategori kedua mencakup komponen yang memerlukan port atau blok port yang tersedia saat runtime. Kedua kategori ini sesuai dengan permintaan reservasi port khusus dan kartubebas. Permintaan reservasi tertentu mungkin persisten atau runtime, sementara permintaan reservasi port wildcard hanya didukung pada runtime.

IOCTL SIO_ASSOCIATE_PORT_RESERVATION digunakan untuk mengaitkan reservasi port TCP atau UDP dengan reservasi persisten atau runtime.

Fungsi CreatePersistentTcpPortReservation atau CreatePersistentUdpPortReservation menyediakan kemampuan bagi aplikasi atau layanan untuk memesan blok persisten port TCP atau UDP. Reservasi port persisten dicatat di penyimpanan persisten untuk modul TCP atau UDP di Windows. Perhatikan bahwa token untuk reservasi port persisten tertentu dapat berubah setiap kali sistem dimulai ulang.

Setelah reservasi port TCP atau UDP persisten diperoleh, aplikasi dapat meminta penetapan port dari reservasi port dengan membuka soket TCP atau UDP, lalu memanggil fungsi WSAIoctl yang menentukan SIO_ASSOCIATE_PORT_RESERVATION IOCTL dan meneruskan token reservasi sebelum mengeluarkan panggilan ke fungsi ikat pada soket.

IOCTL SIO_ACQUIRE_PORT_RESERVATION dapat digunakan untuk meminta reservasi runtime untuk blok port TCP atau UDP. Untuk reservasi port runtime, kumpulan port mengharuskan reservasi digunakan dari proses yang soketnya diberikan reservasi. Reservasi port runtime hanya berlangsung selama masa pakai soket tempat IOCTL SIO_ACQUIRE_PORT_RESERVATION dipanggil. Sebaliknya, reservasi port persisten yang dibuat menggunakan fungsi CreatePersistentTcpPortReservation atau CreatePersistentUdpPortReservation dapat dikonsumsi oleh proses apa pun dengan kemampuan untuk mendapatkan reservasi persisten.

Setelah reservasi port TCP atau UDP runtime diperoleh, aplikasi dapat meminta penetapan port dari reservasi port dengan membuka soket TCP atau UDP, lalu memanggil fungsi WSAIoctl yang menentukan SIO_ASSOCIATE_PORT_RESERVATION IOCTL dan meneruskan token reservasi sebelum mengeluarkan panggilan ke fungsi ikat pada soket.

Jika parameter lpOverlapped dan lpCompletionRoutine adalah NULL, soket dalam fungsi ini akan diperlakukan sebagai soket yang tidak tumpang tindih. Untuk parameter soket yang tidak tumpang tindih, lpOverlapped dan lpCompletionRoutine diabaikan, kecuali bahwa fungsi dapat memblokir jika soket dalam mode pemblokiran. Jika soket dalam mode non-pemblokiran, fungsi ini masih akan memblokir karena IOCTL khusus ini tidak mendukung mode non-pemblokiran.

Untuk soket yang tumpang tindih, operasi yang tidak dapat segera diselesaikan akan dimulai, dan penyelesaian akan ditunjukkan di lain waktu.

IOCTL apa pun dapat memblokir tanpa batas waktu, tergantung pada implementasi penyedia layanan. Jika aplikasi tidak dapat mentolerir pemblokiran dalam panggilan fungsi WSAIoctl atau WSPIoctl , I/O yang tumpang tindih akan disarankan untuk IOCTL yang kemungkinan besar akan diblokir.

IOCTL SIO_ASSOCIATE_PORT_RESERVATION dapat gagal dengan WSAEINTR atau WSA_OPERATION_ABORTED dalam kasus berikut:

  • Permintaan dibatalkan oleh Manajer I/O.
  • Soket ditutup.

SIO_ASSOCIATE_PORT_RESERVATION IOCTL yang diteruskan ke fungsi WSAIoctl atau WSPIoctl untuk reservasi port persisten hanya dapat digunakan dalam aplikasi ketika pengguna masuk sebagai anggota grup Administrator. Jika SIO_ASSOCIATE_PORT_RESERVATION IOCTL digunakan dalam aplikasi ketika pengguna bukan anggota grup Administrator, panggilan fungsi akan gagal dan WSAEACCES dikembalikan. Penggunaan SIO_ASSOCIATE_PORT_RESERVATION IOCTL juga dapat gagal karena kontrol akun pengguna (UAC) pada Windows Vista dan yang lebih baru. Jika aplikasi yang menggunakan IOCTL ini dengan reservasi port persisten dijalankan oleh pengguna yang masuk sebagai anggota grup Administrator selain Administrator bawaan, panggilan ini akan gagal kecuali aplikasi telah ditandai dalam file manifes dengan requestedExecutionLevel yang diatur ke requireAdministrator. Jika aplikasi tidak memiliki file manifes ini, pengguna yang masuk sebagai anggota grup Administrator selain Administrator bawaan kemudian harus menjalankan aplikasi dalam shell yang ditingkatkan sebagai Administrator bawaan (RunAs administrator) agar fungsi ini berhasil.

Lihat juga

Mengikat

CreatePersistentTcpPortReservation

CreatePersistentUdpPortReservation

DeletePersistentTcpPortReservation

DeletePersistentUdpPortReservation

INET_PORT_RESERVATION_TOKEN

LookupPersistentTcpPortReservation

LookupPersistentUdpPortReservation

SIO_ACQUIRE_PORT_RESERVATION

SIO_RELEASE_PORT_RESERVATION

soket

WSAGetLastError

WSAGetOverlappedResult

WSAIoctl

WSAOVERLAPPED

WSASocketA

WSASocketW