Kelas CSocketFile
Objek yang CFile
digunakan untuk mengirim dan menerima data di seluruh jaringan melalui Windows Sockets.
Sintaks
class CSocketFile : public CFile
Anggota
Konstruktor Publik
Nama | Deskripsi |
---|---|
CSocketFile::CSocketFile | Membuat CSocketFile objek. |
Keterangan
Anda dapat melampirkan CSocketFile
objek ke CSocket
objek untuk tujuan ini. Anda juga dapat, dan biasanya melakukannya, melampirkan CSocketFile
objek ke CArchive
objek untuk menyederhanakan pengiriman dan penerimaan data menggunakan serialisasi MFC.
Untuk membuat serialisasi (mengirim) data, Anda menyisipkannya ke dalam arsip, yang memanggil CSocketFile
fungsi anggota untuk menulis data ke CSocket
objek. Untuk mendeserialisasi (menerima) data, Anda mengekstrak dari arsip. Hal ini menyebabkan arsip memanggil CSocketFile
fungsi anggota untuk membaca data dari CSocket
objek.
Tip
Selain menggunakan CSocketFile
seperti yang dijelaskan di sini, Anda dapat menggunakannya sebagai objek file yang berdiri sendiri, seperti yang Anda bisa dengan CFile
, kelas dasarnya. Anda juga dapat menggunakan CSocketFile
dengan fungsi serialisasi MFC berbasis arsip apa pun. Karena CSocketFile
tidak mendukung semua CFile
fungsionalitas, beberapa fungsi serialisasi MFC default tidak kompatibel dengan CSocketFile
. Ini terutama berlaku untuk kelas ini CEditView
. Anda tidak boleh mencoba menserialisasikan CEditView
data melalui objek yang CArchive
dilampirkan ke CSocketFile
objek menggunakan CEditView::SerializeRaw
; gunakan CEditView::Serialize
sebagai gantinya. Fungsi mengharapkan SerializeRaw
objek file memiliki fungsi, seperti Seek
, yang CSocketFile
tidak memiliki.
Ketika Anda menggunakan CArchive
dengan CSocketFile
dan CSocket
, Anda mungkin mengalami situasi di mana CSocket::Receive
memasuki perulangan (dengan PumpMessages(FD_READ)
) menunggu jumlah byte yang diminta. Ini karena soket Windows hanya mengizinkan satu panggilan recv per pemberitahuan FD_READ, tetapi CSocketFile
dan CSocket
mengizinkan beberapa panggilan recv per FD_READ. Jika Anda mendapatkan FD_READ ketika tidak ada data untuk dibaca, aplikasi macet. Jika Anda tidak pernah mendapatkan FD_READ lain, aplikasi berhenti berkomunikasi melalui soket.
Anda dapat mengatasi masalah ini sebagai berikut. OnReceive
Dalam metode kelas soket Anda, panggil CAsyncSocket::IOCtl(FIONREAD, ...)
sebelum Anda memanggil Serialize
metode kelas pesan Anda ketika data yang diharapkan dibaca dari soket melebihi ukuran satu paket TCP (unit transmisi maksimum media jaringan, biasanya setidaknya 1096 byte). Jika ukuran data yang tersedia kurang dari yang diperlukan, tunggu semua data diterima dan hanya kemudian mulai operasi baca.
Dalam contoh berikut, m_dwExpected
adalah perkiraan jumlah byte yang diharapkan pengguna untuk menerima. Diasumsikan bahwa Anda mendeklarasikannya di tempat lain dalam kode Anda.
void CChatSocket::OnReceive(int nErrorCode)
{
CSocket::OnReceive(nErrorCode);
DWORD dwReceived;
if (IOCtl(FIONREAD, &dwReceived))
{
if (dwReceived >= m_dwExpected) // Process only if you have enough data
m_pDoc->ProcessPendingRead();
}
else
{
// Error handling here
}
}
Untuk informasi selengkapnya, lihat Windows Sockets di MFC, Windows Sockets: Menggunakan Soket dengan Arsip, serta Windows Sockets 2 API.
Hierarki Warisan
CSocketFile
Persyaratan
Header: afxsock.h
CSocketFile::CSocketFile
Membuat CSocketFile
objek.
explicit CSocketFile(
CSocket* pSocket,
BOOL bArchiveCompatible = TRUE);
Parameter
pSocket
Soket untuk dilampirkan ke CSocketFile
objek.
bArchiveCompatible
Menentukan apakah objek file digunakan dengan CArchive
objek. Teruskan FALSE hanya jika Anda ingin menggunakan CSocketFile
objek dengan cara yang berdiri sendiri seperti yang Anda lakukan pada objek yang berdiri sendiri CFile
, dengan batasan tertentu. Bendera ini mengubah cara CArchive
objek yang dilampirkan ke CSocketFile
objek mengelola buffernya untuk dibaca.
Keterangan
Destruktor objek memisahkan diri dari objek soket ketika objek keluar dari cakupan atau dihapus.
Catatan
Juga CSocketFile
dapat digunakan sebagai file (terbatas) tanpa CArchive
objek. Secara default, CSocketFile
parameter bArchiveCompatible konstruktor adalah TRUE. Ini menentukan bahwa objek file digunakan dengan arsip. Untuk menggunakan objek file tanpa arsip, berikan FALSE di parameter bArchiveCompatible .
Dalam mode "kompatibel arsip", objek memberikan performa yang CSocketFile
lebih baik dan mengurangi bahaya "kebuntuan." Kebuntuan terjadi ketika soket pengiriman dan penerimaan saling menunggu, atau untuk sumber daya umum. Situasi ini mungkin terjadi jika CArchive
objek bekerja dengan CSocketFile
cara yang dilakukannya dengan CFile
objek. Dengan CFile
, arsip dapat mengasumsikan bahwa jika menerima lebih sedikit byte daripada yang diminta, akhir file telah tercapai.
Dengan CSocketFile
, namun, data berbasis pesan; buffer dapat berisi beberapa pesan, sehingga menerima lebih sedikit dari jumlah byte yang diminta tidak menyiratkan akhir file. Aplikasi tidak memblokir dalam hal ini karena mungkin dengan CFile
, dan dapat terus membaca pesan dari buffer sampai buffer kosong. Fungsi CArchive::IsBufferEmpty berguna untuk memantau status buffer arsip dalam kasus seperti itu.
Untuk informasi selengkapnya tentang penggunaan CSocketFile
, lihat artikel Windows Sockets: Menggunakan Soket dengan Arsip dan Soket Windows: Contoh Soket Menggunakan Arsip.