CodeBlanks Logo Icon CodeBlanks

Özet - Soket programlama

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

socket, bind ve accept'i birleştirerek bir echo sunucusu yazarsın.

Echo sunucusu

Bu grupta soket programlamanın temelini öğrendin: socket ile oluştur, bind ile bağla, listen ile dinle, accept ile kabul et, connect ile bağlan ve send/recv ile veri alışverişi yap.

Şimdi bunları birleştirerek bir echo sunucusu yazacaksın: sunucu bağlantı kabul eder, istemciden veri alır ve aynısını geri yollar. İstemci gönderir, sunucu geri yollar ve istemci yazdırır. Bu, gerçek dünya sunucularının iskeletidir.

Uygulama Echo sunucusu yaz

Soket oluştur, bind, listen. fork ile çocuk istemci olsun: connect, send(cfd, "echo", 4, 0), recv(cfd, cbuf, 4, 0). Ebeveyn sunucu: accept, recv(client_fd, buf, 4, 0), send(client_fd, buf, 4, 0), printf("%s\n", buf). Yol /tmp/cb_e.sock.

Başlangıç kodu

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

// soket oluştur, bind ve listen çağır
// fork ile çocuk istemci: connect, send, recv
// ebeveyn accept, recv, send ve yazdır

int main(void) {
    return 0;
}

Örnek çözüm

main.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <unistd.h>
#include <sys/wait.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_e.sock", sizeof(addr.sun_path) - 1);
    unlink("/tmp/cb_e.sock");
    bind(listen_fd, (struct sockaddr *)&addr, sizeof(addr));
    listen(listen_fd, 1);
    pid_t pid = fork();
    if (pid == 0) {
        int cfd = socket(AF_UNIX, SOCK_STREAM, 0);
        connect(cfd, (struct sockaddr *)&addr, sizeof(addr));
        send(cfd, "echo", 4, 0);
        char cbuf[16];
        memset(cbuf, 0, sizeof(cbuf));
        recv(cfd, cbuf, 4, 0);
        close(cfd);
        _exit(0);
    }
    int client_fd = accept(listen_fd, NULL, NULL);
    char buf[16];
    memset(buf, 0, sizeof(buf));
    recv(client_fd, buf, 4, 0);
    send(client_fd, buf, 4, 0);
    printf("%s\n", buf);
    close(client_fd);
    close(listen_fd);
    unlink("/tmp/cb_e.sock");
    wait(NULL);
    return 0;
}

Beklenen çıktı

echo

Sonraki adımlar

Soket programlamayı öğrendin. Bu temeller, ağ sunucularının, istemcilerin ve süreçler arası iletişimin çekirdeğidir.

Sunucu ve istemci ayrı makinelerde de çalışabilir; AF_INET ile IP adresi ve port kullanırsın. İş parçacıklarıyla birleştirip her istemci için bir iş parçacığı oluşturursun. Çoklu bağlantı için select veya poll kullanılır. Öğrendiğin read ve write çağrıları burada da aynıdır.

Soru ve cevaplar

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

1 Echo sunucusu hangi sırayı izler?

  • connect, send, recv
  • accept, recv, send Doğru cevap
  • send, recv, connect
  • recv, accept, send

Açıklama: Sunucu: accept, recv, send (geleni geri yollar).

2 Sunucu adımlarını eşle

Kavram Anlamı
socket Soket oluştur
bind Adrese bağla
listen Dinle
accept Bağlantı kabul et

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