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
#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
#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ı
int fd = socket(AF_UNIX, SOCK_STREAM, ____);
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.