C
Özet - Soket programlama
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.
Örnek çözümü göster
#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;
}
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.
Kendini test et
-
Echo sunucusu hangi sırayı izler?
- connect, send, recv
- accept, recv, send
- send, recv, connect
- recv, accept, send
Cevabı göster
accept, recv, send — Sunucu: accept, recv, send (geleni geri yollar).
-
Sunucu adımlarını eşle
- socket
- Soket oluştur
- bind
- Adrese bağla
- listen
- Dinle
- accept
- Bağlantı kabul et
Sıradaki ders: Pipe