Bagikan melalui


CSocket Kelas

Berasal dari CAsyncSocket, mewarisi enkapsulasiNYA dari Windows Sockets API, dan mewakili tingkat abstraksi yang CAsyncSocket lebih tinggi daripada objek.

Sintaks

class CSocket : public CAsyncSocket

Anggota

Konstruktor Publik

Nama Deskripsi
CSocket::CSocket Membuat CSocket objek.

Metode Publik

Nama Deskripsi
CSocket::Attach Melampirkan SOCKET handel ke CSocket objek.
CSocket::CancelBlockingCall Membatalkan panggilan pemblokiran yang saat ini sedang berlangsung.
CSocket::Create Membuat soket.
CSocket::FromHandle Mengembalikan penunjuk ke CSocket objek, dengan SOCKET handel.
CSocket::IsBlocking Menentukan apakah panggilan pemblokiran sedang berlangsung.

Metode yang Dilindungi

Nama Deskripsi
CSocket::OnMessagePending Dipanggil untuk memproses pesan yang tertunda sambil menunggu panggilan pemblokiran selesai.

Keterangan

CSocket bekerja dengan kelas CSocketFile dan CArchive untuk mengelola pengiriman dan penerimaan data.

Objek CSocket juga menyediakan pemblokiran, yang penting untuk operasi sinkron .CArchive Memblokir fungsi, seperti Receive, , ReceiveFromSend, SendTo, dan Accept (semua diwariskan dari CAsyncSocket), jangan mengembalikan WSAEWOULDBLOCK kesalahan dalam CSocket. Sebagai gantinya, fungsi-fungsi ini menunggu hingga operasi selesai. Selain itu, panggilan asli akan berakhir dengan kesalahan WSAEINTR jika CancelBlockingCall dipanggil saat salah satu fungsi ini memblokir.

Untuk menggunakan CSocket objek, panggil konstruktor, lalu panggil Create untuk membuat handel yang mendasar SOCKET (jenis SOCKET). Parameter Create default membuat soket aliran, tetapi jika Anda tidak menggunakan soket dengan CArchive objek, Anda dapat menentukan parameter untuk membuat soket datagram sebagai gantinya, atau mengikat port tertentu untuk membuat soket server. Sambungkan ke soket klien menggunakan Connect di sisi klien dan Accept di sisi server. Kemudian buat CSocketFile objek dan kaitkan ke CSocket objek di CSocketFile konstruktor. Selanjutnya, buat CArchive objek untuk dikirim dan objek untuk menerima data (sesuai kebutuhan), lalu kaitkan dengan CSocketFile objek di CArchive konstruktor. Ketika komunikasi selesai, hancurkan CArchiveobjek , CSocketFile, dan CSocket . Jenis SOCKET data dijelaskan dalam artikel Windows Sockets: Background.

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 FD_READ pemberitahuan, 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 yang lain FD_READ, 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
   }
}

Catatan

Saat menggunakan soket MFC di utas sekunder dalam aplikasi MFC yang ditautkan secara statis, Anda harus memanggil AfxSocketInit di setiap utas yang menggunakan soket untuk menginisialisasi pustaka soket. Secara default, AfxSocketInit hanya dipanggil di utas utama.

Untuk informasi selengkapnya, lihat Soket Windows di MFC, Windows Sockets: Menggunakan Soket dengan Arsip, Soket Windows: Cara Kerja Soket dengan Arsip, Soket Windows: Urutan Operasi, Soket Windows: Contoh Soket Menggunakan Arsip.

Hierarki Warisan

CObject

CAsyncSocket

CSocket

Persyaratan

Header: afxsock.h

CSocket::Attach

Panggil fungsi anggota ini untuk melampirkan hSocket handel ke CSocket objek.

BOOL Attach(SOCKET hSocket);

Parameter

hSocket
Berisi handel ke soket.

Tampilkan Nilai

Bukan nol jika fungsi berhasil.

Keterangan

Handel SOCKET disimpan di anggota data objek m_hSocket .

Untuk informasi selengkapnya, lihat Soket Windows: Menggunakan Soket dengan Arsip.

Contoh

class CSockThread : public CWinThread
{
public:
   SOCKET m_hConnected;

protected:
   CChatSocket m_sConnected;

