CodeBlanks Logo Icon CodeBlanks

Soket katmanı

  • C kursu
  • İleri seviye
  • Ders 81/83
  • 6 dk

Soket ile ağ iletişim katmanı yazarsın.

Soket katmanı

Bu derste server_setup işlevini tanımlayacaksın. AF_UNIX soketi oluşturur, /tmp/cb_p.sock yoluna bağlar ve dinlemeye başlar. Başarıda tanıtıcı, hatada -1 döner.

Adımlar: socket(AF_UNIX, SOCK_STREAM, 0), adres yapısını memset ile sıfırla, sun_family = AF_UNIX, strncpy ile yolu kopyala, unlink ile eski soketi sil, bind, listen(fd, 1). Bu desen, Unix soket şunucusunun klasik kurulumudur. Önceki derslerin main'i bu dersin başlangıç koduna dahildir.

Adres yapısı

struct sockaddr_un addr; tanımlarsın. memset(&addr, 0, sizeof(addr)) ile sıfırla; addr.sun_family = AF_UNIX; ve strncpy(addr.sun_path, "/tmp/cb_p.sock", sizeof(addr.sun_path) - 1);.

unlink("/tmp/cb_p.sock"); ile eski soket dosyasını sil; yoksa bind hata verir. Sonra bind(fd, (struct sockaddr *)&addr, sizeof(addr)) ve listen(fd, 1). return fd;. Main'de int sfd = server_setup(); ve printf("soket: %d\n", sfd >= 0 ? 1 : 0);. Çıktıya "soket: 1" eklenir.

Uygulama server_setup'ı ekle

int server_setup(void) yaz: int 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_p.sock", sizeof(addr.sun_path) - 1);, unlink("/tmp/cb_p.sock");, bind(fd, (struct sockaddr *)&addr, sizeof(addr));, listen(fd, 1);, return fd;. main'e int sfd = server_setup(); ve printf("soket: %d\n", sfd >= 0 ? 1 : 0); ekle.

Başlangıç kodu

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

int worker_init(void);
int server_setup(void);
int ipc_setup(void);

int worker_count = 0;
pthread_mutex_t worker_lock = PTHREAD_MUTEX_INITIALIZER;

void *worker_fn(void *arg) {
    (void)arg;
    pthread_mutex_lock(&worker_lock);
    worker_count++;
    pthread_mutex_unlock(&worker_lock);
    return NULL;
}

int worker_init(void) {
    pthread_t t;
    pthread_create(&t, NULL, worker_fn, NULL);
    pthread_join(t, NULL);
    return 1;
}

// server_setup fonksiyonunu yaz: AF_UNIX soket oluştur, bind, listen yap
// soket tanıtıcısı döndür (>= 0 ise başarılı)

int main(void) {
    printf("Proje hazır\n");
    worker_init();
    printf("sayaç: %d\n", worker_count);
    // server_setup çağır ve "soket: 1" yazdır
    return 0;
}

Örnek çözüm

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

int worker_init(void);
int server_setup(void);
int ipc_setup(void);

int worker_count = 0;
pthread_mutex_t worker_lock = PTHREAD_MUTEX_INITIALIZER;

void *worker_fn(void *arg) {
    (void)arg;
    pthread_mutex_lock(&worker_lock);
    worker_count++;
    pthread_mutex_unlock(&worker_lock);
    return NULL;
}

int worker_init(void) {
    pthread_t t;
    pthread_create(&t, NULL, worker_fn, NULL);
    pthread_join(t, NULL);
    return 1;
}

int server_setup(void) {
    int 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_p.sock", sizeof(addr.sun_path) - 1);
    unlink("/tmp/cb_p.sock");
    bind(fd, (struct sockaddr *)&addr, sizeof(addr));
    listen(fd, 1);
    return fd;
}

int main(void) {
    printf("Proje hazır\n");
    worker_init();
    printf("sayaç: %d\n", worker_count);
    int sfd = server_setup();
    printf("soket: %d\n", sfd >= 0 ? 1 : 0);
    return 0;
}

Beklenen çıktı

Proje hazır
sayaç: 1
soket: 1

Soru ve cevaplar

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

1 socket çağrısı

Soru
int fd = socket(AF_UNIX, SOCK_STREAM, ____);
Cevap
int fd = socket(AF_UNIX, SOCK_STREAM, 0);

Açıklama: Üçüncü parametre 0; öntanımlı protokol.

2 Soket adımlarını eşle

Kavram Anlamı
socket Soket oluştur
bind Adrese bağla
listen Dinlemeye başla
unlink Eski soketi sil

3 bind ne yapar?

  • Soketi adrese bağlar Doğru cevap
  • Soket oluşturur
  • Bağlantı kabul eder
  • Veri gönderir

Açıklama: bind soketi bir adrese (ör. dosya yoluna) bağlar.

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