SEND(2) | Sistem Çağrıları | SEND(2) |
send - bağlantılı soket üzerinden
ileti yollar
sendto - bağlantısız soket üzerinden ileti yollar
sendmsg - soket üzerinden bir dizi ileti yollar
#include <sys/types.h> #include <sys/socket.h>
send(), sendto() ve sendmsg() sistem çağrıları bir başka sokete ileti aktarmakta kullanılır.
send() çağrısı soket sadece connected (bağlantılı) durumda ise kullanılabilir (böylece amaçlanan alıcı biliniyor olur). send() ve write(2) arasındaki tek fark flags değişkeninin varlığıdır. Sıfır değeri atanmış flags değişkeni kullanan send() ile write(2) eşdeğerdir. Ayrıca aşağıdaki
send(sockfd, buf, len, flags);
sendto(sockfd, buf, len, flags, NULL, 0);
Eğer sendto() bağlantılı bir soket (SOCK_STREAM, SOCK_SEQPACKET) ile kullanılırsa, dest_addr ve addrlen değişkenleri görmezden gelinir (eğer bunlar NULL ve 0 değilse EISCONN hatası dönebilir) ve eğer soket bağlanmadıysa ENOTCONN hatası döner. Bağlantısız soketle kullanımda, dest_addr hedefin adresini, addrlen ise hedef adresin boyutunu belirler. sendmsg() için hedef adres msg.msg_name ile belirtilir ve msg.msg_namelen boyutunu belirler.
send() ve sendto() için, ileti buf tamponu içinde tutulur ve len uzunluktadır. sendmsg() için, ileti msg.msg_iov dizisindeki öğelerle gösterilir. sendmsg() çağrısı yardımcı verinin de yollanmasını sağlar (denetim bilgisi de denir).
Eğer ileti ilgili protokol için bütün olarak gönderilemeyecek kadar uzunsa, EMGSIZE hatası döner ve ileti gönderilmez.
send() işlevinde teslimatın yapılmadığını gösteren hiçbir belirti yoktur. Yerel olarak hatalar -1 dönüş değeri ile saptanır.
İleti soketin gönderim tamponuna sığmadığında, send() eğer soket engellemesiz G/Ç kipine alınmadıysa engellenir. Engellemesiz kip başarısız olduğunda EAGAIN veya EWOULDBLOCK döner. select(2) çağrısı daha fazla veri gönderme olasılığını saptamak için kullanılabilir.
flags değişkeninin değeri ya sıfırdır ya da aşağıdaki sabitlerin bit düzeyinde veyalanmasıyla elde edilir.
Linux 2.6’dan itibaren, bu seçenek UDP soketleri için de desteklenmektedir. Çekirdeğe, sadece bu seçenek belirtilmeksizin yapılan bir çağrı ile aktarım yapılan tek bir verikatarına gönderilecek tüm veriyi bu seçenek kullanılarak yapılan çağrılarla gönderilecek şekilde paketlemesini söyler. (Ayrıca udp(7)’de açıklanan UDP_CORK soket seçeneğine de bakın.)
sendmsg() ile kullanılan msghdr yapısının tanımı:
struct msghdr {
void *msg_name; /* isteğe bağlı adres */
socklen_t msg_namelen; /* adresin boyutu */
struct iovec *msg_iov; /* dağıtma/toplama dizisi */
size_t msg_iovlen; /* msg_iov içindeki öğe sayısı */
void *msg_control; /* yardımcı veri, aşağıya bakınız */
size_t msg_controllen; /* yardımcı veri tampon boyutu */
int msg_flags; /* seçenekler (kullanılmıyor) */
};
msg_iov ve msg_iovlen alanları writev(2) çağrısındaki gibi dağıtma-toplama konumlarını belirtir.
msg_control ve msg_controllen kullanılarak denetim bilgisi (yardımcı bilgi) gönderilebilir. Çekirdeğin soket başına işleyebileceği denetim tamponunun azami boyutu /proc/sys/net/core/optmem_max içindeki değerle sınırlanmıştır; socket(7) sayfasına bakın. Yardımcı verilerin çeşitli soketlerde kullanımına ilişkin ayrıntılılı bilgi edinmek için unix(7) ve ip(7) sayfasına bakın.
msg_flags alanı görmezden gelinir.
Başarı durumunda bu çağrılar gönderilen baytların sayısını döndürür. Hata durumunda, -1 döner ve hata errno değişkenine atanır.
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.
(UDP soketleri için) Ağ/yayın adresine veri yollanmak için girişimde bulunulmuş ancak adres tek nokta için.
4.4BSD, SVr4, POSIX.1-2001. Bu arayüzler ilk defa 4.2BSD ile ortaya çıktı.
POSIX.1-2001 sadece MSG_OOB ve MSG_EOR seçeneklerini açıklar. POSIX.1-2008 MSG_NOSIGNAL’e bir belirtim ekler. MSG_CONFIRM seçeneği ise Linux eklentisidir.
POSIX.1-2001’e göre, msghdr yapısının msg_controllen alanı socklen_t türünden, 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ı iletmek için kullanılan Linux’a özgü sistem çağrısı hakkında bilgi edinmek için sendmmsg(2) sayfasına bakın.
Linux, ENOTCONN yerine EPIPE döndürebilir.
sendto() kullanım örneği getaddrinfo(3) sayfasında verilmiştir.
fcntl(2), getsockopt(2), recv(2), select(2), sendfile(2), sendmmsg(2), shutdown(2), socket(2), write(2), cmsg(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.
1 Kasım 2020 | Linux man-pages 5.10 |