2009-05-12 24 views
7

Standart soket çağrılarını kullanan bir C++ uygulamasına sahibim ve herhangi bir veri göndermeden veya almadan bir soketin hala açık olup olmadığını anlayabileceğimi bilmek istiyorum. Yapabileceğim güvenilir bir select veya ioctlsocket çağrı var mı?Soket hala açık olup olmadığını nasıl kontrol edebilirim?

+0

Soketin diğer ucunda kapatılıp kapatılmadığını kontrol etmek mi istiyorsunuz? –

+0

Evet. Uygulamam Windows'da çalışır ve bilgisayar hazırda bekletilirse, diğer uç kapandığında soket döndüğünde artık geçerli olmayabilir (ve uygulamanız askıya alındığında, bildirim almaz). – Rob

cevap

7

Bir bayt almayı denerseniz, engellemeyen bir soketiniz varsa ve çeşitli bir hatayla karşılaşırsanız, birkaç hata alabilirsiniz, WSAEWOULDBLOCK hatası alacaksınız.

Eğer bir zaman aşımı veya kesmek için çeşitli diğer hata döndürebilir return value of recv recv gördüğünüz gibi, ben WSAEWOULDBLOCK o olabilir tek değerdir inanıyoruz böylece

bool connected(SOCKET sock) 
{ 
    char buf; 
    int err = recv(sock, &buf, 1, MSG_PEEK); 
    if(err == SOCKET_ERROR) 
    { 
      if(WSAGetLastError() != WSAEWOULDBLOCK) 
      {return false;} 
    } 
    return true; 
} 

gibi olmayan bir engelleme soketi kontrol edebilirsiniz Bunu bilerek Eğer bir hata olsaydı, ancak yine de bağlanırsanız, ancak bu geri dönüş değerleri listesini iki kez kontrol etmek isteyebilirsiniz. Ayrıca, recv'de (MSG_PEEK) kullanılan bayrak, kontrolden sonra daha sonra bakmak istediğinizde verilerin hala okunabilir olduğu anlamına gelir, bu nedenle verilerin bir baytını kaybetme konusunda endişelenmenize gerek yoktur.

Verilerin alınmasını engelleyebildiğinden, bunun yalnızca bloke olmayan soketlerle iyi çalışacağına inanıyorum. Engelleme soketini kullanmak isterseniz, bu kontrolden önce ioctlsocket ile blok olmayan blok ayarlamak isteyebilirsiniz, daha sonra nasıl olduğunu geri döndürün.

+0

Soketleri bloke etmek için seçin. –

3

"Açık" olan bir soket uçtan uca bağlantıyla size yardımcı olmaz. Diğer tarafla iletişim kurabileceğinden emin olmanın tek yolu, diğer uç ile iletişim kurmaktır.

Tasarladığınız herhangi bir protokolde, bu denetim davranışını uygulamayı düşünmelisiniz. Protokolünüz olmasa da, bazen sneakily yapmanın yolları vardır (örneğin FTP bağlantı noktalarının açık olup olmadığını kontrol etmek için FTP çok küçük, işe yaramaz bir dosya).

İlgili konular