Inisialisasi

Ws2_32.dll memuat DLL antarmuka penyedia layanan ke dalam sistem dengan menggunakan mekanisme pemuatan pustaka dinamis Microsoft Windows standar, dan menginisialisasinya dengan memanggil WSPStartup. Ini biasanya dipicu oleh panggilan aplikasi baik soket atau WSASocket untuk membuat soket baru yang akan dikaitkan dengan penyedia layanan yang DLL antarmukanya saat ini tidak dimuat ke dalam memori. Jalur ke DLL antarmuka setiap penyedia layanan disimpan oleh Ws2_32.dll pada saat penyedia layanan sedang diinstal. Lihat Penginstalan dan Konfigurasi untuk informasi selengkapnya.

Seiring waktu, versi yang berbeda mungkin ada untuk DLL Winsock, aplikasi, dan penyedia layanan. Versi baru dapat menentukan fitur baru dan parameter baru ke struktur data dan parameter bit, dll. Oleh karena itu, nomor versi menunjukkan cara menginterpretasikan berbagai struktur data.

Untuk memungkinkan pencampuran dan pencocokan yang optimal dari berbagai versi aplikasi, versi Ws2_32.dll itu sendiri, dan versi penyedia layanan oleh vendor yang berbeda, SPI menyediakan mekanisme negosiasi versi untuk digunakan antara Ws2_32.dll dan penyedia layanan. Negosiasi versi ini ditangani oleh WSPStartup. Pada dasarnya, Ws2_32.dll meneruskan ke penyedia layanan nomor versi tertinggi yang kompatibel dengannya. Penyedia layanan membandingkan ini dengan rentang nomor versi yang didukung sendiri. Jika rentang ini tumpang tindih, penyedia layanan mengembalikan nilai dalam bagian rentang yang tumpang tindih sebagai hasil dari negosiasi. Biasanya, ini harus menjadi nilai setingkat mungkin. Jika rentang tidak tumpang tindih, kedua belah pihak tidak kompatibel dan fungsi mengembalikan kesalahan.

WSPStartup harus dipanggil setidaknya sekali oleh setiap proses klien, dan dapat dipanggil beberapa kali oleh Ws2_32.dll atau entitas lainnya. WSPCleanupyang cocok harus dipanggil untuk setiap panggilan WSPStartup yang berhasil. Penyedia layanan harus mempertahankan jumlah referensi berdasarkan per proses. Pada setiap panggilan WSPStartup, pemanggil dapat menentukan nomor versi apa pun yang didukung oleh DLL SP.

Penyedia layanan harus menyimpan pointer ke tabel pengiriman huruf besar klien yang diterima sebagai parameter WSPStartup berdasarkan per proses. Jika proses tertentu memanggil WSPStartup beberapa kali, penyedia layanan hanya harus menggunakan penunjuk tabel pengiriman yang terakhir disediakan.

Sebagai bagian dari proses inisialisasi penyedia layanan Ws2_32.dll mengambil tabel pengiriman penyedia layanan melalui parameter lpProcTable untuk mendapatkan titik masuk ke fungsi SPI lainnya yang ditentukan dalam dokumen ini.

Menggunakan tabel pengiriman (dibandingkan dengan mekanisme DLL biasa untuk mengakses titik masuk) melayani dua tujuan:

  • Lebih nyaman untuk Ws2_32.dll karena satu panggilan dapat dilakukan untuk menemukan seluruh set titik masuk.
  • Ini memungkinkan penyedia layanan berlapis yang dibentuk menjadi rantai protokol untuk beroperasi lebih efisien.

Menginisialisasi Rantai Protokol

Pada saat struktur WSAPROTOCOL_INFO untuk rantai protokol diinstal, jalur ke penyedia berlapis pertama dalam rantai juga ditentukan. Ketika rantai protokol diinisialisasi, Ws2_32.dll menggunakan jalur ini untuk memuat DLL penyedia dan kemudian memanggil WSPStartup. Karena WSPStartup menyertakan penunjuk ke struktur WSAPROTOCOL_INFO rantai sebagai salah satu parameternya, penyedia berlapis dapat menentukan jenis rantai apa yang diinisialisasi, dan identitas lapisan bawah berikutnya dalam rantai. Penyedia berlapis kemudian akan memuat penyedia protokol berikutnya dalam rantai dan menginisialisasinya dengan panggilan ke WSPStartup, dan sebagainya. Setiap kali lapisan bawah berikutnya adalah penyedia berlapis lainnya, struktur WSAPROTOCOL_INFO rantai harus direferensikan dalam panggilan WSPStartup. Ketika lapisan bawah berikutnya adalah protokol dasar (menandakan akhir rantai), struktur WSAPROTOCOL_INFO rantai tidak lagi disebarkan ke bawah. Sebaliknya, lapisan saat ini harus mereferensikan struktur WSAPROTOCOL_INFO yang sesuai dengan protokol yang harus digunakan penyedia dasar. Dengan demikian, penyedia dasar tidak memiliki gagasan untuk terlibat dalam rantai protokol.

Tabel pengiriman yang disediakan oleh penyedia berlapis tertentu akan, dalam banyak instans, menduplikasi titik masuk penyedia yang mendasar. Penyedia berlapis hanya akan memasukkan titik masuknya sendiri untuk fungsi yang perlu terlibat langsung. Perhatikan, bagaimanapun, bahwa sangat penting bahwa penyedia berlapis tidak memodifikasi konten tabel upcall yang diterimanya saat memanggil WSPStartup pada lapisan bawah berikutnya dalam rantai protokol. Upcall ini harus dibuat langsung ke Windows Sockets 2 DLL.