send() ve recv() -- Konuş Benimle Bebeğim!
Önceki Sistem Çağrıları veya Felaketleri Sonraki
send() ve recv() -- Konuş Benimle Bebeğim!
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!
Önceki Üst Ana Başlık Sonraki
accept() -- "3490 Numaralı Portu Aradığınız İçin Teşekkürler" Başlangıç  sendto() ve recvfrom() -- Benimle UDP'ce Konuş
Bir Linux Kitaplığı Sayfası