   // remainder of class declaration omitted.

 

BOOL CSockThread::InitInstance()
{
   // Attach the socket object to the socket handle
   // in the context of this thread.
   m_sConnected.Attach(m_hConnected);
   m_hConnected = NULL;

   return TRUE;
}

 

// This listening socket has been constructed
// in the primary thread.
void CListeningSocket::OnAccept(int nErrorCode)
{
   UNREFERENCED_PARAMETER(nErrorCode);

   // This CSocket object is used just temporarily
   // to accept the incoming connection.
   CSocket sConnected;
   Accept(sConnected);

   // Start the other thread.
   CSockThread *pSockThread = (CSockThread*)AfxBeginThread(
       RUNTIME_CLASS(CSockThread), THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED);
   if (NULL != pSockThread)
   {
      // Detach the newly accepted socket and save
      // the SOCKET handle in our new thread object.
      // After detaching it, it should no longer be
      // used in the context of this thread.
      pSockThread->m_hConnected = sConnected.Detach();
      pSockThread->ResumeThread();
   }
}

CSocket::CancelBlockingCall

Panggil fungsi anggota ini untuk membatalkan panggilan pemblokiran yang sedang berlangsung.

void CancelBlockingCall();

Keterangan

Fungsi ini membatalkan operasi pemblokiran terutang untuk soket ini. Panggilan pemblokiran asli akan berakhir sesegera mungkin dengan kesalahan WSAEINTR.

Dalam kasus operasi pemblokiran Connect , implementasi Windows Sockets akan mengakhiri panggilan pemblokiran sesegera mungkin, tetapi mungkin tidak mungkin bagi sumber daya soket untuk dirilis sampai koneksi selesai (dan kemudian direset) atau waktu habis. Ini kemungkinan akan terlihat hanya jika aplikasi segera mencoba membuka soket baru (jika tidak ada soket yang tersedia), atau untuk terhubung ke rekan yang sama.

Membatalkan operasi apa pun selain Accept dapat meninggalkan soket dalam status yang tidak ditentukan. Jika aplikasi membatalkan operasi pemblokiran pada soket, satu-satunya operasi yang dapat diandalkan aplikasi untuk dapat dilakukan pada soket adalah panggilan ke Close, meskipun operasi lain dapat bekerja pada beberapa implementasi Windows Sockets. Jika Anda menginginkan portabilitas maksimum untuk aplikasi Anda, Anda harus berhati-hati agar tidak bergantung pada melakukan operasi setelah pembatalan.

Untuk informasi selengkapnya, lihat Soket Windows: Menggunakan Soket dengan Arsip.

CSocket::Create

Create Panggil fungsi anggota setelah membuat objek soket untuk membuat soket Windows dan melampirkannya.

BOOL Create(
    UINT nSocketPort = 0,
    int nSocketType = SOCK_STREAM,
    LPCTSTR lpszSocketAddress = NULL);

Parameter

nSocketPort
Port tertentu digunakan dengan soket, atau 0 jika Anda ingin MFC memilih port.

nSocketType
SOCK_STREAM atau SOCK_DGRAM.

lpszSocketAddress
Penunjuk ke string yang berisi alamat jaringan soket yang terhubung, angka putus-putus seperti "128.56.22.8". Meneruskan string NULL untuk parameter ini menunjukkan instans CSocket harus mendengarkan aktivitas klien di semua antarmuka jaringan.

Tampilkan Nilai

Bukan nol jika fungsi berhasil; jika tidak, 0, dan kode kesalahan tertentu dapat diambil dengan memanggil GetLastError.

Keterangan

Create lalu memanggil Bind untuk mengikat soket ke alamat yang ditentukan. Jenis soket berikut ini didukung:

  • SOCK_STREAM Menyediakan aliran byte berbasis koneksi berurutan, andal, dua arah. Menggunakan Protokol Kontrol Transmisi (TCP) untuk keluarga alamat Internet.

  • SOCK_DGRAM Mendukung datagram, yang merupakan buffer tanpa koneksi dan tidak dapat diandalkan dengan panjang maksimum tetap (biasanya kecil). Menggunakan Protokol Datagram Pengguna (UDP) untuk keluarga alamat Internet. Untuk menggunakan opsi ini, Anda tidak boleh menggunakan soket dengan CArchive objek.

    Catatan

    Fungsi Accept anggota mengambil referensi ke objek kosong CSocket baru sebagai parameternya. Anda harus membuat objek ini sebelum memanggil Accept. Perlu diingat bahwa jika objek soket ini keluar dari cakupan, koneksi ditutup. Jangan panggil Create untuk objek soket baru ini.

Untuk informasi selengkapnya tentang soket aliran dan datagram, lihat artikel Soket Windows: Latar Belakang, Soket Windows: Port dan Alamat Soket, dan Soket Windows: Menggunakan Soket dengan Arsip.

CSocket::CSocket

Membuat CSocket objek.

CSocket();

Keterangan

Setelah konstruksi, Anda harus memanggil Create fungsi anggota.

Untuk informasi selengkapnya, lihat Soket Windows: Menggunakan Soket dengan Arsip.

CSocket::FromHandle

Mengembalikan penunjuk ke CSocket objek.

static CSocket* PASCAL FromHandle(SOCKET hSocket);

Parameter

hSocket
Berisi handel ke soket.

Tampilkan Nilai

Penunjuk ke CSocket objek, atau NULL jika tidak CSocket ada objek yang dilampirkan ke hSocket.

Keterangan

Saat diberikan SOCKET handel, jika CSocket objek tidak dilampirkan ke handel, fungsi anggota mengembalikan NULL dan tidak membuat objek sementara.

Untuk informasi selengkapnya, lihat Soket Windows: Menggunakan Soket dengan Arsip.

CSocket::IsBlocking

Panggil fungsi anggota ini untuk menentukan apakah panggilan pemblokiran sedang berlangsung.

BOOL IsBlocking();

Tampilkan Nilai

Bukan nol jika soket memblokir; jika tidak, 0.

Keterangan

Untuk informasi selengkapnya, lihat Soket Windows: Menggunakan Soket dengan Arsip.

CSocket::OnMessagePending

Ambil alih fungsi anggota ini untuk mencari pesan tertentu dari Windows dan meresponsnya di soket Anda.

virtual BOOL OnMessagePending();

Tampilkan Nilai

Bukan nol jika pesan ditangani; jika tidak, 0.

Keterangan

Ini adalah pengalih tingkat lanjut.

Kerangka kerja memanggil OnMessagePending saat soket memompa pesan Windows untuk memberi Anda kesempatan untuk menangani pesan yang menarik bagi aplikasi Anda. Untuk contoh bagaimana Anda dapat menggunakan OnMessagePending, lihat artikel Windows Sockets: Turun dari Kelas Soket.

Untuk informasi selengkapnya, lihat Soket Windows: Menggunakan Soket dengan Arsip.

Lihat juga

CAsyncSocket Kelas
Bagan Hierarki
CAsyncSocket Kelas
CSocketFile Kelas