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
#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
#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ı
connect(fd, (struct sockaddr *)&____, sizeof(addr));
connect(fd, (struct sockaddr *)&addr, sizeof(addr));
Açıklama: connect, addr adres yapısını kullanarak bağlanır.