Fungsi WSADuplicateSocketA (winsock2.h)
Fungsi WSADuplicateSocket mengembalikan struktur WSAPROTOCOL_INFO yang dapat digunakan untuk membuat deskriptor soket baru untuk soket bersama. Fungsi WSADuplicateSocket tidak dapat digunakan pada soket berkemampuan QOS.
Sintaks
int WSAAPI WSADuplicateSocketA(
[in] SOCKET s,
[in] DWORD dwProcessId,
[out] LPWSAPROTOCOL_INFOA lpProtocolInfo
);
Parameter
[in] s
Deskriptor mengidentifikasi soket lokal.
[in] dwProcessId
Pengidentifikasi proses proses target tempat soket duplikat akan digunakan.
[out] lpProtocolInfo
Pointer ke buffer, dialokasikan oleh klien, yang cukup besar untuk berisi struktur WSAPROTOCOL_INFO . Penyedia layanan menyalin isi struktur informasi protokol ke buffer ini.
Mengembalikan nilai
Jika tidak ada kesalahan yang terjadi, WSADuplicateSocket mengembalikan nol. Jika tidak, nilai SOCKET_ERROR dikembalikan, dan kode kesalahan tertentu dapat diambil dengan memanggil WSAGetLastError.
Kode kesalahan | Makna |
---|---|
Panggilan WSAStartup yang berhasil harus terjadi sebelum menggunakan fungsi ini. | |
Subsistem jaringan gagal. | |
Menunjukkan bahwa salah satu parameter yang ditentukan tidak valid. | |
Pemblokiran panggilan Windows Sockets 1.1 sedang berlangsung, atau penyedia layanan masih memproses fungsi panggilan balik. | |
Tidak ada lagi deskriptor soket yang tersedia. | |
Tidak ada ruang buffer yang tersedia. Soket tidak dapat dibuat. | |
Deskriptor bukan soket. | |
Parameter lpProtocolInfo bukan bagian yang valid dari ruang alamat pengguna. |
Keterangan
Fungsi WSADuplicateSocket digunakan untuk mengaktifkan berbagi soket antar proses. Proses sumber memanggil WSADuplicateSocket untuk mendapatkan struktur WSAPROTOCOL_INFO khusus. Ini menggunakan beberapa mekanisme komunikasi antarproses (IPC) untuk meneruskan isi struktur ini ke proses target, yang pada gilirannya menggunakannya dalam panggilan ke WSASocket untuk mendapatkan deskriptor untuk soket duplikat. Struktur WSAPROTOCOL_INFO khusus hanya dapat digunakan sekali oleh proses target.
Soket dapat dibagikan di antara utas dalam proses tertentu tanpa menggunakan fungsi WSADuplicateSocket karena deskriptor soket valid di semua utas proses.
Salah satu skenario yang mungkin untuk membuat dan menyerahkan soket bersama diilustrasikan dalam tabel berikut.
Proses sumber | IPC | Proses tujuan |
---|---|---|
1) WSASocket, WSAConnect | ||
2) Meminta pengidentifikasi proses target | ==> | |
3) Menerima permintaan pengidentifikasi proses dan merespons | ||
4) Menerima pengidentifikasi proses | <== | |
5) Panggil WSADuplicateSocket untuk mendapatkan struktur WSAPROTOCOL_INFO khusus | ||
6) Kirim struktur WSAPROTOCOL_INFO ke target | ||
==> | 7) Menerima struktur WSAPROTOCOL_INFO | |
8) Panggil WSASocket untuk membuat deskriptor soket bersama. | ||
9) Gunakan soket bersama untuk pertukaran data | ||
10) closesocket | <== |
Deskriptor yang mereferensikan soket bersama dapat digunakan secara independen untuk 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. Soket bersama biasanya digunakan untuk memiliki satu proses yang bertanggung jawab untuk membuat soket dan membangun koneksi, dan proses lain yang bertanggung jawab atas pertukaran informasi.
Semua informasi status yang terkait dengan soket disimpan secara umum di semua deskriptor karena deskriptor soket diduplikasi dan bukan soket yang sebenarnya. Misalnya, operasi setsockopt yang dilakukan menggunakan satu deskriptor kemudian terlihat menggunakan getsockopt dari salah satu atau semua deskriptor. Baik proses sumber maupun proses tujuan harus meneruskan bendera yang sama ke panggilan fungsi WSASocket masing-masing. Jika proses sumber menggunakan fungsi soket untuk membuat soket, proses tujuan harus meneruskan bendera WSA_FLAG_OVERLAPPED ke panggilan fungsi WSASocket-nya . Proses dapat memanggil closesocket pada soket duplikat dan deskriptor akan dibatalkan alokasinya. Namun, soket yang mendasar akan tetap terbuka sampai closesocket dipanggil oleh deskriptor terakhir yang tersisa.
Pemberitahuan pada soket bersama tunduk pada batasan WSAAsyncSelect dan WSAEventSelect yang biasa. 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. Dengan demikian, soket bersama tidak dapat mengirimkan peristiwa FD_READ untuk memproses peristiwa A dan FD_WRITE untuk memproses B. Untuk situasi ketika koordinasi yang ketat diperlukan, pengembang akan disarankan untuk menggunakan utas alih-alih proses terpisah.
Windows 8.1 dan Windows Server 2012 R2: Fungsi WSADuplicateSocketW didukung untuk aplikasi Windows Store di Windows 8.1, Windows Server 2012 R2, dan yang lebih baru.
Catatan
Header winsock2.h mendefinisikan WSADuplicateSocket sebagai alias yang secara otomatis memilih versi ANSI atau Unicode dari fungsi ini berdasarkan definisi konstanta praprosem UNICODE. Mencampur penggunaan alias encoding-netral dengan kode yang tidak mengodekan-netral dapat menyebabkan ketidakcocokan yang mengakibatkan kesalahan kompilasi atau runtime. Untuk informasi selengkapnya, lihat Konvensi untuk Prototipe Fungsi.
Persyaratan
Klien minimum yang didukung | Windows 8.1, Windows Vista [aplikasi desktop | Aplikasi UWP] |
Server minimum yang didukung | Windows Server 2003 [aplikasi desktop | Aplikasi UWP] |
Target Platform | Windows |
Header | winsock2.h |
Pustaka | Ws2_32.lib |
DLL | Ws2_32.dll |