Bagikan melalui


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
WSANOTINITIALISED
Panggilan WSAStartup yang berhasil harus terjadi sebelum menggunakan fungsi ini.
WSAENETDOWN
Subsistem jaringan gagal.
WSAEINVAL
Menunjukkan bahwa salah satu parameter yang ditentukan tidak valid.
WSAEINPROGRESS
Pemblokiran panggilan Windows Sockets 1.1 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.
WSAEFAULT
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

Lihat juga

WSASocket

Fungsi Winsock

Referensi Winsock