Aracılığıyla paylaş


yuva seçeneğini SO_CONDITIONAL_ACCEPT

SO_CONDITIONAL_ACCEPT yuva seçeneği, bir uygulamanın dinleme yuvasında gelen bağlantıyı kabul edip etmeyeceğine karar vermesine izin verecek şekilde tasarlanmıştır.

Yuva seçeneği değeri

Bu yuva seçeneğini temsil eden sabit 0x3002.

Sözdizimi

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
);

Parametreler

s [in]

Yuvayı tanımlayan bir tanımlayıcı.

düzey [in]

Seçeneğin tanımlandığı düzey. Bu işlem için SOL_SOCKET kullanın.

optname [in]

Değerin ayarlanacağı yuva seçeneği. Bu işlem için SO_CONDITIONAL_ACCEPT kullanın.

optval [out]

Ayarlanacağı seçeneğin değerini içeren arabelleğe yönelik bir işaretçi. Bu parametre , DWORD değerinin boyutuna eşit veya bundan büyük arabelleğe işaret etmelidir.

Bu değer, YANLIŞ (devre dışı) değerini belirtmek için kullanılan 0 ile bir boole değeri ve TRUE (etkin) belirtmek için sıfır olmayan bir değer olarak değerlendirilir.

optlen [in, out]

Optval arabelleğinin bayt cinsinden boyutuna işaret eden bir işaretçi. Bu boyut , DWORD değerinin boyutuna eşit veya ondan büyük olmalıdır.

Dönüş değeri

İşlem başarıyla tamamlanırsa setsockopt sıfır döndürür.

İşlem başarısız olursa SOCKET_ERROR değeri döndürülür ve WSAGetLastError çağrılarak belirli bir hata kodu alınabilir.

Hata kodu Meaning
WSANOTINITIALISED
Bu işlevi kullanmadan önce başarılı bir WSAStartup çağrısı gerçekleşmelidir.
WSAENETDOWN
Ağ alt sistemi başarısız oldu.
WSAEFAULT
Optval veya optlen parametrelerinden biri, kullanıcı adres alanının geçerli bir bölümünde olmayan belleğe işaret eder. Bu hata, optlen parametresi tarafından işaret edilen değer DWORD değerinin boyutundan küçükse de döndürülür.
WSAEINPROGRESS
Windows Yuvaları 1.1'i engelleyen bir çağrı devam ediyor veya hizmet sağlayıcısı hala bir geri çağırma işlevini işliyor.
WSAEINVAL
Düzey parametresi bilinmiyor veya geçersiz. Yuva zaten dinleme durumundaysa bu hata da döndürülür.
WSAENOPROTOOPT
Seçenek, belirtilen protokol ailesi tarafından bilinmiyor veya desteklenmiyor.
WSAENOTSOCK
Tanımlayıcı bir yuva değil.

 

Açıklamalar

SO_CONDITIONAL_ACCEPT yuva seçeneğiyle çağrılan setsockopt işlevi, bir uygulamanın dinleme yuvasında gelen bağlantıyı kabul edip etmeyeceğine karar vermesine olanak tanır. Yuva için koşullu kabul seçeneği varsayılan olarak devre dışıdır ( YANLIŞ olarak ayarlanır).

Bu yuva seçeneği etkinleştirildiğinde, TCP yığını bağlantıları otomatik olarak kabul etmez. Uygulamanın WSAAccept işleviyle kaydedilen koşullu kabul geri çağırma yoluyla bağlantıyı kabul ettiğini belirtmesini bekler. Bir bağlantı isteği alındıktan sonra Winsock, uygulama tarafından kaydedilen koşullu kabul geri çağırmasını çağırır. Yalnızca koşullu kabul geri çağırma döndürdüğünde CF_ACCEPT Winsock bağlantıyı tamamen kabul etmek için aktarıma bildirim gönderir.

SO_CONDITIONAL_ACCEPT yuva seçeneği etkin olarak ayarlandığında (TRUE olarak ayarlandığında), bunun yuva üzerinde birkaç yan etkisi vardır:

  • Bu, uygulama artık bağlantıları kabul etme sahipliğini aldığı için TCP yığınının yerleşik SYN saldırı koruması savunmalarını devre dışı bırakır.
  • Bu, dinleme yuvası adına bağlantılar kabul edilmediğinden dinleme kapsamı etkin bir şekilde devre dışı bırakılır. Uygulama CF_ACCEPT mekanizmasını kullanarak tam olarak kabul edene kadar bağlantı hiçbir zaman tam olarak kabul edilir.
  • Bu, uygulamanın bağlantıyı kabul etmek için geri çağırmaları kabul etme durumunu her zaman hazır hale getirmek için dikkatli olduğu anlamına da gelir. Uygulama başka işlemler yapmakla meşgulse, uygulama bağlantıyı gerçekten kabul etmeden önce istemci tarafı zaman aşımına uğradı olabilir. Bu, kötü bir istemci deneyimine yol açar.
  • Bazı TCP yığını iyileştirmeleri, koşullu kabul tamamlandıktan sonra bile tam olarak kabul edilen bağlantılar için geçerli değildir. Bu, bağlantının tüm ömrü boyunca performansını düşürebilir.

Genellikle, uygulamaların koşullu kabul kullanmasının ana nedeni, bağlantı istemcisi tarafından kullanılan kaynak IP adresini veya bağlantı noktasını incelemek ve ardından bağlantıyı kabul etmeye veya reddetmeye karar vermektir. Ancak, SO_CONDITIONAL_ACCEPT seçeneği etkinleştirilmemişse ve uygulama TCP yığınının ve dinleme kapsamlarının beklendiği gibi çalışmasına izin verirse, uygulamaların daha iyi performans gösterme olasılığı yüksektir. Daha sonra uygulama kabul edilen bağlantıyı işlediğinde, uygun olmayan bir IP kaynağı adresinden veya bağlantı noktasından geliyorsa, uygulama yuvayı kapatabilir. Bu davranışın güvenlik dezavantajı, istemcinin daha önce kabul edilen bağlantıyı zorla kapatmış olması nedeniyle uygulamanın bir IP adresi ve bağlantı noktası üzerinde dinlediğini onaylamasıdır. Ancak, SO_CONDITIONAL_ACCEPT etkinleştirmenin dezavantajları genellikle bu sınırlamadan daha ağır basıyor.

SO_CONDITIONAL_ACCEPT yuva seçeneğiyle çağrılan getockopt işlevi, uygulamanın koşullu kabul seçeneğinin geçerli durumunu almasına izin verir, ancak bu özellik normalde kullanılmaz. Bir uygulamanın bir yuvada koşullu kabulü etkinleştirmesi gerekiyorsa, seçeneği etkinleştirmek için setsockopt işlevini çağırır.

Ws2def.h üst bilgi dosyasının Winsock2.h dosyasına otomatik olarak eklendiğini ve hiçbir zaman doğrudan kullanılmaması gerektiğini unutmayın.

Gereksinimler

Gereksinim Değer
Desteklenen en düşük düzeydeki istemci
Windows Vista [yalnızca masaüstü uygulamaları]
Desteklenen en düşük sunucu
Windows Server 2008 [yalnızca masaüstü uygulamaları]
Header
Ws2def.h (Winsock2.h içerir)

Ayrıca bakınız

getsockopt

setsockopt

WSAAccept