RECV(2) | Sistem Çağrıları | RECV(2) |
recv - bağlantılı soket üzerinden
ileti alır
recvfrom - bağlantısız soket üzerinden ileti
alır
recvmsg - soket üzerinden bir dizi ileti alır
#include <sys/types.h> #include <sys/socket.h>
recv(), recvfrom() ve recvmsg() sistem çağrıları bir soketten veri almak için kullanılır. Bu sistem çağrıları hem bağlantılı hem de bağlantısız soketlerde kullanılabilir. Bu sayfada önce bu üç çağrının genel özellikleri ve ardından aralarındaki fark anlatılmıştır.
recv() ve read(2) arasındaki tek fark flags değişkeninin varlığıdır. flags değişkenine sıfır değeri atanmış recv() genel olarak read(2) ile eşdeğerdir (ancak yine de EK BİLGİ bölümüne bakın). Ayrıca aşagıdaki
recv(sockfd, buf, len, flags);
recvfrom(sockfd, buf, len, flags, NULL, NULL);
Üç sistem çağrısı da başarı durumunda iletinin boyutunu döndürür. Eğer ileti verilen tampona sığamayacak kadar uzunsa, iletiyi alan soket türüne bağlı olarak fazlalık baytlar atılabilir.
Eğer sokette ileti yoksa ve soket engellemesiz değilse çağrılar bir iletinin gelmesini bekler (fcntl(2) sayfasına bakın), eğer soket engellemeliyse -1 döner ve errno harici değişkenine EAGAIN veya EWOULDBLOCK sabitlerinden bir tanesi atanır. Bu sistem çağrıları, talep edilen miktarın tamamının alınmasını beklemek yerine mevcut olan tüm verileri döndürür.
Bir uygulamada select(2), poll(2) veya epoll(2) çağrıları kullanılarak sokete fazla verinin ne zaman geleceğine karar verilebilir.
flags değişkeninin değeri aşağıdaki değerlerin VEYAlanmasıyla elde edilir.
sock_extended_err yapısında sağlanan hatalar:
#define SO_EE_ORIGIN_NONE 0 #define SO_EE_ORIGIN_LOCAL 1 #define SO_EE_ORIGIN_ICMP 2 #define SO_EE_ORIGIN_ICMP6 3 struct sock_extended_err { uint32_t ee_errno; /* Hata sayısı */ uint8_t ee_origin; /* Hatanın kaynağı */ uint8_t ee_type; /* Tür */ uint8_t ee_code; /* Kod */ uint8_t ee_pad; /* Dolgu */ uint32_t ee_info; /* Ek bilgiler */ uint32_t ee_data; /* Diğer veriler */ /* Fazladan veri takip edebilir */ }; struct sockaddr *SO_EE_OFFENDER(struct sock_extended_err *);
Yerel hatalar için adres belirtilmez (bu, cmsghdr üyesi cmsg_len ile sınanabilir). Hata alımı için msghdr değişkenine MSG_ERRQUEUE atanır. Bir hata aktarıldıktan sonra, bekleyen soket hatası, hata kuyruğundaki sonraki hataya göre yeniden oluşturulur ve sonraki soket işleminde aktarılır.
İnternet akım soketleriyle kullanmak için tcp(7) sayfasına bakın.
recvfrom() gelen iletiyi buf tamponuna yerleştirir. Çağrıcı tamponun boyutunu len değişkeni ile belirtmelidir.
Eğer src_addr NULL değilse ve ilgili protokol iletinin kaynak adresini sağlıyorsa src_addr tampon içine yerleştirilen kaynak adrese göstericidir. Bu durumda, addrlen hem aktarılan değere hem de dönen sonuca göstericidir. addrlen, çağrıdan önce src_addr ile ilişkilendirilmiş tamponun boyutuna gösterici olmalıdır. İşlev döndüğünde, addrlen, kaynak adresin gerçek boyutunu gösterecek şekilde güncellenir. Sağlanan tampon çok küçükse döndürülen adres kırpılır; bu durumda, addrlen çağrıdan önceki boyuttan daha büyük bir değer döndürür.
Eğer çağrıcı kaynak adresiyle ilgilenmiyorsa src_addr ve addrlen değişkenlerinde NULL aktarmalıdır.
recv() çağrısı normalde connected (bağlantılı) soketlerle kullanılır (connect(2) sayfasına bakın). Bu çağrı:
recvfrom(fd, buf, len, flags, NULL, 0);
recvmsg(), msghdr yapısını kullanarak doğrudan sağlanan değişken sayısını azaltır. Bu yapı, <sys/socket.h> içerisinde şu şekilde tanımlanmıştır:
struct iovec { /* Dağıtma/toplama dizisinin öğeleri */ void *iov_base; /* Başlangıç adresi */ size_t iov_len; /* Aktarılacak bayt saysı */ };
struct msghdr { void *msg_name; /* İsteğe bağlı adres */ socklen_t msg_namelen; /* Adresin boyutu */ struct iovec *msg_iov; /* Dağıtma/toplama dizisi */ size_t msg_iovlen; /* msg_iov dizisinin öğe sayısı*/ void *msg_control; /* Yardımcı veri tamponu, aşağıya bakın*/ size_t msg_controllen; /* Yardımcı veri tampon boyutu */ int msg_flags; /* Alınan iletideki seçenekler */ };
readv(2) sayfasında açıklandığı üzere, msg_iov ve msg_iovlen alanları dağıtma-toplama konumlarını belirler.
msg_controllen uzunluğundaki msg_control alanı, diğer protokollere ait denetim iletileri veya çeşitli yardımcı verilere göstericidir. recvmsg() çağrıldığında, msg_controllen msg_control içindeki kullanılabilir tamponun boyutunu içermelidir; başarılı bir çağrıda denetim ileti dizisinin boyutunu içerir.
İletinin yapısı:
struct cmsghdr { size_t cmsg_len; /* Başlıkla beraber verinin bayt sayısı (POSIX’de veri türü socklen_t’dir) */ int cmsg_level; /* Kaynak protokol */ int cmsg_type; /* Protokole özgü tür */ /* devamında, unsigned char cmsg_data[]; */ };
Örnek olarak, Linux bu yardımcı veri mekanizmasını genişletilmiş hataları, IP seçeneklerini veya UNIX alan soketleri üzerinden dosya tanıtıcılarını aktarmak için kullanır. Yardımcı verinin diğer çeşitli soket alanlarında kullanımına ilişkin ayrıntılı bilgi için unix(7) ve ip(7) sayfalarına bakın.
msghdr yapısına ait msg_flags alanı, recvmsg() dönüdüğünde şu sabitler için sınanabilir:
Başarı durumunda bu çağrılar alınan baytların sayısını döndürür. Hata durumunda, -1 döner ve hata errno değişkenine atanır.
Akım soketinin bağlantısı karşıdan düzenli ollarak kapatılıyorsa dönen değer 0 olur (geleneksel dosya sonu dönüş değeri).
Çeşitli alanlardaki verikatarı soketleri (örneğin UNIX ve İnternet alan soketleri) sıfır uzunluktaki verikatarlarına izin verir. Böyle bir verikatarı alınırsa dönüş değeri 0 olur.
Eğer akım soketinden istenilen bayt boyutu 0 ise aynı şekilde 0 değeri döner.
Soket katmanı tarafından üretilen bazı standart hatalar vardır. Ayrıca, kullanılan protokol modülleri tarafından üretilen ve döndürülen hatalar da olabilir; bilgi için bunlarla ilgili kılavuz sayfalarına bakın.
POSIX.1-2001, POSIX.1-2008, 4.4BSD (Bu arayüzler ilk defa 4.2BSD ile ortaya çıktı.)
POSIX.1 sadece MSG_OOB, MSG_PEEK ve MSG_WAITALL seçeneklerini açıklar.
Eğer sıfır uzunluğunda bir verikatarı beklemedeyse, sıfır flags değişkenli read(2) ve recv() farklı davranışlar sergiler. Bu koşullarda, recv() bekleyen verikatarını tüketirken read(2) hiçbir etkiye sahip değildir (verikatarı beklemede kalır).
socklen_t POSIX ile icat edilmiştir. Ayrıca accept(2) sayfasına bakın.
POSIX.1’e göre, msghdr yapısının msg_controllen alanı socklen_t türünde, msg_iovlen alanı ise int türünde olmalıdır, fakat glibc ikisine de size_t türünü atar.
Tek çağrıda çok sayıda verikatarı alabilmek için kullanılan Linux’a özgü sistem çağrısı hakkında bilgi edinmek için recvmmsg(2) sayfasına bakın.
recvfrom() kullanım örneği getaddrinfo(3) sayfasında verilmiştir.
fcntl(2), getsockopt(2), read(2), recvmmsg(2), select(2), shutdown(2), socket(2), cmsg(3), sockatmark(3), ip(7), ipv6(7), socket(7), tcp(7), udp(7), unix(7)
© 2022 Fatih Koçer
Bu çeviri özgür yazılımdır:
Yasaların izin verdiği ölçüde
HİÇBİR GARANTİ YOKTUR.
Lütfen, çeviri ile ilgili bildirimde bulunmak veya çeviri
yapmak için https://github.com/TLBP/manpages-tr/issues adresinde
"New Issue" düğmesine tıklayıp yeni
bir konu açınız ve isteğinizi belirtiniz.
11 Kasım 2020 | Linux man-pages 5.10 |