"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.