BIND(2) | Sistem Çağrıları | BIND(2) |
İSİM¶
bind - adresi soketle ilişkilendirir
BİLDİRİM¶
#include <sys/types.h> /* NOTLAR’a bakın */ #include <sys/socket.h>
- int bind
- (int sockfd, const struct sockaddr *addr, socklen_t addrlen);
AÇIKLAMA¶
socket(2) kullanılarak bir soket oluşturulduğunda, bu soket bir isim uzayında (adres ailesi) ortaya çıksa da ona bağlı bir adres bulunmaz. bind(), addr ile belirtilen adresi sockfd ile belirtilen soket ile ilişkilendirir. addrlen, addr ile belirtilen adres yapısının bayt cinsinden uzunluğunu belirler. Geleneksel olarak bu işleme "sokete isim vermek" denir.
SOCK_STREAM soketine gelen bağlantılar kabul edilmeden önce bir yerel adresi soket ile bind() kullanarak ilişkilendirmek gerekir (accept(2) sayfasına bakın).
İlişkilendirmenin kuralları kullanılan adres ailesine göre değişir. Daha ayrıntılı bilgi edimnek için 7. bölüme ait şu kılavuz sayfalarına bakın. AF_INET için ip(7), AF_INET6 için ipv6(7), AF_UNIX için unix(7), AF_APLETALK için ddp(7), AF_PACKET için packet(7), AF_X25 için x25(7), AF_NETLINK için netlink(7).
addr için girilen asıl yapı adres ailesine göre değişir. sockaddr yapısı şu şekile tanımlanmıştır.
struct sockaddr {
sa_family_t sa_family;
char sa_data[14]; }
DÖNÜŞ DEĞERݶ
Başarılı durumunda sıfır döner. Hata durumunda -1 dönder ve hata errno değişkenine atanır.
HATALAR¶
- EACCES
- Adres korumalı ve kullanıcı root değil.
- EADDRINUSE
- Belirtilen adres kullanımda.
- EADDRINUSE
- (İnternet alanı soketleri için) sockfd ile belirtilen soket, önceden bir adres ile ilişkilendirilmemiş ve soketi geçici bir portla ilişkilendirmeye çalışırken geçici port aralığındaki tüm portların kullanımda olduğu anlaşılmış. ip(7) sayfasındaki /proc/sys/net/ipv4/ip_local_port_range ile ilgili açıklamaya bakınız.
- EBADF
- Belirtilen sockfd uygun bir dosya tanıtıcısı değil.
- EINVAL
- Soket zaten bir adres ile ilişkilendirilmiş.
- EINVAL
- addrlen yanlış ya da addr bu soketin alanı için geçerli değil.
- ENOTSOCK
- Belirtilen sockfd’nin bir soketle ilgisi yok.
Aşağıdaki hatalar sadece UNIX (AF_UNIX) alan soketleri için geçerlidir.
- EACCES
- Verilen dizindeki bir bölüm için arama izni verilmemiş. (Ayrıca path_resolution(7) sayfasına bakın).
- EADDRNOTAVAIL
- Var olmayan bir arayüz istenmiş veya istenen adres yerelde mevcut değil.
- EFAULT
- addr, kullanıcının erişebileceği adres alanının dışında.
- ELOOP
- addr çözümlenirken çok fazla sembolik bağ ile karşılaşıldı.
- ENAMETOOLONG
- addr çok uzun.
- ENOENT
- Verilen soket dizinindeki bir bölüm mevcut değil.
- ENOMEM
- Yeterli çekirdek belleği yok.
- ENOTDIR
- Yolun bir bölümü dizin değil.
- EROFS
- Soket düğümü salt-okunur bir dosya sisteminde yer alıyor.
UYUMLULUK¶
POSIX.1-2001, POSIX.1-2008, SVr4, 4.4BSD (bind() ilk defa 4.2BSD ile ortaya çıktı).
NOTLAR¶
POSIX.1’de, <sys/types.h> dahil edilmeyi gerektirmez ve yine bu başlık dosyası Linux’da da gerekmez. Fakat bazı tarihsel (BSD) uygulamalardan ötürü bu başlık dosyasının olması gerekir ve uygulamaların taşınabilirliği için dahil edilmesi akıllıca olacaktır.
socklen_t’nin arka planı için accept(2) sayfasına bakın.
HATALAR¶
Şeffaf vekil için seçenekler açıklanmamıştır.
ÖRNEKLER¶
bind() işlevinin internet alan soketleriyle kullanım örneğini getaddrinfo(3) sayfasında bulabilirsiniz.
Aşağıdaki örnek, bir akım soketinin UNIX (AF_UNIX) alan adıyla nasıl ilişkilendirileceğini ve gelen bağlantıların nasıl kabul edileceğinizi gösterir.
#include <sys/socket.h> #include <sys/un.h> #include <stdlib.h> #include <stdio.h> #include <string.h> #define SOKET_YOLU "/somepath" #define LISTEN_BACKLOG 50 #define hatayı_işle(msg) \
do { perror(msg); exit(EXIT_FAILURE); } while (0) int main(int argc, char *argv[]) {
int sfd, cfd;
struct sockaddr_un benim_addr, karşı_addr;
socklen_t karşı_addr_boyut;
sfd = socket(AF_UNIX, SOCK_STREAM, 0);
if (sfd == -1)
hatayı_işle("socket");
memset(&benim_addr, 0, sizeof(benim_addr));
/* Yapıyı temizle */
benim_addr.sun_family = AF_UNIX;
strncpy(benim_addr.sun_path, SOKET_YOLU,
sizeof(benim_addr.sun_path) - 1);
if (bind(sfd, (struct sockaddr *) &benim_addr,
sizeof(benim_addr)) == -1)
hatayı_işle("bind");
if (listen(sfd, LISTEN_BACKLOG) == -1)
hatayı_işle("listen");
/* Artık gelen bağlantılar accept(2) kullanılarak
tek tek kabul edilebilir.*/
karşı_addr_boyut = sizeof(karşı_addr);
cfd = accept(sfd, (struct sockaddr *) &karşı_addr,
&karşı_addr_boyut);
if (cfd == -1)
hatayı_işle("accept");
/* Gelen bağlantılarla ilgilenecek kod... */
/* Artık ihtiyaç yoksa, soket yol adı, SOKET_YOLU unlink(2) veya remove(3)
kullanılarak silinmelidir. */ }
İLGİLİ BELGELER¶
accept(2), connect(2), getsockname(2), listen(2), socket(2), getaddrinfo(3), getifaddrs(3), ip(7), ipv6(7), path_resolution(7), socket(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.
1 Kasım 2020 | Linux man-pages 5.10 |