Bagikan melalui


Fungsi panggilan balik LPWSPACCEPT (ws2spi.h)

Fungsi LPWSPAccept secara kondisional menerima koneksi berdasarkan nilai pengembalian fungsi kondisi.

Sintaksis

LPWSPACCEPT Lpwspaccept;

SOCKET Lpwspaccept(
  [in]      SOCKET s,
  [out]     sockaddr *addr,
  [in, out] LPINT addrlen,
  [in]      LPCONDITIONPROC lpfnCondition,
  [in]      DWORD_PTR dwCallbackData,
  [out]     LPINT lpErrno
)
{...}

Parameter

[in] s

Deskriptor mengidentifikasi soket yang mendengarkan koneksi setelah LPWSPListen.

[out] addr

Penunjuk opsional ke buffer yang menerima alamat entitas penghubung, seperti yang diketahui oleh penyedia layanan. Format yang tepat dari parameter addr ditentukan oleh keluarga alamat yang ditetapkan ketika soket dalam struktur sockaddr dibuat.

[in, out] addrlen

Penunjuk opsional ke bilangan bulat yang berisi panjang parameter addr , dalam byte.

[in] lpfnCondition

Alamat instans prosedur dari fungsi kondisi opsional yang dilengkapi oleh Windows Sockets. Fungsi ini digunakan dalam keputusan terima atau tolak berdasarkan informasi pemanggil yang diteruskan sebagai parameter.

[in] dwCallbackData

Data panggilan balik yang akan diteruskan kembali ke klien Windows Socket 2 sebagai nilai parameter dwCallbackData fungsi kondisi. Parameter ini tidak ditafsirkan oleh penyedia layanan.

[out] lpErrno

Penunjuk ke kode kesalahan.

Mengembalikan nilai

Jika tidak ada kesalahan yang terjadi, LPWSPAccept mengembalikan nilai jenis SOCKET yang merupakan deskriptor untuk soket yang diterima. Jika tidak, nilai INVALID_SOCKET dikembalikan, dan kode kesalahan tertentu tersedia di lpErrno.

Kode Kesalahan Arti
WSAECONNREFUSED
Permintaan koneksi ditolak secara paksa seperti yang ditunjukkan dalam nilai pengembalian fungsi kondisi (CF_REJECT).
WSAECONNRESET
Koneksi masuk ditunjukkan, tetapi kemudian dihentikan oleh peer jarak jauh sebelum menerima panggilan.
WSAENETDOWN
Subsistem jaringan gagal.
WSAEFAULT
Parameter addrlen terlalu kecil atau parameter lpfnCondition bukan bagian dari ruang alamat pengguna.
WSAEINTR
Panggilan (pemblokiran) dibatalkan melalui LPWSPCancelBlockingCall.
WSAEINPROGRESS
Panggilan Windows Sockets pemblokiran sedang berlangsung.
WSAEINVAL
LPWSPListen tidak dipanggil sebelum LPWSPAccept, parameter g yang ditentukan dalam fungsi kondisi bukan nilai yang valid, nilai pengembalian fungsi kondisi bukan nilai yang valid, atau kasus apa pun di mana soket yang ditentukan berada dalam status tidak valid.
WSAEMFILE
Antrean tidak ada gunanya setelah masuk ke LPWSPAccept dan tidak ada deskriptor soket yang tersedia.
WSAENOBUFS
Tidak ada ruang buffer yang tersedia.
WSAENOTSOCK
Deskriptor bukan soket.
WSAEOPNOTSUPP
Soket yang direferensikan bukan jenis yang mendukung layanan berorientasi koneksi.
WSATRY_AGAIN
Penerimaan permintaan koneksi ditangguhkan seperti yang ditunjukkan dalam nilai pengembalian fungsi kondisi (CF_DEFER).
WSAEWOULDBLOCK
Soket ditandai sebagai tidak memblokir dan tidak ada koneksi yang akan diterima.
WSAEACCES
Permintaan koneksi yang ditawarkan telah kehabisan waktu atau ditarik.

Komentar

Fungsi LPWSPAccept mengekstrak koneksi pertama pada antrean koneksi yang tertunda pada soket s, dan memeriksanya terhadap fungsi kondisi, asalkan fungsi kondisi ditentukan (yaitu, bukan null). Fungsi kondisi harus dijalankan dalam utas yang sama dengan rutinitas ini. Jika fungsi kondisi mengembalikan CF_ACCEPT, LPWSPAccept membuat soket baru.

Soket yang baru dibuat memiliki properti yang sama dengan soket s, termasuk peristiwa jaringan yang terdaftar di LPWSPAsyncSelect atau dengan LPWSPEventSelect. Seperti yang dijelaskan dalamDescriptorAllocation , ketika deskriptor soket baru dialokasikan, penyedia IFS harus memanggil penyedia WPUModifyIFSHandle dan non-IFS harus memanggil WPUCreateSocketHandle.

Jika fungsi kondisi mengembalikan CF_REJECT, LPWSPAccept menolak permintaan koneksi. Jika keputusan terima/tolak aplikasi tidak dapat segera dibuat, fungsi kondisi akan mengembalikan CF_DEFER untuk menunjukkan bahwa tidak ada keputusan yang dibuat. Tidak ada tindakan tentang permintaan koneksi ini yang akan diambil oleh penyedia layanan. Ketika aplikasi siap untuk mengambil tindakan pada permintaan koneksi, aplikasi akan memanggil LPWSPAccept lagi dan mengembalikan CF_ACCEPT atau CF_REJECT sebagai nilai pengembalian dari fungsi kondisi.

