net.tcp: Koneksi dan transfer

TCP Menjelaskan struktur hasil, tanggung jawab transfer sebagian dan pemutusan hubungan.

Wave Foundation

Periksa hasil koneksi

std::net::tcp
tcp_connect_addr(addr: SocketAddr) -> NetResult<TcpStream>
tcp_bind_loopback(port: u16) -> NetResult<TcpListener>
tcp_accept(listener: TcpListener) -> NetResult<TcpStream>
tcp_read(stream: TcpStream, buf: ptr<u8>, size: i64) -> i64
tcp_write_all(stream: TcpStream, buf: ptr<u8>, size: i64) -> i64
tcp_read_exact(stream: TcpStream, buf: ptr<u8>, size: i64) -> i64
tcp_close(stream: TcpStream) -> NetError
tcp_close_listener(listener: TcpListener) -> NetError

Fungsi tautan NetResult<T> memiliki ok, value, dan error. Gunakan value hanya jika berhasil. NetError berisi klasifikasi kesalahan yang dinormalisasi dan native_code, dan keberhasilan dapat diperiksa dengan error.kind == NET_ERROR_NONE. Konstanta ini diambil dari std::net::error.

Aliran yang terhubung dan aliran yang diterima dengan accept masing-masing harus ditutup. Menutup pendengar tidak berarti menutup semua aliran yang telah diterimanya. Jangan tutup setiap salinan struktur.

TCP tidak mempertahankan batasan pesan

Jangan berasumsi bahwa semua yang pernah Anda tulis akan kembali lagi kepada Anda setelah Anda membacanya. Protokol harus dibatasi oleh awalan panjang, pembatas, atau panjang tetap. Panjang tetap ditangani oleh tcp_read_exact, dan aliran dengan panjang yang tidak diketahui ditangani oleh iterasi baca dan pemrosesan EOF.

Angka negatif adalah kesalahan, dan dalam pembacaan panjang positif, 0 adalah ujung dari ujung lainnya. write_all Beberapa data mungkin telah dikirim sebelum kegagalan. Jika Anda mengirimkan ulang konten yang sama dari awal, konten tersebut mungkin terduplikasi.

Batas waktu dan waktu tunggu

Fungsi default blocking dapat menunggu lama di sisi lain. Untuk program yang memerlukan batasan waktu, pilih seri tcp_connect_addr_timeout, tcp_read_timeout, tcp_write_timeout. Periksa faktor milidetik dan konsekuensi kesalahan, dan rancang juga rute di mana pihak lain tidak merespons. Penggunaan asinkron task bersama dengan jaringan asinkron terkait API.

pencarian alamat · Klien lokal yang sudah selesai

Kriteria pemilihan fungsi membaca

diperlukan tindakan fungsi nilai untuk diperiksa
Baca beberapa data yang tiba tcp_read Kesalahan negatif, penghentian nol, jumlah byte positif
Bacalah dengan panjang tertentu tcp_read_exact Apakah panjang permintaan sudah dibaca secara lengkap?
Kirim konten yang diberikan sampai akhir tcp_write_all Panjang Permintaan dan Nilai Pengembalian
Batas waktu tunggu timeout Seri Hasil pengembalian dan kesalahan timeout

Untuk protokol dengan bidang panjang empat byte yang diikuti oleh isi, pertama-tama baca bidang panjang lengkap, periksa apakah panjangnya tidak melebihi maksimum yang diizinkan, lalu alokasikan ruang untuk isi. Jangan mengalokasikan memori dalam jumlah besar dari panjang yang tidak divalidasi yang disediakan oleh rekan.

Kapan harus menutup koneksi

Meskipun fungsi baca mengembalikan 0, sumber daya aliran lokal tetap ada. Setelah selesai membaca, hubungi tcp_close. Jika Anda menggunakan jalur pembersihan yang sama bahkan setelah terjadi kesalahan transmisi, Anda tidak akan lupa untuk menutup jalur normal dan gagal.

Listener adalah sumber daya yang menerima koneksi baru, dan stream adalah sumber daya komunikasi yang sudah terhubung. Saat membuat server, Anda mengelola kedua jenis tersebut. Setiap kali accept berhasil, aliran baru dibuat, jadi kami menutupnya setelah memprosesnya, dan menutup pendengar ketika iterasi penerimaan server selesai.

Cobalah sendiri

Praktek Klien TCP Lokal berisi kode lengkap untuk server dan klien. Anda dapat membedakan antara pencarian alamat dan kegagalan koneksi dengan membandingkan kasus ketika server dijalankan terlebih dahulu, ketika tidak ada server, dan ketika nomor port berbeda.