Bloklama. Bunu duymuş olmalısınız -- peki anlamı nedir? Kabaca
söylemek gerekirse "blok" (block) sözcüğü "uyku" (sleep) için
kullandığımız teknik bir terim. Bunu, yukarıdaki
listener programını çalıştırdığınızda görmüş
olmalısınız. Yani program çalışır ve orada öylece bir paketin
gelmesini bekler. Olup biten şudur: Bu program
recvfrom() işlevini çağırır, ortalıkta bir
veri yoktur ve bu yüzden recvfrom()
"bloklama" yapar (yani orada uyur) ta ki bir veri gelene kadar.
Pek çok işlev blok yapar, yani uyur. accept()
bloklar. Tüm recv() işlevleri bloklar, yani
bekler. Bunu yapabilmelerinin sebebi ise onlara bunu yapabilmeleri
için izin verilmiş olmasıdır. Soket tanımlayıcısını ilk aşamada
socket() ile yarattığınızda, işletim sistemi
çekirdeği onu bloklayan olarak ayarlar. Eğer bir soketin bloklama
yapabilmesini istemiyorsanız o zaman fcntl()
işlevini çağırmanız gerekir:
#include <unistd.h>
#include <fcntl.h>
.
.
sockfd = socket(AF_INET, SOCK_STREAM, 0);
fcntl(sockfd, F_SETFL, O_NONBLOCK);
.
.
Bir soketi bloklamayan olarak ayarladığınızda o soketten bilgi
alabilirsiniz. Eğer bloklamayan bir soketten bir şeyler okumaya
kalkarsanız ve orada bir veri yoksa, bloklama yapmasına izin
verilmediği için bir değer döndürecektir, bu değer -1
olacaktır ve errno değişkeni de
EWOULDBLOCK değerini alacaktır.
Ancak genelde bu şekilde bilgi edinmeye çalışmak pek de iyi bir
fikir değildir. Eğer programınızı sürekli soketten veri okumaya
çalışır hale getirirseniz o zaman çok fazla işlemci zamanından
çalarsınız. Okunmak üzere bir verinin gelip gelmediğini kontrol
etmenin daha şık bir yöntemi vardır ve bu yöntem
select() işlevini temel alır.