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];
    }

Bu yapının tek amacı addr ile verilen yapı göstericisinin türünü derleyici hatalarını önlemek için dönüştürmektir. ÖRNEKLER bölümüne bakın.

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.