C
Soket katmanı
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.
Örnek çözümü göster
#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;
}
Kendini test et
-
socket çağrısı
int fd = socket(AF_UNIX, SOCK_STREAM, ____);
Cevabı göster
int fd = socket(AF_UNIX, SOCK_STREAM, 0);
-
Soket adımlarını eşle
- socket
- Soket oluştur
- bind
- Adrese bağla
- listen
- Dinlemeye başla
- unlink
- Eski soketi sil
-
bind ne yapar?
- Soketi adrese bağlar
- Soket oluşturur
- Bağlantı kabul eder
- Veri gönderir
Cevabı göster
Soketi adrese bağlar — bind soketi bir adrese (ör. dosya yoluna) bağlar.
Sıradaki ders: IPC ve senkronizasyon