BIND(2) | Sistem Çağrıları | BIND(2) |
bind - adresi soketle ilişkilendirir
#include <sys/types.h> /* NOTLAR’a bakın */ #include <sys/socket.h>
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]; }
Başarılı durumunda sıfır döner. Hata durumunda -1 dönder ve hata errno değişkenine atanır.
Aşağıdaki hatalar sadece UNIX (AF_UNIX) alan soketleri için geçerlidir.
POSIX.1-2001, POSIX.1-2008, SVr4, 4.4BSD (bind() ilk defa 4.2BSD ile ortaya çıktı).
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.
Şeffaf vekil için seçenekler açıklanmamıştır.
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. */ }
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)
© 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 |