Basit bir web sunucusu yazıyorum. Kullanıcının sunucuyu dinlemesine izin vermek isterdim, ama kullanıcı girişinin zaten kullanımda olup olmadığını nasıl anlayabilirim? (Eğer zaten kullanılıyorsa, bunları girişe söyleyebilirim) başka bir tane.)Linux'ta C'de bir bağlantı noktasının kullanımda olup olmadığı nasıl tespit edilir?
cevap
Bağlantı noktasına bind
'u deneyin ve EADDRINUSE
için errno
numaralı telefondan kontrol edin. Tek yol budur, çünkü böyle bir kontrolün doğru olması atomik olmalıdır. Ayrı bir kontrol yaptıysanız, kullanımda olmadığını tespit ettikten sonra limana bağlanmayı denediniz, başka bir süreç araya girme zamanında limana bağlanarak tekrar başarısızlığa neden olabilir. Benzer şekilde, ayrı bir denetim yaptıysanız ve zaten kullanılmakta olan bağlantı noktasını bulursanız, bunu kullanan işlem aradaki bağlantı noktasını kapatabilir, çıkışa ya da çökebilir ve sonuç yanlış sonuç verebilir.
Tüm bunların (kısa bir cevap yerine uzun bir cevap yazmamın nedeni), "Bunu yapabilir miyim?" Diye kontrol etmenin doğru ve sağlam yoludur. hemen her zaman için yapmayı deneyin ve arızayı kontrol edin. Başka herhangi bir yaklaşım, yarış koşullarına yol açabilir ve çoğu durumda, yarış koşulları (muhtemelen sizin olmasa da) yarış koşulları güvenlik açıklarıdır.
bind()
başarısız olur:
, sıfır döndürülür. Hata durumunda -1 döndürülür ve errno uygun şekilde ayarlanır.
EADDRINUSE Verilen adres zaten kullanımda.
Başka bir yaklaşım: localhost
numaralı bağlantı noktasında bu bağlantı noktasına bağlanmayı deneyin.
Bazı nedenlerden dolayı kötü bir fikir ve bu testin başarısız olabileceği yollarını ekleyin ve cevabınız değerli olabilir ... –
a) Çalışan sunucu belirli bir arayüzü dinleyebilir ve 'localhost' ile bağlantı kontrol etmez. ; b) zaman aşımları; c) TCP sunucusunu ayrı bir işlem olarak başlatmak için bağlantı noktasını kontrol etmek için bu yöntemi kullandım (hataların doğru hata kodlarını döndürmediği için, bunu kontrol etmenin tek yolu buydu). – khachik
Bu arada, (a) bağlantı noktasını bağlayarak atomik olarak test etseniz bile sorun olur. 0.0.0.0: tarihinde bir bağlantı kurarsanız bile, başka bir işlem zaten aaa.bbb.ccc.ddd: bağlantı noktasını (harici ağ adresinin ipini) bağlamış olabilir. –
bind() bazı hata
Sadece bir soket oluşturmak ve çağrı bağlama gösterirse(). Eğer bind() başarıya ulaşırsa, dinlemeye() devam edin, aksi takdirde varsayılan bağlantı noktasına geçmek, hata mesajı yazdırmak ve kullanıcı etkileşimini beklemek veya en azından oturum açmak ve çıkmak gibi bazı hata işleme prosedürlerini gerçekleştirmelisiniz.
- 1. Bağlantı noktasının kullanımda olup olmadığını belirleme?
- 2. GeoCoordinate noktasının sınırlar içinde olup olmadığı nasıl bulunur?
- 3. Tetikleyicinin geçersiz olup olmadığı nasıl kontrol edilir?
- 4. Oturumun geçersiz olup olmadığı nasıl kontrol edilir
- 5. Bir değişkenin bir Moment.js nesnesi olup olmadığı nasıl test edilir?
- 6. Belirli bir yerde musluğun olup olmadığı nasıl kontrol edilir
- 7. Bir nesnenin tanımlanmış olup olmadığı nasıl kontrol edilir?
- 8. JSON yanıt öğesinin bir dizi olup olmadığı nasıl kontrol edilir?
- 9. Soketin hala bağlı olup olmadığı nasıl kontrol edilir?
- 10. C soketindeki bağlantı kesilmesi nasıl tespit edilir C#
- 11. Veritabanının URL'sinin geçerli olup olmadığı nasıl kontrol edilir?
- 12. UIActivityTypePostToFacebook veya UIActivityTypePostToTwitter mevcut olup olmadığı nasıl test edilir
- 13. PHP postası() etkin olup olmadığı nasıl kontrol edilir?
- 14. Asp.net mvc 3'ün yüklü olup olmadığı nasıl kontrol edilir?
- 15. Jinja2 şablonunda verilen değişkenin mevcut olup olmadığı nasıl kontrol edilir?
- 16. jQuery UI widget'ının yüklü olup olmadığı nasıl kontrol edilir?
- 17. Google Drive'da klasörün mevcut olup olmadığı nasıl kontrol edilir?
- 18. Postgresql yedeğinin başarılı olup olmadığı nasıl kontrol edilir?
- 19. Sekmenin etkin olup olmadığı nasıl kontrol edilir JTabbedPane?
- 20. Kullanıcının içinde yetkili olup olmadığı nasıl kontrol edilir?
- 21. Tarih js kullanılarak tarihin geçerli olup olmadığı nasıl kontrol edilir?
- 22. Swift'de iki setin aynı olup olmadığı nasıl kontrol edilir?
- 23. İki dizenin içeriğinin aynı olup olmadığı nasıl kontrol edilir?
- 24. OS'nin Vista'nın Python'da olup olmadığı nasıl kontrol edilir?
- 25. Cihazla internet bağlantısının olup olmadığı nasıl kontrol edilir: cocos-2d
- 26. Raylar oturumunun yüklü olup olmadığı nasıl kontrol edilir?
- 27. Uzak bağlantı noktası kullanımda olup olmadığını test edin
- 28. Bağlantı noktasının açık olup olmadığını kontrol edin ANT
- 29. Seri bağlantı noktasının normal olup olmadığını belirleme COM veya SPP
- 30. Android'de tüm uygulamanın yakın olup olmadığını nasıl tespit edilir
Ancak bu şekilde bir sunucu soketi oluşturmam gerekiyor ... bind() ... daha sonra kapatın ... Daha basit bir yol var mı? – wong2
Hayır, bu tek uygun yol. Neden onu kapatmak istiyorsun? Onu zaten bağlamış olmanız durumunda dinlemeniz için kullanın - bu süre zarfında başka bir işlem bu bağlantı noktasına bağlanabileceğinden daha sonra kullanılabilir olup olmayacağını bilemezsiniz. – ThiefMaster
@ wong2: Cevabımı oku. Bağlantı noktasını bağladığınızda ve kullanmaya hazır olana kadar bağlı kalmazsanız, sorunun cevabını belirlemenin hiçbir yolu yoktur ("Bağlantı noktası zaten kullanılıyor mu?"). Önceden kontrol edilmesi (ve sonra serbest bırakılması) yanlış cevaplara tabidir. –