sendto() ve recvfrom() -- Benimle UDP'ce Konuş
Önceki Sistem Çağrıları veya Felaketleri Sonraki
sendto() ve recvfrom() -- Benimle UDP'ce Konuş
"Buraya dek çok güzeldi," dediğinizi duyar gibiyim, "fakat bu bilgileri bağlantısız veri paketi soketleri üzerinde nasıl kullanabilirim ki?". No problemo, amigo. İşte derdine çare.
UDP soketleri uzaktaki bir konağa bağlı olmadığından kılavuz paketi yollamadan önce hangi bilgiyi vermemiz gerekiyor? Doğru tahmin! Hedef adres! Kısaca:
int sendto(int sockfd, const void *msg, int len, unsigned int flags,
           const struct sockaddr *to, int tolen); 
send() işlevine ne kadar da benziyor değil mi? Tek farkı fazladan iki bilgi parçası var. to dediğimiz struct sockaddr türünde bir değişkeni gösteren işaretçidir (normalde struct sockaddr_in türündedir ve siz son anda gerekli tür dönüşümünü yaparsınız) ve hedef IP adresi ile port numarasını barındırır. tolen değişkeni sizeof(struct sockaddr) değerini almalıdır.
Tıpkı send() gibi, sendto() işlevi de gönderilen bayt miktarını döndürür (bu beklediğinizden az olabilir tabii ki!) ve eğer hata oldu ise -1 değerini döndürür.
Tahmin edebileceğiniz gibi recv() ve recvfrom() işlevleri birbirlerine çok benzerdir. Kısaca recvfrom() işlevine bakarsak:
int recvfrom(int sockfd, void *buf, int len, unsigned int flags,
             struct sockaddr *from, int *fromlen); 
Benzer olduğunu söylemiştim yani: recv() işlevinde olduğu gibi, sadece birkaç ek değişkene ihtiyacı var. from yerel bir struct sockaddr türünde değişkenin adresini gösteren göstergedir ki bu değişken de mesajın geldiği ilgili makinanın IP adresini ve port numarasını barındıracaktır. fromlen yerel ve int türünde bir göstergedir ve söz konusu değişkenin alması gereken ilk değer sizeof(struct sockaddr)'dir. İşlev, çalışıp bir değer döndürünce fromlen değişkeni from değişkenindeki adresin boyunu depoluyor olacaktır.
recvfrom() işlevi okuduğu bayt sayısını veya bir hata oluşması durumunda -1 değerini döndürür (ve errno değişkenine uygun hata kodunu yerleştirir).
Unutmayın, eğer connect() ile bir UDP soketine bağlantı kurarsanız send() ve recv() işlevlerini kullanmanızda bir sakınca yoktur. Soketin kendisi hala bir bağlantısız veri paketi soketidir ve gidip gelen paketler de hala UDP protokolünü kullanır. Fakat soket arayüzü otomatik olarak sizin yerinize gerekli hedef ve kaynak bilgisini pakete ekler.
Önceki Üst Ana Başlık Sonraki
send() ve recv() -- Konuş Benimle Bebeğim!  Başlangıç  close() ve shutdown() -- Düş Yakamdan!
Bir Linux Kitaplığı Sayfası