Provided by: manpages-tr_2.0.6-2_all bug

İSİM

       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

BİLDİRİM

       #include <sys/types.h>
       #include <sys/socket.h>

       ssize_t recv (int sockfd, void *buf, size_t len, int flags);

       ssize_t recvfrom (int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr,
                        socklen_t *addrlen);

       ssize_t recvmsg (int sockfd, struct msghdr *msg, int flags);

AÇIKLAMA

       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);

       çağrısı

           recvfrom(sockfd, buf, len, flags, NULL, NULL);

       çağrısına eşdeğerdir.

       Üç 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ğerleri
       flags değişkeninin değeri aşağıdaki değerlerin VEYAlanmasıyla elde edilir.

       MSG_CMSG_CLOEXEC (sadece recvmsg() için geçerlidir, Linux 2.6.23 ve sonrası)
           SCM_RIGHTS işlemi kullanılarak sağlanan UNIX alan dosya tanıtıcısını (unix(7)
           sayfasında açıklanmıştır) close-on-exec kipine ayarlar. Bu kip, open(2) çağrısına ait
           O_CLOEXEC ile aynı sebeplerden ötürü kullanışlıdır.

       MSG_DONTWAIT (Linux 2.2. ve sonrası)
           Engellemesiz işlemi etkinleştirir; eğer işlem engellenirse, EAGAIN veya EWOULDBLOCK
           döner. O_NONBLOCK seçeneği tanımlanmış (fcntl(2) üzerinden F_SETFL işlemi ile) gibi
           davranır, fakat MSG_DONTWAIT çağrıya özel olmasıyla fark oluşturur. O_NONBLOCK
           seçeneği ise açık dosya tanıtıcısı içindir (open(2) sayfasına bakın), çağrı
           sürecindeki tüm evreleri ve aynı zamanda aynı açık dosyanın dosya tanıtıcılarına sahip
           diğer süreçleri de etkiler.

       MSG_ERRQUEUE (Linux 2.2 ve sonrası)
           Bu seçenek, hata kuyruğunun soket hata kuyruğundan alınmasını belirtir. Hata,
           protokole bağlı türden yardımcı veri olarak iletilir (IPv4 için IP_RECVERR). Kullanıcı
           yeteri boyutta bir tampon belirtmelidir. Daha ayrıntılı bilgi için cmsg(3) ve ip(7)
           sayfalarına bakın. Esas paketteki hataya sebep olan yük msg_iovec ile normal veri
           olarak aktarılır. Hataya sebep olan verikatarının özgün hedef adresi msg_name ile
           sağlanır.

           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 *);

           ee_errno kuyruğa alınmış errno hata numarasını içerir. ee_origin hatanın kodda
           oluştuğu yeri gösterir. Diğer alanlar protokole özeldir. SOCK_EE_OFFENDER makrosu,
           yardımcı iletinin göstericisinden kaynaklanan hatanın kaynaklandığı ağ nesnesinin
           adresine bir gösterici döndürür. Eğer adres bilinmiyorsa, sockaddr yapısının sa_family
           alanı AF_UNSPEC içerirken yapının diğer alanları tanımsız kalır. Hataya sebep olan
           paket yükü normal veri olarak aktarılır.

           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.

       MSG_OOB
           Bu seçenek normalde veri akımında alınmayacak bantdışı (Out Of Band) veri alındısı
           isteğinde bulunur. Bazı protokoller hızlandırılmış veriyi normal veri kuyruğunun
           başına yerleştirir, bu yüzden bu seçenek bu tür protokollerde kullanılamaz.

       MSG_PEEK
           Bu seçenek alım işlemini, alım kuyruğunun başındaki veriyi kuyruktaki veriyi silmeden
           almasına neden olur. Bu sebepten, sonraki alım çağrısında aynı veriyi döndürür.

       MSG_TRUNC (Linux 2.2 ve sonrası)
           Ham (AF_PACKET), İnternet verikatarı (Linux 2.4.27/2.6.8 ve sonrası), ağ bağlantısı
           (Linux 2.6.22 ve sonrası) ve UNIX verikatarı (Linux 3.4 ve sonrası) soketleri için:
           Tampona aktarılandan büyük olsa bile, paketin veya verikatarının gerçek uzunluğunu
           döndürür.

           İnternet akım soketleriyle kullanmak için tcp(7) sayfasına bakın.

       MSG_WAITALL (Linux 2.2. ve sonrası)
           Bu seçenek, tüm istekler tamamlandığında işlemin engellemesi içindir. Ancak çağrı, bir
           sinyal yakaladığında, bir hata veya bağlantı kopması meydana geldiğinde, alınacak
           kuyruktaki verinin türü alınan veri türünden farklıysa daha az veri döndürür. Bu
           seçeneğin verikatarı soketleri için herhangi bir etkisi yoktur.

   recvfrom()
       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()
       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);

       çağrısıyla eşdeğerdir.

   recvmsg()
       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 */
           };

       Soket bağlantısızsa, msg_name alanı çağrıcı tarafından tahsis edilen kaynak adresi
       döndürmek için kullanılan tampona göstericidir. Çağrıcı çağrıyı yapmadan önce tamponun
       boyutunu msg_namelen’e belirtmelidir; başarılı bir çağrıdan sonra msg_namelen dönen
       adresin uzunluğunu içerir. Eğer uygulama kaynak adresi bilmeye ihtiyaç duymuyorsa msg_name
       NULL olarak belirtilebilir.

       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[];  */
           };

       Yardımcı veriye sadece cmsg(3) içinde tanımlanan makrolarla erişilmedir.

       Ö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:

       MSG_EOR
           Döndürülen verilerin bir kaydı tamamladığını yani kayıt sonunu (End Of Record)
           belirtir (genellikle SOCK_SEQPACKET türündeki soketlerle kullanılır).

       MSG_TRUNC
           Verikatarının sağlanan tampondan daha uzun olmasından dolayı kalan kısmın atılacağını
           belirtir.

       MSG_CTRUNC
           Yardımcı veri için tampondaki boşluğun az olmasından dolayı denetim verisinin
           atılacağını belirtir.

       MSG_OOB
           Hızlandırılmış veya bantdışı (Out Of Band) veri alındığını belirtir.

       MSG_ERRQUEUE
           Bir veri alınmadığını ancak soket hata kuyruğundaki genişletilmiş bir hatanın
           alındığını belirtir.

