Pekala hızımızı biraz değiştirelim. Ya bir yere bağlanmak
istemiyorsanız ne olacak? Mesela sırf zevk olsun diye size gelen
bağlantıları dinlemek ve bunlarla ilgili gerekeni yapmak istediğinizi
var sayalım. Bu tür bir süreç iki aşamalıdır, önce
listen() ile dinler sonra da accept()
ile gelen çağrıları kabul edersiniz.
Dinleme işlevi oldukça basittir ancak gene de biraz açıklama yapmak
gerekiyor:
int listen(int sockfd, int backlog);
sockfd bin kere söylediğim gibi
socket() sistem çağrısı tarafından döndürülmüş
olan soket dosya tanımlayıcısı oluyor. backlog
ise gelen çağrı kuyruğunda izin verilen bağlantı sayısını gösteriyor.
Bu ne mi demek? Şey, yani gelen bağlantı talepleri siz onları
accept() ile kabul edene dek bir kuyrukta bekler
demek ve işte bu kuyruğun ne kadar uzun olacağını başka bir deyişle
sınırını siz belirlersiniz. Pek çok sistem bu sınırı 20 olarak
belirler; siz ise mesela 5 veya 10 gibi bir değer kullanabilirsiniz.
Hemen her zamanki gibi, listen() işlevi hata
durumunda -1 değerini döndürür ve tabii ki
errno değişkenine de ilgili hata numarasını
yazar.
Evet, tahmin edebileceğiniz gibi listen()
işlevinden önce bind() işlevini çağırmalıyız
yoksa işletim sistemi çekirdeği bu dinleme işlemini gelişigüzel
bir port üzerinden yapmaya başlar. Eğer gelen bağlantıları
dinleyecekseniz çağırmanız gereken işlevler sırası ile şöyledir:
socket();
bind();
listen();
/* accept() buraya gelecek */
Burada çok açıklama ve kod yok çünkü zaten kendi kendini açıklıyor.
(accept() bölümünde ele alacağımız kod tabii
ki daha ayrıntılı olacak.) Bütün bu prosedürdeki en dikktali olunması
gerken nokta accept() işlevinin çağrıldığı yer.