Bu iki işlev veri akış soketler veya bağlantılı veri paketi soketleri
üzerinden veri göndermenizi ve veri almanızı sağlar. Eğer istediğiniz
düzenli ve bağlantısız veri paketi soketleri kullanmak ise o zaman
sendto() ve
recvfrom() işlevleri ile ilgili
aşağıdaki bölümü okumalısınız.
send() işlevi şu şekilde çağrılır:
int send(int sockfd, const void *msg, int len, int flags);
sockfd üzerinden veri göndereceğiniz sokettir
(size socket() veya accept()
tarafından sağlanmış olabilir). msg göndermek
istediğiniz mesajı gösteren bir göstergedir ve len
değişkeni bu verinin byte cinsinden uzunluğudur. flags
parametresini 0 olarak bırakabilirsiniz.
(Bu parametre ile ilgili ayrıntılı bilgi için bkz.
send() man sayfası.)
Örnek bir kod parçası vermek gerekirse:
char *msg = "Beej buradaydi!";
int len, bytes_sent;
.
.
len = strlen(msg);
bytes_sent = send(sockfd, msg, len, 0);
.
.
.
send() değer olarak gönderilen bayt miktarını
döndürür -- bu sizin gönderilmesini istediğiniz miktardan az olabilir!
Gördüğünüz gibi siz ona bir yığın veri göndermesini söylersiniz ancak
o bazen bunun tamamı ile başa çıkamayabilir. Elinden geldiği kadarını
gönderir ve geriye kalan veriyi yeniden göndermek sizin
sorumluluğunuzdadır. Unutmayın, eğer send()
işlevinin döndürdüğü değer len değişkenindeki
değer kadar değilse göndermek istediğiniz verinin geriye kalanını
göndermek sizin işinizdir. İyi haberlere gelince: Eğer paket küçükse
(1k civarı) bu işlev büyük ihtimalle tüm veriyi bir seferde
gönderebilecektir. Her zamanki gibi hata durumunda -1
değerini döndürür ve errno küresel değişkenine
hata kodunu yazar.
recv() işlevi da pek çok bakımdan yukarıdaki işleve
benzer:
int recv(int sockfd, void *buf, int len, unsigned int flags);
sockfd üzerinden okuma işlemini
gerçekleştireceğiniz sokettir, buf okunan verinin
yazılacağı bellek bölgesinin başlangıç adresini gösteren göstergedir,
len ise verinin yazılacağı tamponun (buffer)
azami boyudur ve flags yine 0
değerini alabilir (Ayrıntılı bilgi için recv()
man sayfasına bakınız).
recv() okunduktan sonra tampona yazılan bayt miktarını
döndürür ya da eğer bir hata oluştu ise -1 değerini
döndürüp errno değişkeninini değerini belirler.
Bir dakika! recv() 0 değerini
döndürebilir! Bunun tek bir anlamı vardır: karşı taraf bağlantıyı
kesmiş! Döndürülen değerin 0 olması
recv() işlevinin size "karşı taraf bağlantıyı
kesti" mesajını vermesi demektir.
Bütün bunları anlamak kolaydı değil mi? Artık verilerinizi soketler
üzerinden yollayıp alabilirsiniz! Vay be! Artık siz bir Unix Ağ
Programlama Uzmanısınız!