Temel olarak, socket.recv()
'un okuyabildiği her şeyi veya diğer tarafın kapatıldığını belirten boş bir dize döneceğini birkaç yerde okudum (resmi dokümanlar, bağlantı kapatıldığında geri döndüklerinden bile bahsetmiyor bile ... harika!). Bu, aslında, gerçekten bir şey almak için bir şey olduğunda recv()
döndürdüğünü biliyoruz, çünkü soketleri engellemek için iyi ve dandy, bu yüzden boş bir dize döndürdüğünde, ZORUNLU diğer tarafın bağlantıyı kapattığı anlamına gelir, değil mi?Zaman aşımı oluşana kadar veri alınmazsa, Python'un socket.recv() bloğu engelleme olmayan soketler için ne döndürür?
Tamam, peki ya benim soketim bloke olmadığında ne olur? Biraz aradım (belki de yeterli değil, kim bilir?) Ve diğer tarafın bloke edici olmayan bir soket kullanarak bağlantıyı ne zaman kapattığını anlayamıyorum. Bize bunu söyleyen bir yöntem veya özellik yok gibi görünüyor ve boş dize recv()
dönüş değeri karşılaştırmak kesinlikle işe yaramaz gibi görünüyor ... sadece bu sorun mu yaşıyorsunuz?
Basit bir örnek olarak, benim soketimizin zaman aşımının 1.2342342 olarak ayarlandığını (burada hangi negatif olmayan numara olursa olsun) saniyelerle ve socket.recv(1024)
numaralı telefonu aradığımı, ancak diğer tarafın 1.2342342 ikinci dönem boyunca hiçbir şey göndermediğini varsayalım. Eğer select
bağlantılı olarak recv
kullandığınızda soket okunan hazırdır ama varsa
Tamam, bu tam olarak ne bilmek gerekiyordu. Teşekkür ederim! Bu soruyu sormak zorunda kalmazdım, sadece resmi dokümanlar bu yöntemle bir istisnanın kaldırılmasından bahsetmiş olsa bile ... biraz da doktorlarla hayal kırıklığına uğramıştı :(ama cevabınızdan çok memnunum :) başparmak yukarıya! –
Kodunuz hakkında sadece bir not. Soketi daha fazla Pythonic ve cross-platformda (ve C-stili bayraklar olmadan okunabilir imho) bloke etmeyecek şekilde ayarlamak, basitçe 's.settimeout (whatever_nonnegative_number_of_your_liking)' ' –
’u çağırmaktır. sorumu sadece yarim cevaplar. Şey, bir zaman aşımı tanımlandığında ve 'recv()' bir zaman aşımından sonra veri olmadan başarısız olduğunda, bir 'socket.timeout' istisnası (' socket.error' değil) yükseltilir. Zaman aşımı istisnası hala bağlantının durumu hakkında bir şey yapmama izin vermiyor. Bağlantı kapandığında 'socket.error' olduğunu varsayalım. Bunu onaylayan var mı? –