Bagikan melalui


Fungsi panggilan balik LPWSPDUPLICATESOCKET (ws2spi.h)

Fungsi LPWSPDuplicateSocket mengembalikan struktur WSAPROTOCOL_INFO yang dapat digunakan untuk membuat deskriptor soket baru untuk soket bersama.

Sintaksis

LPWSPDUPLICATESOCKET Lpwspduplicatesocket;

int Lpwspduplicatesocket(
  [in]  SOCKET s,
  [in]  DWORD dwProcessId,
  [out] LPWSAPROTOCOL_INFOW lpProtocolInfo,
  [out] LPINT lpErrno
)
{...}

Parameter

[in] s

Deskriptor soket lokal.

[in] dwProcessId

Pengidentifikasi proses target tempat soket bersama akan digunakan.

[out] lpProtocolInfo

Pointer ke buffer yang dialokasikan oleh klien yang cukup besar untuk berisi struktur WSAPROTOCOL_INFO. Penyedia layanan menyalin konten struktur informasi protokol ke buffer ini.

[out] lpErrno

Penunjuk ke kode kesalahan.

Mengembalikan nilai

Jika tidak ada kesalahan yang terjadi, LPWSPDuplicateSocket mengembalikan nol. Jika tidak, nilai SOCKET_ERROR dikembalikan, dan nomor kesalahan tertentu tersedia di lpErrno.

Kode Kesalahan Arti
WSAENETDOWN
Subsistem jaringan gagal.
WSAEINVAL
Menunjukkan bahwa salah satu parameter yang ditentukan tidak valid.
WSAEINPROGRESS
Pemblokiran panggilan Windows Sockets sedang berlangsung atau penyedia layanan masih memproses fungsi panggilan balik.
WSAEMFILE
Tidak ada lagi deskriptor soket yang tersedia.
WSAENOBUFS
Tidak ada ruang buffer yang tersedia. Soket tidak dapat dibuat.
WSAENOTSOCK
Deskriptor bukan soket.

Komentar

Proses sumber memanggil LPWSPDuplicateSocket untuk mendapatkan struktur WSAPROTOCOL_INFO khusus. Ini menggunakan beberapa mekanisme komunikasi antarproses (IPC) untuk meneruskan konten struktur ini ke proses target, yang pada gilirannya menggunakannya dalam panggilan ke LPWSPSocket untuk mendapatkan deskriptor untuk soket duplikat. Perhatikan bahwa struktur WSAPROTOCOL_INFO khusus hanya dapat digunakan sekali oleh proses target.

Penyedia layanan bertanggung jawab untuk melakukan operasi apa pun yang diperlukan dalam konteks proses sumber dan untuk membuat struktur WSAPROTOCOL_INFO yang akan dikenali ketika kemudian muncul sebagai parameter untuk LPWSPSocket dalam konteks proses target. Penyedia kemudian harus mengembalikan deskriptor soket yang mereferensikan soket umum yang mendasar. dwProviderReserved anggota struktur WSAPROTOCOL_INFO tersedia untuk penggunaan penyedia layanan dan dapat digunakan untuk menyimpan informasi konteks yang berguna, termasuk handel duplikat.

Ketika deskriptor soket baru dialokasikan, penyedia sistem file (IFS) yang dapat diinstal harus memanggil WPUModifyIFSHandle, dan penyedia non-IFS harus memanggil WPUCreateSocketHandle. Penyedia IFS dapat menggunakan fungsi DuplicateHandle. Untuk memastikan eksekusi duplikasi soket yang tepat, penyedia layanan non-IFS harus menggunakan fungsi LPWSPDuplicateSocket.

Salah satu skenario yang mungkin untuk membuat dan menggunakan soket bersama dalam mode handoff diilustrasikan dalam hal berikut.

