2010-03-10 11 views
22

Soketin engellemesini engellemediğim sürece read() 'ın engelleme çağrısı olduğunu biliyorum. Bu yüzden, 4K veriyi pozitif bir değer (bayt okuması yok) veya hata durumunda -1 (istemci tarafından olası bağlantı sıfırlama) döndürmesi istendiğinde read() çağrısı bekliyorum. Sorum şu: Herhangi bir vesileyle() '0' okuyabilir mi?Bağlı bir soket üzerindeki() işlevini sıfır bayt döndüren() işlevini okuyabilir miyim?

ben read() bu şekilde ele ediyorum: okursanız

if ((readval = read(acceptfd, buf, sizeof(buf) - 1)) < 0) 
    { 

    } 
    else 
    { 
     buf[readval] = 0; 
     //Do some thing with data 
    } 

Bu kod bombaları() sıfır dönmek ve bunu düzeltmek biliyorum. Fakat read() 'ın sıfır olması mümkün mü?

+0

* Adam * sayfasını okumayı düşündünüz mü? – EJP

cevap

41

TCP bağlantısı bir tarafta kapatıldığında, diğer taraftaki read() 0 bayt değerini döndürür.

+3

Okunur errno'yu ECONNRESET olarak ayarladı mı? Diğer taraf bağlantıyı kapattıysa, aslında bir hata durumudur. Sıfırın geri dönüşünü de hata durumu olarak düşünelim mi? Bağlantı kapatıldığında – kumar

+6

+1 read() sıfırlanır. –

+1

@kumar: dönen sıfır, gerçek bir hatanın aksine, düzenli bir kapatma işleminin gerçekleştiğini belirlemenizi sağlar. –