Bagikan melalui


opsi soket SO_CONDITIONAL_ACCEPT

Opsi soket SO_CONDITIONAL_ACCEPT dirancang untuk memungkinkan aplikasi memutuskan apakah akan menerima koneksi masuk pada soket mendengarkan atau tidak.

Nilai opsi soket

Konstanta yang mewakili opsi soket ini 0x3002.

Sintaks

int setsockopt(
  (SOCKET) s,      // descriptor identifying a socket 
  (int) SOL_SOCKET,   // level
  (int) SO_CONDITIONAL_ACCEPT, // optname
  (char *) optval,         // input buffer,
  (int) optlen,       // size of input buffer
);

Parameter

s [in]

Deskriptor yang mengidentifikasi soket.

level [in]

Tingkat di mana opsi ditentukan. Gunakan SOL_SOCKET untuk operasi ini.

optname [in]

Opsi soket yang nilainya akan diatur. Gunakan SO_CONDITIONAL_ACCEPT untuk operasi ini.

optval [out]

Penunjuk ke buffer yang berisi nilai untuk opsi yang akan diatur. Parameter ini harus menunjuk ke buffer yang sama dengan atau lebih besar dari ukuran nilai DWORD .

Nilai ini diperlakukan sebagai nilai boolean dengan 0 digunakan untuk menunjukkan FALSE (dinonaktifkan) dan nilai bukan nol untuk menunjukkan TRUE (diaktifkan).

optlen [masuk, keluar]

Penunjuk ke ukuran, dalam byte, dari buffer optval . Ukuran ini harus sama dengan atau lebih besar dari ukuran nilai DWORD .

Menampilkan nilai

Jika operasi berhasil diselesaikan, setsockopt mengembalikan nol.

Jika operasi gagal, 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.
WSAEFAULT
Salah satu optval atau parameter optlen menunjuk ke memori yang tidak berada di bagian ruang alamat pengguna yang valid. Kesalahan ini juga dikembalikan jika nilai yang diacu oleh parameter optlen kurang dari ukuran nilai DWORD .
WSAEINPROGRESS
Pemblokiran panggilan Windows Sockets 1.1 sedang berlangsung, atau penyedia layanan masih memproses fungsi panggilan balik.
WSAEINVAL
Parameter tingkat tidak diketahui atau tidak valid. Kesalahan ini juga dikembalikan jika soket sudah dalam status mendengarkan.
WSAENOPROTOOPT
Opsi tidak diketahui atau tidak didukung oleh keluarga protokol yang ditunjukkan.
WSAENOTSOCK
Deskriptor bukan soket.

 

Keterangan

Fungsi setsockopt yang dipanggil dengan opsi soket SO_CONDITIONAL_ACCEPT memungkinkan aplikasi untuk memutuskan apakah akan menerima koneksi masuk pada soket mendengarkan atau tidak. Opsi terima kondisional untuk soket dinonaktifkan (diatur ke FALSE) secara default.

Ketika opsi soket ini diaktifkan, tumpukan TCP tidak secara otomatis menerima koneksi. Ini menunggu aplikasi untuk menunjukkan bahwa aplikasi menerima koneksi melalui panggilan balik terima bersyarah yang terdaftar dengan fungsi WSAAccept . Setelah permintaan koneksi diterima, Winsock memanggil panggilan balik terima kondisional yang didaftarkan oleh aplikasi. Hanya ketika panggilan balik terima berskalakan kembali CF_ACCEPT akan Winsock memberi tahu transportasi untuk menerima koneksi sepenuhnya.

Ketika opsi soket SO_CONDITIONAL_ACCEPT diatur ke diaktifkan (diatur ke TRUE), ini memiliki beberapa efek samping pada soket:

  • Ini menonaktifkan pertahanan perlindungan serangan SYN bawaan tumpukan TCP, karena aplikasi sekarang mengambil kepemilikan menerima koneksi.
  • Ini secara efektif menonaktifkan backlog mendengarkan karena koneksi tidak diterima atas nama soket mendengarkan. Koneksi tidak pernah sepenuhnya diterima sampai aplikasi sepenuhnya menerima menggunakan mekanisme CF_ACCEPT .
  • Ini juga berarti aplikasi berhati-hati agar selalu dalam keadaan untuk dengan mudah menangani panggilan balik yang diterima untuk menerima koneksi. Jika aplikasi sibuk melakukan pemrosesan lain, maka sisi klien mungkin kehabisan waktu sebelum aplikasi benar-benar menerima koneksi. Hal ini menyebabkan pengalaman klien yang buruk.

Umumnya, alasan utama aplikasi menggunakan penerimaan bersyarah adalah untuk memeriksa alamat IP sumber atau port yang digunakan oleh klien penghubung dan kemudian memutuskan untuk menerima atau menolak koneksi. Namun, aplikasi cenderung berkinerja lebih baik jika opsi SO_CONDITIONAL_ACCEPT tidak diaktifkan dan aplikasi memungkinkan tumpukan TCP dan backlog mendengarkan berfungsi seperti yang diharapkan. Kemudian ketika aplikasi menangani koneksi yang diterima, jika berasal dari alamat atau port sumber IP yang tidak tepat, aplikasi hanya dapat menutup soket. Kelemahan keamanan untuk perilaku ini adalah bahwa sekarang klien telah mengonfirmasi bahwa aplikasi mendengarkan alamat IP dan port karena secara paksa menutup koneksi yang diterima sebelumnya. Namun, kelemahan untuk mengaktifkan SO_CONDITIONAL_ACCEPT umumnya melebihi batasan ini.

Fungsi getsockopt yang dipanggil dengan opsi soket SO_CONDITIONAL_ACCEPT memungkinkan aplikasi untuk mengambil status opsi penerimaan kondisional saat ini, meskipun fitur ini biasanya tidak digunakan. Jika aplikasi perlu mengaktifkan penerimaan kondisional pada soket, aplikasi hanya memanggil fungsi setsockopt untuk mengaktifkan opsi .

Perhatikan bahwa file header Ws2def.h secara otomatis disertakan dalam Winsock2.h, dan tidak boleh digunakan secara langsung.

Persyaratan

Persyaratan Nilai
Klien minimum yang didukung
Windows Vista [hanya aplikasi desktop]
Server minimum yang didukung
Windows Server 2008 [hanya aplikasi desktop]
Header
Ws2def.h (termasuk Winsock2.h)

Lihat juga

getsockopt

setsockopt

WSAAccept