Proses sumber IPC Arti
1) LPWSPSocket, LPWSPConnect
2) Meminta pengidentifikasi proses target.
==>
3) Menerima permintaan pengidentifikasi proses dan merespons.
4) Menerima pengidentifikasi proses.
<==
5) Memanggil **LPWSPDuplicateSocket** untuk mendapatkan struktur WSAPROTOCOL_INFO khusus.
6) Mengirim struktur WSAPROTOCOL_INFO ke target.
==> 7) Menerima struktur WSAPROTOCOL_INFO.
8) Memanggil LPWSPSocket untuk membuat deskriptor soket bersama.
9) Menggunakan soket bersama untuk pertukaran data.
10) LPWSPCloseSocket
<==

Deskriptor yang mereferensikan soket bersama dapat digunakan secara independen sejauh yang bersangkutan dengan I/O. Namun, antarmuka Windows Sockets tidak menerapkan jenis kontrol akses apa pun, sehingga terserah proses yang terlibat untuk mengoordinasikan operasi mereka pada soket bersama. Penggunaan umum untuk soket bersama adalah memiliki satu proses yang bertanggung jawab untuk membuat soket dan membuat koneksi, menyerahkan soket ke proses lain yang bertanggung jawab atas pertukaran informasi.

Karena yang diduplikasi adalah deskriptor soket dan bukan soket yang mendasar, semua status yang terkait dengan soket diadakan secara umum di semua deskriptor. Misalnya operasi WSPSetSockOpt yang dilakukan menggunakan satu deskriptor kemudian terlihat menggunakan LPWSPGetSockopt dari salah satu atau semua deskriptor. Proses dapat memanggil LPWSPCloseSocket pada soket duplikat dan deskriptor akan dibatalkan alokasinya. Soket yang mendasar, bagaimanapun, akan tetap terbuka sampai LPWSPClosesocket dipanggil oleh deskriptor terakhir yang tersisa.

Pemberitahuan pada soket bersama tunduk pada batasan LPWSPAsyncSelect dan LPWSPEventSelect. Mengeluarkan salah satu panggilan ini menggunakan salah satu deskriptor bersama membatalkan pendaftaran peristiwa sebelumnya untuk soket, terlepas dari deskriptor mana yang digunakan untuk melakukan pendaftaran tersebut. Jadi, misalnya, soket bersama tidak dapat mengirimkan peristiwa FD_READ untuk memproses A dan FD_WRITE peristiwa untuk memproses B. Untuk situasi ketika koordinasi yang ketat diperlukan, disarankan agar pengembang menggunakan utas alih-alih proses terpisah.

Penyedia layanan berlapis menyediakan implementasi fungsi ini, tetapi juga merupakan klien dari fungsi ini jika dan ketika memanggil LPWSPDuplicateSocket lapisan berikutnya dalam rantai protokol. Beberapa pertimbangan khusus berlaku untuk parameter lpProtocolInfo fungsi ini karena disebarkan ke bawah melalui lapisan rantai protokol.

Jika lapisan berikutnya dalam rantai protokol adalah lapisan lain maka ketika lapisan berikutnya LPWSPDuplicateSocket dipanggil, lapisan ini harus meneruskan ke lapisan berikutnya lpProtocolInfo yang mereferensikan struktur WSAPROTOCOL_INFO yang tidak dimodifikasi yang sama dengan informasi rantai yang sama. Namun, jika lapisan berikutnya adalah protokol dasar (yaitu, elemen terakhir dalam rantai), lapisan ini melakukan penggantian saat memanggil penyedia dasar LPWSPDuplicateSocket. Dalam hal ini, struktur WSAPROTOCOL_INFO penyedia dasar harus dirujuk oleh parameter lpProtocolInfo .

Salah satu manfaat penting dari kebijakan ini adalah bahwa penyedia layanan dasar tidak perlu menyadari rantai protokol. Kebijakan yang sama ini berlaku saat menyebarkan struktur WSAPROTOCOL_INFO melalui urutan berlapis fungsi lain seperti LPWSPAddressToString, WSPStartup, LPWSPSocket, , atau LPWSPStringToAddress.

Persyaratan

Syarat Nilai
klien minimum yang didukung Windows 2000 Professional [hanya aplikasi desktop]
server minimum yang didukung Windows 2000 Server [hanya aplikasi desktop]
Header ws2spi.h

Lihat juga

WPUCreateSocketHandle

WPUModifyIFSHandle