Ö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
#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
#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 |