DÖNÜŞ DEĞERİ

       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.

HATALAR

       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.

       EAGAIN veya EWOULDBLOCK
           Soket engellemesiz olarak işaretlenmiş ama talep edilen işlem soketi engelleyecek veya
           veri alım zaman aşımı ayarlanmış ve veri gelmeden önce zaman aşımı süresi dolmuş.
           POSIX.1 her iki hatanın da döndürülmesine izin verir ve bu sabitlerin aynı değerde
           olmasını gerektirmez, bu bakımdan taşınabilir uygulamalar her iki seçeneği de
           sınamalıdır.

       EBADF
           Belirtilen sockfd geçerli bir açık dosya tanıtıcısı değil.

       ECONNREFUSED
           Uzak konak ağ bağlantısını reddetti (genelde sebep, talep edilen hizmeti
           çalıştırmamasıdır).

       EFAULT
           Alım tamponu göstericisi/göstericileri süreç adres alanının dışını gösteriyor.

       EINTR
           Herhangi bir veri alınmadan aktarım bir sinyal ile kesilmiş; signal(7) sayfasına
           bakın.

       EINVAL
           Belirtilen değişken geçersiz.

       ENOMEM
           recvmsg() için yeterli bellek ayrılamıyor.

       ENOTCONN
           Soket, bağlantılı bir protokolle ilişkilendirilmiş ancak bağlanmamış (connect(2) ve
           accept(2) sayfalarına bakın).

       ENOTSOCK
           Belirtilen sockfd’nin bir soketle ilgisi yok.

UYUMLULUK

       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.

EK BİLGİ

       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.

ÖRNEKLER

       recvfrom() kullanım örneği getaddrinfo(3) sayfasında verilmiştir.

İLGİLİ BELGELER

       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)

ÇEVİREN

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