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
, , ReceiveFrom
Send
, 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 CArchive
objek , 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
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 denganCArchive
objek.Catatan
Fungsi
Accept
anggota mengambil referensi ke objek kosongCSocket
baru sebagai parameternya. Anda harus membuat objek ini sebelum memanggilAccept
. Perlu diingat bahwa jika objek soket ini keluar dari cakupan, koneksi ditutup. Jangan panggilCreate
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