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?
cevap
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.
Soketleri bloke etmek için seçin. –
"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).
- 1. Açık veya açık döküm olup olmadığını nasıl kontrol edebilirim?
- 2. Webdriver - Tarayıcının hala mevcut olup olmadığını nasıl kontrol edebilirim?
- 3. Zamanlayıcının hala çalışıyor olup olmadığını nasıl kontrol edebilirim?
- 4. sql_safe_updates açık olup olmadığını nasıl kontrol edilir?
- 5. Yolun var olup olmadığını nasıl kontrol edebilirim?
- 6. Bir sayfanın açık olup olmadığını kontrol edin
- 7. Özellik olup olmadığını nasıl kontrol edebilirim?
- 8. Fonksiyonun kısmi olup olmadığını nasıl kontrol edebilirim?
- 9. Kuyruk boş olup olmadığını nasıl kontrol edebilirim?
- 10. Çocuğun var olup olmadığını nasıl kontrol edebilirim?
- 11. Bir dosya olup olmadığını nasıl kontrol edebilirim?
- 12. Seçicinin qtip olup olmadığını nasıl kontrol edebilirim?
- 13. Dizinin boş olup olmadığını nasıl kontrol edebilirim?
- 14. Dosyanın var olup olmadığını nasıl kontrol edebilirim?
- 15. NSUserDefaults'un var olup olmadığını nasıl kontrol edebilirim
- 16. Sesin çevrimdışı olup olmadığını nasıl kontrol edebilirim?
- 17. gedit'te bir metin dosyasının açık olup olmadığını nasıl kontrol edilir
- 18. phpMyAdmin: Alanın dizini olup olmadığını nasıl kontrol edebilirim?
- 19. Soketin PHP'de açık olup olmadığını nasıl anlarsınız?
- 20. Python'da MySQL bağlantısının kapalı olup olmadığını nasıl kontrol edebilirim?
- 21. İşletmenin açık olup olmadığını kontrol edin
- 22. A xor B'nin boş olup olmadığını nasıl kontrol edebilirim?
- 23. Genel bir türün Swift'de sıfır olup olmadığını nasıl kontrol edebilirim?
- 24. iPhone'un çift kamerası olup olmadığını nasıl kontrol edebilirim?
- 25. Dikdörtgen düğümün pencerede olup olmadığını nasıl kontrol edebilirim
- 26. Bir Sözün beklemede olup olmadığını nasıl kontrol edebilirim
- 27. Perl dizinin hala boş olup olmadığını nasıl kontrol edelim?
- 28. Python/win32com - Programın Açık olup olmadığını kontrol edin
- 29. Soketin hala bağlı olup olmadığı nasıl kontrol edilir?
- 30. Sunucudan yanıtın JSONAobject veya JSONArray olup olmadığını nasıl kontrol edebilirim?
Soketin diğer ucunda kapatılıp kapatılmadığını kontrol etmek mi istiyorsunuz? –
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