Untuk soket yang berada dalam mode pemblokiran (default), jika tidak ada koneksi yang tertunda yang ada pada antrean, LPWSPAccept memblokir pemanggil hingga koneksi ada. Untuk soket dalam mode nonblocking, jika fungsi ini dipanggil ketika tidak ada koneksi yang tertunda yang ada pada antrean, LPWSPAccept mengembalikan kode kesalahan WSAEWOULDBLOCK. Soket yang diterima tidak dapat digunakan untuk menerima lebih banyak koneksi. Soket asli tetap terbuka.

Parameter addr adalah parameter hasil yang diisi dengan alamat entitas penghubung, seperti yang diketahui oleh penyedia layanan. Format yang tepat dari parameter addr ditentukan oleh keluarga alamat tempat komunikasi terjadi. addrlen adalah parameter hasil nilai; awalnya akan berisi jumlah ruang yang ditujukan oleh addr . Saat dikembalikan, alamat harus berisi panjang aktual (dalam byte) alamat yang dikembalikan oleh penyedia layanan. Panggilan ini digunakan dengan jenis soket berorientasi koneksi seperti SOCK_STREAM. Jika addr dan/atau addrlen sama dengan null, maka tidak ada informasi tentang alamat jarak jauh soket yang diterima yang dikembalikan. Jika tidak, kedua parameter ini harus diisi terlepas dari apakah fungsi kondisi ditentukan atau apa yang dikembalikannya.

Prototipe fungsi kondisi adalah sebagai berikut.

int CALLBACK 
ConditionFunc( 
  IN     LPWSABUF    lpCallerId, 
  IN     LPWSABUF    lpCallerData, 
  IN OUT LPQOS       lpSQOS, 
  IN OUT LPQOS       lpGQOS,
  IN     LPWSABUF    lpCalleeId, 
  IN     LPWSABUF    lpCalleeData, 
  OUT    GROUP FAR * g, 	
  IN     DWORD_PTR   dwCallbackData
);

lpCallerId dan lpCallerData adalah parameter nilai yang harus berisi alamat entitas penghubung dan data pengguna apa pun yang dikirim bersama dengan permintaan koneksi. Jika tidak ada pengidentifikasi pemanggil atau data pemanggil yang tersedia, parameter yang sesuai akan null. Banyak protokol jaringan tidak mendukung data pemanggil waktu sambung. Sebagian besar protokol jaringan konvensional dapat diharapkan untuk mendukung informasi pengidentifikasi pemanggil pada waktu permintaan koneksi. Bagian buf dari WSABUF yang ditujukkan oleh lpCallerId menunjuk kesockaddr . sockaddr ditafsirkan sesuai dengan keluarga alamatnya (biasanya dengan mentransmisikan sockaddr ke beberapa jenis khusus untuk keluarga alamat).

Parameter lpSQOS mereferensikan spesifikasi alur untuk soket s yang ditentukan oleh pemanggil, satu untuk setiap arah, diikuti oleh parameter khusus penyedia tambahan. Nilai spesifikasi alur pengiriman atau penerimaan akan diabaikan sebagaimana mestinya untuk soket searah apa pun. Nilai null untuk lpSQOS menunjukkan bahwa tidak ada QoS yang disediakan penelepon dan tidak ada negosiasi yang dimungkinkan. Penunjuk non-NULLlpSQOS menunjukkan bahwa negosiasi QoS akan terjadi atau bahwa penyedia siap untuk menerima permintaan QoS tanpa negosiasi.

lpCalleeId adalah parameter nilai yang berisi alamat lokal entitas yang terhubung. Bagian buf dari WSABUF yang ditunjukkan oleh lpCalleeId menunjuk kesockaddr . sockaddr ditafsirkan sesuai dengan keluarga alamatnya (biasanya dengan mentransmisikan sockaddr ke beberapa jenis khusus untuk keluarga alamat).

lpCalleeData adalah parameter hasil yang digunakan oleh fungsi kondisi untuk menyediakan data pengguna kembali ke entitas penghubung. Penyimpanan untuk data ini harus disediakan oleh penyedia layanan. lensa lpCalleeData-> awalnya berisi panjang buffer yang dialokasikan oleh penyedia layanan dan ditunjukkan oleh lpCalleeData->buf. Nilai nol berarti meneruskan data pengguna kembali ke pemanggil tidak didukung. Fungsi kondisi akan menyalin hinggalpCalleeData -byte data lensa kelpCalleeData -buf, lalu memperbarui lpCalleeData- lensa untuk menunjukkan jumlah byte aktual yang ditransfer. Jika tidak ada data pengguna yang akan diteruskan kembali ke pemanggil, fungsi kondisi akan mengatur lpCalleeData- lensa> ke nol. Format semua alamat dan data pengguna khusus untuk keluarga alamat tempat soket berada.

Nilai parameter dwCallbackData yang diteruskan ke fungsi kondisi adalah nilai yang diteruskan sebagai parameter dwCallbackData dalam panggilan LPWSPAccept asli. Nilai ini hanya ditafsirkan oleh klien Windows Sockets 2. Ini memungkinkan klien untuk meneruskan beberapa informasi konteks dari LPWSPAccept memanggil situs ke fungsi kondisi, yang menyediakan fungsi kondisi dengan informasi tambahan yang diperlukan untuk menentukan apakah akan menerima koneksi. Penggunaan umumnya adalah meneruskan penunjuk (pemeran yang cocok) ke struktur data yang berisi referensi ke objek yang ditentukan aplikasi yang terkait dengan soket ini.

Persyaratan

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

Lihat juga

LPWSPAsyncPilih

LPWSPBind

LPWSPConnect

LPWSPEventPilih

LPWSPGetSockOpt

LPWSPListen

LPWSPPilih

LPWSPSocket