Bagikan melalui


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 CFilefungsionalitas, 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

CObject

CFile

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.

Lihat juga

Kelas CFile
Bagan Hierarki
Kelas CAsyncSocket
Kelas CSocket