send ve recv
- C kursu
- İleri seviye
- Ders 29/83
- 5 dk
send ve recv ile veri alışverişi öğrenirsin.
send ve recv
send(fd, buf, n, 0), bağlantılı sokete n bayt yollar. Dönüş değeri gönderilen bayt sayısıdır. recv(fd, buf, n, 0), soketten en fazla n bayt okur.
Son parametre 0 varsayılan bayraktır; MSG_NOSIGNAL gibi seçenekler de vardır. recv bağlantı kapandığında 0 döndürür. read ve write da soketlerle çalışır; send/recv ise ek bayrak desteği verir.
socketpair
socketpair(AF_UNIX, SOCK_STREAM, 0, sv), birbirine bağlı iki soket oluşturur ve sv[0] ile sv[1]'e yazar. Birinin yazdığını diğeri okur.
Bu, aynı süreç içinde veya fork sonrası ebeveyn-çocuk arası iletişim için idealdir. Sunucu-istemci kurmadan hızlı test yaparsın: send(sv[0], msg, n, 0) yazar, recv(sv[1], buf, n, 0) okur. Ağ adresi veya bind gerekmez; bağlantı kuruludur.
Uygulama socketpair ile veri al
int sv[2]; socketpair(AF_UNIX, SOCK_STREAM, 0, sv); ile iki soket oluştur. send(sv[0], "merhaba", 7, 0); ile yaz. char buf[16]; memset(buf, 0, sizeof(buf)); recv(sv[1], buf, 7, 0); ile oku. printf("%s\n", buf); ile yazdır.
Başlangıç kodu
#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <unistd.h>
// socketpair ile iki soket oluştur
// send ile yaz, recv ile oku
// buf'u yazdır
int main(void) {
return 0;
}Örnek çözüm
#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <unistd.h>
int main(void) {
int sv[2];
socketpair(AF_UNIX, SOCK_STREAM, 0, sv);
send(sv[0], "merhaba", 7, 0);
char buf[16];
memset(buf, 0, sizeof(buf));
recv(sv[1], buf, 7, 0);
printf("%s\n", buf);
close(sv[0]);
close(sv[1]);
return 0;
}Beklenen çıktı
merhaba
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 Veri alışverişi fonksiyonlarını eşle
| Kavram | Anlamı |
|---|---|
send |
Veri yollar |
recv |
Veri alır |
socketpair |
İki bağlı soket |
MSG_NOSIGNAL |
Sinyal engeli |
2 recv bağlantı kapandığında ne döndürür?
- 0 Doğru cevap
- -1
- 1
- EOF
Açıklama: recv bağlantı kapandığında 0 döndürür.
3 send çağrısı
send(____, msg, 7, 0);
send(sv[0], msg, 7, 0);
Açıklama: send(sv[0], ...) birinci sokete yazar.