Seperti yang dikatakan halaman manual, soket Unix selalu dapat diandalkan. Perbedaan antara SOCK_STREAM
dan SOCK_DGRAM
ada dalam semantik mengkonsumsi data dari soket.
Soket aliran memungkinkan untuk membaca jumlah byte yang sewenang-wenang, tetapi tetap mempertahankan urutan byte. Dengan kata lain, pengirim dapat menulis 4K data ke soket, dan penerima dapat menggunakan data tersebut byte demi byte. Sebaliknya juga benar - pengirim dapat menulis beberapa pesan kecil ke soket yang dapat dikonsumsi penerima dalam sekali baca. Soket aliran tidak mempertahankan batas pesan.
Soket datagram, di sisi lain, mempertahankan batas-batas ini - satu tulisan oleh pengirim selalu sesuai dengan yang dibaca oleh penerima (bahkan jika buffer penerima diberikan ke read(2)
atau recv(2)
lebih kecil dari pesan itu).
Jadi, jika protokol aplikasi Anda memiliki pesan kecil dengan batas atas ukuran pesan yang diketahui, Anda lebih baik menggunakan SOCK_DGRAM
karena itu lebih mudah dikelola.
Jika protokol Anda memanggil payload pesan panjang yang sewenang-wenang, atau hanya aliran yang tidak terstruktur (seperti audio mentah atau semacamnya), maka pilih SOCK_STREAM
dan lakukan buffering yang diperlukan.
Performa harus sama karena kedua jenis hanya menggunakan memori dalam kernel lokal, hanya manajemen buffer yang berbeda.
-
Salah satu perbedaan yang mungkin adalah batasan pesan. Datagram akan dikirimkan secara keseluruhan dengan datagram menjadi batas pesan alami. Dengan soket aliran, Anda dapat membaca N byte dan soket akan memblokir hingga N byte siap. Tapi ini berarti tidak ada batasan pesan yang jelas.
-
Semua hal dianggap sama, jika kecepatan menjadi perhatian, instrumen dan ukuran. (Saya asumsikan Anda sudah tahu bahwa hanya stream socket yang menyediakan transportasi in-order bawaan yang andal, dan hanya soket datagram yang dapat digunakan untuk mengirim ke banyak penerima).
Perbedaan utamanya adalah salah satunya adalah berbasis koneksi (STREAM
) dan yang lainnya tanpa koneksi (DGRAM
) - perbedaan antara komunikasi berorientasi aliran dan paket biasanya kurang penting.
Dengan SOCK_STREAM
Anda masih mendapatkan semua penanganan koneksi, yaitu listen
/accept
dan Anda dapat mengetahui apakah koneksi ditutup oleh pihak lain.
Perhatikan bahwa ada juga SEQPACKET
jenis soket yang masih berorientasi koneksi, tetapi mempertahankan batas pesan (yang mungkin menyelamatkan Anda dari penerapan lapisan berorientasi pesan di atas STREAM
soket).
Saya berharap kinerja transfer data serupa untuk semua jenis ini, perbedaan utamanya adalah semantik yang Anda inginkan.