Bagikan melalui


Soket Bersama

Fungsi WSADuplicateSocket diperkenalkan untuk mengaktifkan berbagi soket di seluruh proses. Proses sumber memanggil WSADuplicateSocket untuk mendapatkan struktur WSAPROTOCOL_INFO khusus untuk pengidentifikasi proses target. Ini menggunakan beberapa mekanisme komunikasi antarproses (IPC) untuk meneruskan konten struktur ini ke proses target. Proses target kemudian menggunakan struktur WSAPROTOCOL_INFO dalam panggilan ke WSPSocket. Deskriptor soket yang dikembalikan oleh fungsi ini akan menjadi deskriptor soket tambahan ke soket yang mendasar yang dengan demikian dibagikan. Soket dapat dibagikan di antara utas dalam proses tertentu tanpa menggunakan fungsi WSADuplicateSocket karena deskriptor soket valid di semua utas proses.

Dua deskriptor (atau lebih) yang mereferensikan soket bersama dapat digunakan secara independen sejauh menyangkut I/O. Namun, antarmuka Winsock tidak menerapkan jenis kontrol akses apa pun, sehingga proses harus mengoordinasikan operasi apa pun pada soket bersama. Contoh umum berbagi soket adalah menggunakan satu proses untuk membuat soket dan membuat koneksi. Proses ini kemudian menyerahkan soket ke proses lain yang bertanggung jawab atas pertukaran informasi.

Fungsi WSADuplicateSocket membuat deskriptor soket dan bukan soket yang mendasar. Akibatnya, semua status yang terkait dengan soket diadakan secara umum di semua deskriptor. Misalnya, operasi setsockopt yang dilakukan menggunakan satu deskriptor kemudian terlihat menggunakan getsockopt dari salah satu atau semua deskriptor. Proses dapat memanggil closesocket pada soket duplikat dan deskriptor akan dibatalkan alokasinya. Namun, soket yang mendasar tetap terbuka sampai closesocket dipanggil dengan deskriptor terakhir yang tersisa.

Pemberitahuan pada soket bersama tunduk pada batasan fungsi 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, misalnya, tidak mungkin untuk memiliki proses A menerima peristiwa FD_READ dan proses B menerima peristiwa FD_WRITE. Untuk situasi ketika koordinasi yang ketat diperlukan, disarankan agar pengembang menggunakan utas alih-alih proses terpisah.