CodeBlanks Logo Icon CodeBlanks

connect

  • C kursu
  • İleri seviye
  • Ders 28/83
  • 5 dk

connect ile istemci bağlantısı öğrenirsin.

connect

connect(fd, (struct sockaddr *)&addr, sizeof(addr)), istemciyi sunucuya bağlar. addr, sunucunun adresiyle aynı şekilde doldurulur. Başarıda 0, hatada -1 döner.

İstemci önce socket ile soket oluşturur, sonra connect ile bağlanır. Bağlantı kurulduktan sonra send ve recv ile veri alışverişi yapılır. connect başarısız olursa sunucu dinlemiyor olabilir; errno'ya bak.

İstemci-sunucu deseni

Klasik desende sunucu socket, bind, listen, accept adımlarını izler; istemci ise socket ve connect. Bağlantı kurulduktan sonra iki taraf da send ve recv kullanır.

Sunucu ve istemci farklı programlar olabileceği gibi, aynı programda fork ile de çalıştırılabilir. Çocuk süreç istemci, ebeveyn sunucu rolünü üstlenir. Bu, test için kullanışlı bir desendir; sıralama garantilidir.

Uygulama İstemci olarak bağlan

Soket oluştur, bind ve listen(listen_fd, 1). fork() ile çocuk sunucu olsun: accept(listen_fd, NULL, NULL). Ebeveyn istemci: int cfd = socket(AF_UNIX, SOCK_STREAM, 0); ve connect(cfd, (struct sockaddr *)&addr, sizeof(addr));. printf("bağlandı\n");. Yol /tmp/cb_c.sock.

Başlangıç kodu

main.c
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <unistd.h>
#include <string.h>

// soket oluştur, bind ve listen çağır
// fork ile çocuk sunucu olsun, accept yapsın
// ebeveyn connect ile bağlan ve yazdır

int main(void) {
    return 0;
}

Örnek çözüm

main.c
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <unistd.h>
#include <string.h>

int main(void) {
    int listen_fd = socket(AF_UNIX, SOCK_STREAM, 0);
    struct sockaddr_un addr;
    memset(&addr, 0, sizeof(addr));
    addr.sun_family = AF_UNIX;
    strncpy(addr.sun_path, "/tmp/cb_c.sock", sizeof(addr.sun_path) - 1);
    unlink("/tmp/cb_c.sock");
    bind(listen_fd, (struct sockaddr *)&addr, sizeof(addr));
    listen(listen_fd, 1);
    pid_t pid = fork();
    if (pid == 0) {
        int sfd = accept(listen_fd, NULL, NULL);
        close(sfd);
        _exit(0);
    }
    int cfd = socket(AF_UNIX, SOCK_STREAM, 0);
    connect(cfd, (struct sockaddr *)&addr, sizeof(addr));
    printf("bağlandı\n");
    close(cfd);
    close(listen_fd);
    unlink("/tmp/cb_c.sock");
    return 0;
}

Beklenen çıktı

bağlandı

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 connect fonksiyonu kim tarafından çağrılır?

  • Sunucu
  • Çekirdek
  • init süreci
  • İstemci Doğru cevap

Açıklama: connect istemci tarafından çağrılır.

2 İstemci fonksiyonlarını eşle

Kavram Anlamı
connect Sunucuya bağlanır
socket Soket oluşturur
send Veri yollar
recv Veri alır

3 connect çağrısı

Soru
connect(fd, (struct sockaddr *)&____, sizeof(addr));
Cevap
connect(fd, (struct sockaddr *)&addr, sizeof(addr));

Açıklama: connect, addr adres yapısını kullanarak bağlanır.

İleri seviye bölümündeki tüm dersler