Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Mewakili Soket Windows — titik akhir komunikasi jaringan.
Sintaks
class CAsyncSocket : public CObject
Anggota
Konstruktor Publik
| Nama | Deskripsi |
|---|---|
CAsyncSocket::CAsyncSocket |
Membuat CAsyncSocket objek. |
Metode Publik
| Nama | Deskripsi |
|---|---|
CAsyncSocket::Accept |
Menerima koneksi pada soket. |
CAsyncSocket::AsyncSelect |
Meminta pemberitahuan peristiwa untuk soket. |
CAsyncSocket::Attach |
Melampirkan handel soket ke CAsyncSocket objek. |
CAsyncSocket::Bind |
Mengaitkan alamat lokal dengan soket. |
CAsyncSocket::Close |
Menutup soket. |
CAsyncSocket::Connect |
Membuat koneksi ke soket serekan. |
CAsyncSocket::Create |
Membuat soket. |
CAsyncSocket::CreateEx |
Membuat soket dengan opsi tingkat lanjut. |
CAsyncSocket::Detach |
Melepaskan handel soket dari CAsyncSocket objek. |
CAsyncSocket::FromHandle |
Mengembalikan penunjuk ke CAsyncSocket objek, dengan handel soket. |
CAsyncSocket::GetLastError |
Mendapatkan status kesalahan untuk operasi terakhir yang gagal. |
CAsyncSocket::GetPeerName |
Mendapatkan alamat soket serekan tempat soket tersambung. |
CAsyncSocket::GetPeerNameEx |
Mendapatkan alamat soket serekan tempat soket terhubung (menangani alamat IPv6). |
CAsyncSocket::GetSockName |
Mendapatkan nama lokal untuk soket. |
CAsyncSocket::GetSockNameEx |
Mendapatkan nama lokal untuk soket (menangani alamat IPv6). |
CAsyncSocket::GetSockOpt |
Mengambil opsi soket. |
CAsyncSocket::IOCtl |
Mengontrol mode soket. |
CAsyncSocket::Listen |
Menetapkan soket untuk mendengarkan permintaan koneksi masuk. |
CAsyncSocket::Receive |
Menerima data dari soket. |
CAsyncSocket::ReceiveFrom |
Menerima datagram dan menyimpan alamat sumber. |
CAsyncSocket::ReceiveFromEx |
Menerima datagram dan menyimpan alamat sumber (menangani alamat IPv6). |
CAsyncSocket::Send |
Mengirim data ke soket yang tersambung. |
CAsyncSocket::SendTo |
Mengirim data ke tujuan tertentu. |
CAsyncSocket::SendToEx |
Mengirim data ke tujuan tertentu (menangani alamat IPv6). |
CAsyncSocket::SetSockOpt |
Mengatur opsi soket. |
CAsyncSocket::ShutDown |
Send Menonaktifkan dan/atau Receive panggilan pada soket. |
CASyncSocket::Socket |
Mengalokasikan handel soket. |
Metode yang Dilindungi
| Nama | Deskripsi |
|---|---|
CAsyncSocket::OnAccept |
Memberi tahu soket mendengarkan bahwa ia dapat menerima permintaan koneksi yang tertunda dengan memanggil Accept. |
CAsyncSocket::OnClose |
Memberi tahu soket bahwa soket yang tersambung ke soket telah ditutup. |
CAsyncSocket::OnConnect |
Memberi tahu soket penghubung bahwa upaya koneksi selesai, baik berhasil atau dalam kesalahan. |
CAsyncSocket::OnOutOfBandData |
Memberi tahu soket penerima bahwa ada data di luar band yang akan dibaca di soket, biasanya pesan mendesak. |
CAsyncSocket::OnReceive |
Memberi tahu soket mendengarkan bahwa ada data yang akan diambil dengan memanggil Receive. |
CAsyncSocket::OnSend |
Memberi tahu soket bahwa ia dapat mengirim data dengan memanggil Send. |
Operator Publik
| Nama | Deskripsi |
|---|---|
| CAsyncSocket::operator = | Menetapkan nilai baru ke CAsyncSocket objek. |
| CAsyncSocket::operator SOCKET | Gunakan operator ini untuk mengambil SOCKET handel CAsyncSocket objek. |
Anggota Data Publik
| Nama | Deskripsi |
|---|---|
CAsyncSocket::m_hSocket |
Menunjukkan handel yang SOCKET dilampirkan ke objek ini CAsyncSocket . |
Keterangan
Kelas CAsyncSocket merangkum WINDOWS Socket Functions API, menyediakan abstraksi berorientasi objek untuk programmer yang ingin menggunakan Soket Windows bersama dengan MFC.
Kelas ini didasarkan pada asumsi bahwa Anda memahami komunikasi jaringan. Anda bertanggung jawab untuk menangani pemblokiran, perbedaan urutan byte, dan konversi antara string Unicode dan set karakter multibyte (MBCS). Jika Anda menginginkan antarmuka yang lebih nyaman yang mengelola masalah ini untuk Anda, lihat kelas CSocket.
Untuk menggunakan CAsyncSocket objek, panggil konstruktornya, lalu panggil Create fungsi untuk membuat handel soket yang mendasar (jenis SOCKET), kecuali pada soket yang diterima. Untuk soket server, panggil Listen fungsi anggota, dan untuk soket klien, panggil Connect fungsi anggota. Soket server harus memanggil Accept fungsi saat menerima permintaan koneksi. Gunakan fungsi yang tersisa CAsyncSocket untuk melakukan komunikasi antar soket. Setelah selesai, hancurkan CAsyncSocket objek jika dibuat pada tumpukan; destruktor secara otomatis memanggil Close fungsi. Jenis SOCKET data dijelaskan dalam artikel Windows Sockets: Background.
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 Windows Sockets: Menggunakan Kelas CAsyncSocket dan artikel terkait., serta Windows Sockets 2 API.
Hierarki Warisan
CAsyncSocket
Persyaratan
Header :afxsock.h
CAsyncSocket::Accept
Panggil fungsi anggota ini untuk menerima koneksi pada soket.
virtual BOOL Accept(
CAsyncSocket& rConnectedSocket,
SOCKADDR* lpSockAddr = NULL,
int* lpSockAddrLen = NULL);
Parameter
rConnectedSocket
Referensi yang mengidentifikasi soket baru yang tersedia untuk koneksi.
lpSockAddr
Penunjuk ke SOCKADDR struktur yang menerima alamat soket penghubung, seperti yang diketahui di jaringan. Format lpSockAddr argumen yang tepat ditentukan oleh keluarga alamat yang ditetapkan ketika soket dibuat. Jika lpSockAddr dan/atau lpSockAddrLen sama dengan NULL, maka tidak ada informasi tentang alamat jarak jauh soket yang diterima yang dikembalikan.
lpSockAddrLen
Penunjuk ke panjang alamat dalam lpSockAddr byte.
lpSockAddrLen adalah parameter hasil nilai: awalnya harus berisi jumlah ruang yang ditujukan oleh lpSockAddr; saat dikembalikan akan berisi panjang aktual (dalam byte) alamat yang dikembalikan.
Tampilkan Nilai
Bukan nol jika fungsi berhasil; jika tidak, 0, dan kode kesalahan tertentu dapat diambil dengan memanggil GetLastError. Kesalahan berikut berlaku untuk fungsi anggota ini:
WSANOTINITIALISEDKeberhasilanAfxSocketInitharus terjadi sebelum menggunakan API ini.WSAENETDOWNImplementasi Windows Sockets mendeteksi bahwa subsistem jaringan gagal.WSAEFAULTArgumenlpSockAddrLenterlalu kecil (kurang dariSOCKADDRukuran struktur).WSAEINPROGRESSPanggilan Windows Sockets pemblokiran sedang berlangsung.WSAEINVALListentidak dipanggil sebelum menerima.WSAEMFILEAntrean kosong saat masuk untuk menerima dan tidak ada deskriptor yang tersedia.WSAENOBUFSTidak ada ruang buffer yang tersedia.WSAENOTSOCKDeskriptor bukan soket.WSAEOPNOTSUPPSoket yang direferensikan bukan jenis yang mendukung layanan berorientasi koneksi.WSAEWOULDBLOCKSoket ditandai sebagai nonblocking dan tidak ada koneksi yang akan diterima.
Keterangan
Rutinitas ini mengekstrak koneksi pertama dalam antrean koneksi yang tertunda, membuat soket baru dengan properti yang sama dengan soket ini, dan melampirkannya ke rConnectedSocket. Jika tidak ada koneksi yang tertunda yang ada pada antrean, Accept mengembalikan nol dan GetLastError mengembalikan kesalahan. Soket yang diterima (rConnectedSocket) tidak dapat digunakan untuk menerima lebih banyak koneksi. Soket asli tetap terbuka dan mendengarkan.
Argumen lpSockAddr adalah parameter hasil yang diisi dengan alamat soket penghubung, seperti yang diketahui oleh lapisan komunikasi.
Accept digunakan dengan jenis soket berbasis koneksi seperti SOCK_STREAM.
CAsyncSocket::AsyncSelect
Panggil fungsi anggota ini untuk meminta pemberitahuan peristiwa untuk soket.
BOOL AsyncSelect(long lEvent = FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE);
Parameter
lEvent
Bitmask yang menentukan kombinasi peristiwa jaringan di mana aplikasi tertarik.
FD_READIngin menerima pemberitahuan kesiapan untuk membaca.FD_WRITEIngin menerima pemberitahuan saat data tersedia untuk dibaca.FD_OOBIngin menerima pemberitahuan kedatangan data di luar band.FD_ACCEPTIngin menerima pemberitahuan koneksi masuk.FD_CONNECTIngin menerima pemberitahuan hasil koneksi.FD_CLOSEIngin menerima pemberitahuan ketika soket telah ditutup oleh serekan.
Tampilkan Nilai
Bukan nol jika fungsi berhasil; jika tidak, 0, dan kode kesalahan tertentu dapat diambil dengan memanggil GetLastError. Kesalahan berikut berlaku untuk fungsi anggota ini:
WSANOTINITIALISEDKeberhasilanAfxSocketInitharus terjadi sebelum menggunakan API ini.WSAENETDOWNImplementasi Windows Sockets mendeteksi bahwa subsistem jaringan gagal.WSAEINVALMenunjukkan bahwa salah satu parameter yang ditentukan tidak valid.WSAEINPROGRESSOperasi Pemblokiran Windows Sockets sedang berlangsung.
Keterangan
Fungsi ini digunakan untuk menentukan fungsi pemberitahuan panggilan balik MFC mana yang akan dipanggil untuk soket.
AsyncSelect secara otomatis mengatur soket ini ke mode nonblokir. Untuk informasi selengkapnya, lihat artikel Windows Sockets: Socket Notifications.
CAsyncSocket::Attach
Panggil fungsi anggota ini untuk melampirkan hSocket handel ke CAsyncSocket objek.
BOOL Attach(
SOCKET hSocket, long lEvent = FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE);
Parameter
hSocket
Berisi handel ke soket.
lEvent
Bitmask yang menentukan kombinasi peristiwa jaringan di mana aplikasi tertarik.
FD_READIngin menerima pemberitahuan kesiapan untuk membaca.FD_WRITEIngin menerima pemberitahuan saat data tersedia untuk dibaca.FD_OOBIngin menerima pemberitahuan kedatangan data di luar band.FD_ACCEPTIngin menerima pemberitahuan koneksi masuk.FD_CONNECTIngin menerima pemberitahuan hasil koneksi.FD_CLOSEIngin menerima pemberitahuan ketika soket telah ditutup oleh serekan.
Tampilkan Nilai
Bukan nol jika fungsi berhasil.
Keterangan
Handel SOCKET disimpan di anggota data objek m_hSocket .
CAsyncSocket::Bind
Panggil fungsi anggota ini untuk mengaitkan alamat lokal dengan soket.
BOOL Bind(
UINT nSocketPort,
LPCTSTR lpszSocketAddress = NULL);
BOOL Bind (
const SOCKADDR* lpSockAddr,
int nSockAddrLen);
Parameter
nSocketPort
Port yang mengidentifikasi aplikasi soket.
lpszSocketAddress
Alamat jaringan, nomor putus-putus seperti "128.56.22.8". Meneruskan NULL string untuk parameter ini menunjukkan instans CAsyncSocket harus mendengarkan aktivitas klien di semua antarmuka jaringan.
lpSockAddr
Penunjuk ke SOCKADDR struktur yang berisi alamat yang akan ditetapkan ke soket ini.
nSockAddrLen
Panjang alamat dalam lpSockAddr byte.
Tampilkan Nilai
Bukan nol jika fungsi berhasil; jika tidak, 0, dan kode kesalahan tertentu dapat diambil dengan memanggil GetLastError. Daftar berikut ini mencakup beberapa kesalahan yang mungkin dikembalikan. Untuk daftar lengkapnya, lihat Kode Kesalahan Soket Windows.
WSANOTINITIALISEDKeberhasilanAfxSocketInitharus terjadi sebelum menggunakan API ini.WSAENETDOWNImplementasi Windows Sockets mendeteksi bahwa subsistem jaringan gagal.WSAEADDRINUSEAlamat yang ditentukan sudah digunakan. (LihatSO_REUSEADDRopsi soket di bawahSetSockOpt.)WSAEFAULTArgumennSockAddrLenterlalu kecil (kurang dariSOCKADDRukuran struktur).WSAEINPROGRESSPanggilan Windows Sockets pemblokiran sedang berlangsung.WSAEAFNOSUPPORTKeluarga alamat yang ditentukan tidak didukung oleh port ini.WSAEINVALSoket sudah terikat ke alamat.WSAENOBUFSTidak tersedia cukup buffer, terlalu banyak koneksi.WSAENOTSOCKDeskriptor bukan soket.
Keterangan
Rutinitas ini digunakan pada datagram yang tidak terhubung atau soket streaming, sebelum berikutnya Connect atau Listen panggilan. Sebelum dapat menerima permintaan koneksi, soket server yang mendengarkan harus memilih nomor port dan membuatnya diketahui oleh Windows Sockets dengan memanggil Bind.
Bind menetapkan asosiasi lokal (alamat host/nomor port) soket dengan menetapkan nama lokal ke soket yang tidak disebutkan namanya.
CAsyncSocket::CAsyncSocket
Membuat objek soket kosong.
CAsyncSocket();
Keterangan
Setelah membuat objek, Anda harus memanggil fungsi anggotanya Create untuk membuat SOCKET struktur data dan mengikat alamatnya. (Di sisi server komunikasi Windows Sockets, ketika soket mendengarkan membuat soket untuk digunakan dalam panggilan, Anda tidak memanggil Accept soket tersebutCreate.)
CAsyncSocket::Close
Menutup soket.
virtual void Close();
Keterangan
Fungsi ini merilis deskriptor soket sehingga referensi lebih lanjut ke itu akan gagal dengan kesalahan WSAENOTSOCK. Jika ini adalah referensi terakhir ke soket yang mendasar, informasi penamaan terkait dan data antrean akan dibuang. Destruktor objek soket memanggil Close Anda.
Untuk CAsyncSocket, tetapi tidak untuk CSocket, semantik dipengaruhi Close oleh opsi SO_LINGER soket dan SO_DONTLINGER. Untuk informasi lebih lanjut, lihat fungsi GetSockOptanggota .
CAsyncSocket::Connect
Panggil fungsi anggota ini untuk membuat koneksi ke soket aliran atau datagram yang tidak tersambung.
BOOL Connect(
LPCTSTR lpszHostAddress,
UINT nHostPort);
BOOL Connect(
const SOCKADDR* lpSockAddr,
int nSockAddrLen);
Parameter
lpszHostAddress
Alamat jaringan soket tempat objek ini terhubung: nama komputer seperti "ftp.microsoft.com", atau angka putus-putus seperti "128.56.22.8".
nHostPort
Port yang mengidentifikasi aplikasi soket.
lpSockAddr
Penunjuk ke SOCKADDR struktur yang berisi alamat soket yang tersambung.
nSockAddrLen
Panjang alamat dalam lpSockAddr byte.
Tampilkan Nilai
Bukan nol jika fungsi berhasil; jika tidak, 0, dan kode kesalahan tertentu dapat diambil dengan memanggil GetLastError. Jika ini menunjukkan kode WSAEWOULDBLOCKkesalahan , dan aplikasi Anda menggunakan panggilan balik yang dapat diganti, aplikasi Anda akan menerima pesan OnConnect ketika operasi koneksi selesai. Kesalahan berikut berlaku untuk fungsi anggota ini:
WSANOTINITIALISEDKeberhasilanAfxSocketInitharus terjadi sebelum menggunakan API ini.WSAENETDOWNImplementasi Windows Sockets mendeteksi bahwa subsistem jaringan gagal.WSAEADDRINUSEAlamat yang ditentukan sudah digunakan.WSAEINPROGRESSPanggilan Windows Sockets pemblokiran sedang berlangsung.WSAEADDRNOTAVAILAlamat yang ditentukan tidak tersedia dari komputer lokal.WSAEAFNOSUPPORTAlamat dalam keluarga yang ditentukan tidak dapat digunakan dengan soket ini.WSAECONNREFUSEDUpaya untuk menyambungkan ditolak.WSAEDESTADDRREQAlamat tujuan diperlukan.WSAEFAULTArgumennSockAddrLensalah.WSAEINVALAlamat host tidak valid.WSAEISCONNSoket sudah tersambung.WSAEMFILETidak ada lagi deskriptor file yang tersedia.WSAENETUNREACHJaringan tidak dapat dijangkau dari host ini saat ini.WSAENOBUFSTidak ada ruang buffer yang tersedia. Soket tidak dapat dihubungkan.WSAENOTSOCKDeskriptor bukan soket.WSAETIMEDOUTCoba sambungkan waktu habis tanpa membuat koneksi.WSAEWOULDBLOCKSoket ditandai sebagai nonblocking dan koneksi tidak dapat segera diselesaikan.
Keterangan
Jika soket tidak terikat, nilai unik ditetapkan ke asosiasi lokal oleh sistem, dan soket ditandai sebagai terikat. Perhatikan bahwa jika bidang alamat struktur nama adalah semua nol, Connect akan mengembalikan nol. Untuk mendapatkan informasi kesalahan yang diperluas, panggil GetLastError fungsi anggota.
Untuk soket aliran (jenis SOCK_STREAM), koneksi aktif dimulai ke host asing. Ketika panggilan soket berhasil diselesaikan, soket siap untuk mengirim/menerima data.
Untuk soket datagram (jenis SOCK_DGRAM), tujuan default diatur, yang akan digunakan pada panggilan dan Send berikutnyaReceive.
CAsyncSocket::Create
Create Panggil fungsi anggota setelah membuat objek soket untuk membuat soket Windows dan melampirkannya.
BOOL Create(
UINT nSocketPort = 0,
int nSocketType = SOCK_STREAM,
long lEvent = FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE,
LPCTSTR lpszSocketAddress = NULL);
Parameter
nSocketPort
Port terkenal untuk digunakan dengan soket, atau 0 jika Anda ingin Windows Sockets memilih port.
nSocketType
SOCK_STREAM atau SOCK_DGRAM.
lEvent
Bitmask yang menentukan kombinasi peristiwa jaringan di mana aplikasi tertarik.
FD_READIngin menerima pemberitahuan kesiapan untuk membaca.FD_WRITEIngin menerima pemberitahuan kesiapan untuk menulis.FD_OOBIngin menerima pemberitahuan kedatangan data di luar band.FD_ACCEPTIngin menerima pemberitahuan koneksi masuk.FD_CONNECTIngin menerima pemberitahuan koneksi yang telah selesai.FD_CLOSEIngin menerima pemberitahuan penutupan soket.
lpszSockAddress
Penunjuk ke string yang berisi alamat jaringan soket yang terhubung, angka putus-putus seperti "128.56.22.8". Meneruskan NULL string untuk parameter ini menunjukkan instans CAsyncSocket 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. Kesalahan berikut berlaku untuk fungsi anggota ini:
WSANOTINITIALISEDKeberhasilanAfxSocketInitharus terjadi sebelum menggunakan API ini.WSAENETDOWNImplementasi Windows Sockets mendeteksi bahwa subsistem jaringan gagal.WSAEAFNOSUPPORTKeluarga alamat yang ditentukan tidak didukung.WSAEINPROGRESSOperasi Pemblokiran Windows Sockets sedang berlangsung.WSAEMFILETidak ada lagi deskriptor file yang tersedia.WSAENOBUFSTidak ada ruang buffer yang tersedia. Soket tidak dapat dibuat.WSAEPROTONOSUPPORTPort yang ditentukan tidak didukung.WSAEPROTOTYPEPort yang ditentukan adalah tipe yang salah untuk soket ini.WSAESOCKTNOSUPPORTJenis soket yang ditentukan tidak didukung dalam keluarga alamat ini.
Keterangan
Create
Socket panggilan dan jika berhasil, panggilan akan memanggil Bind untuk mengikat soket ke alamat yang ditentukan. Jenis soket berikut ini didukung:
SOCK_STREAMMenyediakan aliran byte berbasis koneksi yang berurutan, andal, dupleks penuh, dan berbasis koneksi. Menggunakan Protokol Kontrol Transmisi (TCP) untuk keluarga alamat Internet.SOCK_DGRAMMendukung datagram, yang merupakan paket tanpa koneksi dan tidak dapat diandalkan dengan panjang maksimum tetap (biasanya kecil). Menggunakan Protokol Datagram Pengguna (UDP) untuk keluarga alamat Internet.Catatan
Fungsi
Acceptanggota mengambil referensi ke objek kosongCSocketbaru sebagai parameternya. Anda harus membuat objek ini sebelum memanggilAccept. Perlu diingat bahwa jika objek soket ini keluar dari cakupan, koneksi ditutup. Jangan panggilCreateuntuk objek soket baru ini.
Penting
Createtidak aman untuk utas. Jika Anda memanggilnya di lingkungan multi-utas di mana dapat dipanggil secara bersamaan oleh utas yang berbeda, pastikan untuk melindungi setiap panggilan dengan mutex atau kunci sinkronisasi lainnya.
Untuk informasi selengkapnya tentang soket aliran dan datagram, lihat artikel Soket Windows: Soket Latar Belakang dan Windows: Port dan Alamat Soket dan WINDOWS Sockets 2 API.
CAsyncSocket::CreateEx
CreateEx Panggil fungsi anggota setelah membuat objek soket untuk membuat soket Windows dan melampirkannya.
Gunakan fungsi ini saat Anda perlu menyediakan opsi tingkat lanjut seperti jenis soket.
BOOL CreateEx(
ADDRINFOT* pAI,
long lEvent = FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE);
Parameter
pAI
Pointer ke ADDRINFOT untuk menyimpan info soket seperti keluarga dan jenis soket.
lEvent
Bitmask yang menentukan kombinasi peristiwa jaringan di mana aplikasi tertarik.
FD_READIngin menerima pemberitahuan kesiapan untuk membaca.FD_WRITEIngin menerima pemberitahuan kesiapan untuk menulis.FD_OOBIngin menerima pemberitahuan kedatangan data di luar band.FD_ACCEPTIngin menerima pemberitahuan koneksi masuk.FD_CONNECTIngin menerima pemberitahuan koneksi yang telah selesai.FD_CLOSEIngin menerima pemberitahuan penutupan soket.
Tampilkan Nilai
Lihat nilai pengembalian untuk Create().
Keterangan
Lihat komentar untuk Create().
CAsyncSocket::Detach
Panggil fungsi anggota ini untuk melepaskan SOCKET handel di m_hSocket anggota data dari CAsyncSocket objek dan atur m_hSocket ke NULL.
SOCKET Detach();
CAsyncSocket::FromHandle
Mengembalikan penunjuk ke CAsyncSocket objek.
static CAsyncSocket* PASCAL FromHandle(SOCKET hSocket);
Parameter
hSocket
Berisi handel ke soket.
Tampilkan Nilai
Penunjuk ke CAsyncSocket objek, atau NULL jika tidak CAsyncSocket ada objek yang dilampirkan ke hSocket.
Keterangan
Saat diberikan SOCKET handel, jika CAsyncSocket objek tidak dilampirkan ke handel, fungsi anggota mengembalikan NULL.
CAsyncSocket::GetLastError
Panggil fungsi anggota ini untuk mendapatkan status kesalahan untuk operasi terakhir yang gagal.
static int PASCAL GetLastError();
Tampilkan Nilai
Nilai pengembalian menunjukkan kode kesalahan untuk rutinitas Windows Sockets API terakhir yang dilakukan oleh utas ini.
Keterangan
Ketika fungsi anggota tertentu menunjukkan bahwa kesalahan telah terjadi, GetLastError harus dipanggil untuk mengambil kode kesalahan yang sesuai. Lihat deskripsi fungsi masing-masing anggota untuk daftar kode kesalahan yang berlaku.
Untuk informasi selengkapnya tentang kode kesalahan, lihat WINDOWS Sockets 2 API.
CAsyncSocket::GetPeerName
Panggil fungsi anggota ini untuk mendapatkan alamat soket serekan tempat soket ini tersambung.
BOOL GetPeerName(
CString& rPeerAddress,
UINT& rPeerPort);
BOOL GetPeerName(
SOCKADDR* lpSockAddr,
int* lpSockAddrLen);
Parameter
rPeerAddress
Referensi ke CString objek yang menerima alamat IP angka putus-putus.
rPeerPort
Referensi ke yang UINT menyimpan port.
lpSockAddr
Penunjuk ke SOCKADDR struktur yang menerima nama soket serekan.
lpSockAddrLen
Penunjuk ke panjang alamat dalam lpSockAddr byte. Saat dikembalikan, lpSockAddrLen argumen berisi ukuran aktual yang lpSockAddr dikembalikan dalam byte.
Tampilkan Nilai
Bukan nol jika fungsi berhasil; jika tidak, 0, dan kode kesalahan tertentu dapat diambil dengan memanggil GetLastError. Kesalahan berikut berlaku untuk fungsi anggota ini:
WSANOTINITIALISEDKeberhasilanAfxSocketInitharus terjadi sebelum menggunakan API ini.WSAENETDOWNImplementasi Windows Sockets mendeteksi bahwa subsistem jaringan gagal.WSAEFAULTArgumenlpSockAddrLentidak cukup besar.WSAEINPROGRESSPanggilan Windows Sockets pemblokiran sedang berlangsung.WSAENOTCONNSoket tidak tersambung.WSAENOTSOCKDeskriptor bukan soket.
Keterangan
Untuk menangani alamat IPv6, gunakan CAsyncSocket::GetPeerNameEx.
CAsyncSocket::GetPeerNameEx
Panggil fungsi anggota ini untuk mendapatkan alamat soket peer tempat soket ini terhubung (menangani alamat IPv6).
BOOL GetPeerNameEx(
CString& rPeerAddress,
UINT& rPeerPort);
Parameter
rPeerAddress
Referensi ke CString objek yang menerima alamat IP angka putus-putus.
rPeerPort
Referensi ke yang UINT menyimpan port.
Tampilkan Nilai
Bukan nol jika fungsi berhasil; jika tidak, 0, dan kode kesalahan tertentu dapat diambil dengan memanggil GetLastError. Kesalahan berikut berlaku untuk fungsi anggota ini:
WSANOTINITIALISEDKeberhasilanAfxSocketInitharus terjadi sebelum menggunakan API ini.WSAENETDOWNImplementasi Windows Sockets mendeteksi bahwa subsistem jaringan gagal.WSAEFAULTArgumenlpSockAddrLentidak cukup besar.WSAEINPROGRESSPanggilan Windows Sockets pemblokiran sedang berlangsung.WSAENOTCONNSoket tidak tersambung.WSAENOTSOCKDeskriptor bukan soket.
Keterangan
Fungsi ini sama dengan CAsyncSocket::GetPeerName kecuali bahwa ia menangani alamat IPv6 serta protokol yang lebih lama.
CAsyncSocket::GetSockName
Panggil fungsi anggota ini untuk mendapatkan nama lokal untuk soket.
BOOL GetSockName(
CString& rSocketAddress,
UINT& rSocketPort);
BOOL GetSockName(
SOCKADDR* lpSockAddr,
int* lpSockAddrLen);
Parameter
rSocketAddress
Referensi ke CString objek yang menerima alamat IP angka putus-putus.
rSocketPort
Referensi ke yang UINT menyimpan port.
lpSockAddr
Penunjuk ke SOCKADDR struktur yang menerima alamat soket.
lpSockAddrLen
Penunjuk ke panjang alamat dalam lpSockAddr byte.
Tampilkan Nilai
Bukan nol jika fungsi berhasil; jika tidak, 0, dan kode kesalahan tertentu dapat diambil dengan memanggil GetLastError. Kesalahan berikut berlaku untuk fungsi anggota ini:
WSANOTINITIALISEDKeberhasilanAfxSocketInitharus terjadi sebelum menggunakan API ini.WSAENETDOWNImplementasi Windows Sockets mendeteksi bahwa subsistem jaringan gagal.WSAEFAULTArgumenlpSockAddrLentidak cukup besar.WSAEINPROGRESSOperasi Pemblokiran Windows Sockets sedang berlangsung.WSAENOTSOCKDeskriptor bukan soket.WSAEINVALSoket belum terikat ke alamat denganBind.
Keterangan
Panggilan ini sangat berguna ketika Connect panggilan telah dilakukan tanpa melakukan Bind terlebih dahulu; panggilan ini menyediakan satu-satunya cara yang dapat Anda tentukan asosiasi lokal yang telah ditetapkan oleh sistem.
Untuk menangani alamat IPv6, gunakan CAsyncSocket::GetSockNameEx
CAsyncSocket::GetSockNameEx
Panggil fungsi anggota ini untuk mendapatkan nama lokal untuk soket (menangani alamat IPv6).
BOOL GetSockNameEx(
CString& rSocketAddress,
UINT& rSocketPort);
Parameter
rSocketAddress
Referensi ke CString objek yang menerima alamat IP angka putus-putus.
rSocketPort
Referensi ke yang UINT menyimpan port.
Tampilkan Nilai
Bukan nol jika fungsi berhasil; jika tidak, 0, dan kode kesalahan tertentu dapat diambil dengan memanggil GetLastError. Kesalahan berikut berlaku untuk fungsi anggota ini:
WSANOTINITIALISEDKeberhasilanAfxSocketInitharus terjadi sebelum menggunakan API ini.WSAENETDOWNImplementasi Windows Sockets mendeteksi bahwa subsistem jaringan gagal.WSAEFAULTArgumenlpSockAddrLentidak cukup besar.WSAEINPROGRESSOperasi Pemblokiran Windows Sockets sedang berlangsung.WSAENOTSOCKDeskriptor bukan soket.WSAEINVALSoket belum terikat ke alamat denganBind.
Keterangan
Panggilan ini sama dengan CAsyncSocket::GetSockName kecuali bahwa ia menangani alamat IPv6 serta protokol yang lebih lama.
Panggilan ini sangat berguna ketika Connect panggilan telah dilakukan tanpa melakukan Bind terlebih dahulu; panggilan ini menyediakan satu-satunya cara yang dapat Anda tentukan asosiasi lokal yang telah ditetapkan oleh sistem.
CAsyncSocket::GetSockOpt
Panggil fungsi anggota ini untuk mengambil opsi soket.
BOOL GetSockOpt(
int nOptionName,
void* lpOptionValue,
int* lpOptionLen,
int nLevel = SOL_SOCKET);
Parameter
nOptionName
Opsi soket tempat nilai akan diambil.
lpOptionValue
Penunjuk ke buffer tempat nilai untuk opsi yang diminta akan dikembalikan. Nilai yang terkait dengan opsi yang dipilih dikembalikan dalam buffer lpOptionValue. Bilangan bulat yang diarahkan oleh lpOptionLen awalnya harus berisi ukuran buffer ini dalam byte; dan saat dikembalikan, itu akan diatur ke ukuran nilai yang dikembalikan. Untuk SO_LINGER, ini akan menjadi ukuran LINGER struktur; untuk semua opsi lain itu akan menjadi ukuran BOOL atau int, tergantung pada opsi. Lihat daftar opsi dan ukurannya di bagian Keterangan.
lpOptionLen
Penunjuk ke ukuran lpOptionValue buffer dalam byte.
nLevel
Tingkat di mana opsi didefinisikan; satu-satunya tingkat yang didukung adalah SOL_SOCKET dan IPPROTO_TCP.
Tampilkan Nilai
Bukan nol jika fungsi berhasil; jika tidak, 0, dan kode kesalahan tertentu dapat diambil dengan memanggil GetLastError. Jika opsi tidak pernah diatur dengan SetSockOpt, maka GetSockOpt mengembalikan nilai default untuk opsi tersebut. Kesalahan berikut berlaku untuk fungsi anggota ini:
WSANOTINITIALISEDKeberhasilanAfxSocketInitharus terjadi sebelum menggunakan API ini.WSAENETDOWNImplementasi Windows Sockets mendeteksi bahwa subsistem jaringan gagal.WSAEFAULTArgumenlpOptionLentidak valid.WSAEINPROGRESSOperasi Pemblokiran Windows Sockets sedang berlangsung.WSAENOPROTOOPTOpsi tidak diketahui atau tidak didukung. Secara khusus,SO_BROADCASTtidak didukung pada soket jenisSOCK_STREAM, sementaraSO_ACCEPTCONN, ,SO_DONTLINGERSO_KEEPALIVE,SO_LINGER, danSO_OOBINLINEtidak didukung pada soket jenisSOCK_DGRAM.WSAENOTSOCKDeskriptor bukan soket.
Keterangan
GetSockOpt mengambil nilai saat ini untuk opsi soket yang terkait dengan soket jenis apa pun, dalam keadaan apa pun, dan menyimpan hasilnya dalam lpOptionValue. Opsi memengaruhi operasi soket, seperti perutean paket, transfer data di luar band, dan sebagainya.
Opsi berikut didukung untuk GetSockOpt. Jenis mengidentifikasi jenis data yang ditangani oleh lpOptionValue. Opsi TCP_NODELAY menggunakan tingkat IPPROTO_TCP; semua opsi lainnya menggunakan tingkat SOL_SOCKET.
| Nilai | Jenis | Makna |
|---|---|---|
SO_ACCEPTCONN |
BOOL |
Soket mendengarkan. |
SO_BROADCAST |
BOOL |
Soket dikonfigurasi untuk transmisi pesan siaran. |
SO_DEBUG |
BOOL |
Penelusuran kesalahan diaktifkan. |
SO_DONTLINGER |
BOOL |
Jika true, opsi dinonaktifkan SO_LINGER . |
SO_DONTROUTE |
BOOL |
Perutean dinonaktifkan. |
SO_ERROR |
int |
Ambil status kesalahan dan hapus. |
SO_KEEPALIVE |
BOOL |
Tetap hidup sedang dikirim. |
SO_LINGER |
struct LINGER |
Mengembalikan opsi yang masih ada saat ini. |
SO_OOBINLINE |
BOOL |
Data di luar band sedang diterima di aliran data normal. |
SO_RCVBUF |
int |
Ukuran buffer untuk menerima. |
SO_REUSEADDR |
BOOL |
Soket dapat terikat ke alamat yang sudah digunakan. |
SO_SNDBUF |
int |
Ukuran buffer untuk pengiriman. |
SO_TYPE |
int |
Jenis soket (misalnya, SOCK_STREAM). |
TCP_NODELAY |
BOOL |
Menonaktifkan algoritma Nagle untuk mengirim coalescing. |
Opsi Berkeley Software Distribution (BSD) yang tidak didukung untuk GetSockOpt adalah:
| Nilai | Jenis | Makna |
|---|---|---|
SO_RCVLOWAT |
int |
Menerima tanda air rendah. |
SO_RCVTIMEO |
int |
Menerima batas waktu. |
SO_SNDLOWAT |
int |
Kirim tanda air rendah. |
SO_SNDTIMEO |
int |
Kirim batas waktu. |
IP_OPTIONS |
Dapatkan opsi di header IP. | |
TCP_MAXSEG |
int |
Dapatkan ukuran segmen maksimum TCP. |
Memanggil GetSockOpt dengan opsi yang tidak didukung akan mengakibatkan kode WSAENOPROTOOPT kesalahan dikembalikan dari GetLastError.
CAsyncSocket::IOCtl
Panggil fungsi anggota ini untuk mengontrol mode soket.
BOOL IOCtl(
long lCommand,
DWORD* lpArgument);
Parameter
lCommand
Perintah yang akan dilakukan pada soket.
lpArgument
Penunjuk ke parameter untuk lCommand.
Tampilkan Nilai
Bukan nol jika fungsi berhasil; jika tidak, 0, dan kode kesalahan tertentu dapat diambil dengan memanggil GetLastError. Kesalahan berikut berlaku untuk fungsi anggota ini:
WSANOTINITIALISEDKeberhasilanAfxSocketInitharus terjadi sebelum menggunakan API ini.WSAENETDOWNImplementasi Windows Sockets mendeteksi bahwa subsistem jaringan gagal.WSAEINVALlCommandbukan perintah yang valid, ataulpArgumentbukan parameter yang dapat diterima untuklCommand, atau perintah tidak berlaku untuk jenis soket yang disediakan.WSAEINPROGRESSOperasi Pemblokiran Windows Sockets sedang berlangsung.WSAENOTSOCKDeskriptor bukan soket.
Keterangan
Rutinitas ini dapat digunakan pada soket apa pun dalam keadaan apa pun. Ini digunakan untuk mendapatkan atau mengambil parameter operasi yang terkait dengan soket, terlepas dari subsistem protokol dan komunikasi. Perintah berikut ini didukung:
FIONBIOAktifkan atau nonaktifkan mode nonblocking pada soket. ParameterlpArgumentmenunjuk pada , yang bukan nol jika mode nonblokir akan diaktifkan dan nol jika akan dinonaktifkanDWORD. JikaAsyncSelecttelah dikeluarkan pada soket, maka setiap upaya yang digunakanIOCtluntuk mengatur soket kembali ke mode pemblokiran akan gagal denganWSAEINVAL. Untuk mengatur soket kembali ke mode pemblokiran dan mencegahWSAEINVALkesalahan, aplikasi harus terlebih dahulu menonaktifkanAsyncSelectdengan memanggilAsyncSelectdengan parameter sama denganlEvent0, lalu memanggilIOCtl.FIONREADTentukan jumlah maksimum byte yang dapat dibaca dengan satuReceivepanggilan dari soket ini. ParameterlpArgumentmenunjuk diDWORDtempatIOCtlmenyimpan hasilnya. Jika soket ini berjenisSOCK_STREAM,FIONREADmengembalikan jumlah total data yang dapat dibaca dalam satuReceive; ini biasanya sama dengan jumlah total data yang diantrekan pada soket. Jika soket ini berjenisSOCK_DGRAM,FIONREADmengembalikan ukuran datagram pertama yang diantrekan pada soket.SIOCATMARKTentukan apakah semua data di luar band telah dibaca. Ini hanya berlaku untuk soket jenisSOCK_STREAMyang telah dikonfigurasi untuk penerimaan in-line dari data di luar band (SO_OOBINLINE). Jika tidak ada data di luar band yang menunggu untuk dibaca, operasi mengembalikan nonzero. Jika tidak, ia mengembalikan 0, dan berikutnyaReceiveatauReceiveFromdilakukan pada soket akan mengambil beberapa atau semua data sebelum "tanda"; aplikasi harus menggunakanSIOCATMARKoperasi untuk menentukan apakah ada data yang tersisa. Jika ada data normal yang mendahului data "mendesak" (di luar band), data tersebut akan diterima secara berurutan. (Perhatikan bahwaReceiveatauReceiveFromtidak akan pernah mencampur data di luar band dan normal dalam panggilan yang sama.) ParameterlpArgumentmenunjuk diDWORDtempatIOCtlmenyimpan hasilnya.
Fungsi ini adalah subset dari seperti yang ioctl() digunakan dalam soket Berkeley. Secara khusus, tidak ada perintah yang setara dengan FIOASYNC, sementara SIOCATMARK adalah satu-satunya perintah tingkat soket yang didukung.
CAsyncSocket::Listen
Panggil fungsi anggota ini untuk mendengarkan permintaan koneksi masuk.
BOOL Listen(int nConnectionBacklog = 5);
Parameter
nConnectionBacklog
Panjang maksimum di mana antrean koneksi yang tertunda dapat tumbuh. Rentang yang valid adalah dari 1 hingga 5.
Tampilkan Nilai
Bukan nol jika fungsi berhasil; jika tidak, 0, dan kode kesalahan tertentu dapat diambil dengan memanggil GetLastError. Kesalahan berikut berlaku untuk fungsi anggota ini:
WSANOTINITIALISEDKeberhasilanAfxSocketInitharus terjadi sebelum menggunakan API ini.WSAENETDOWNImplementasi Windows Sockets mendeteksi bahwa subsistem jaringan gagal.WSAEADDRINUSEUpaya telah dilakukan untuk mendengarkan alamat yang digunakan.WSAEINPROGRESSOperasi Pemblokiran Windows Sockets sedang berlangsung.WSAEINVALSoket belum terikat denganBindatau sudah tersambung.WSAEISCONNSoket sudah tersambung.WSAEMFILETidak ada lagi deskriptor file yang tersedia.WSAENOBUFSTidak ada ruang buffer yang tersedia.WSAENOTSOCKDeskriptor bukan soket.WSAEOPNOTSUPPSoket yang dirujuk bukan jenis yang mendukungListenoperasi.
Keterangan
Untuk menerima koneksi, soket pertama kali dibuat dengan Create, backlog untuk koneksi masuk ditentukan dengan Listen, dan kemudian koneksi diterima dengan Accept.
Listen hanya berlaku untuk soket yang mendukung koneksi, yaitu jenis SOCK_STREAM. Soket ini dimasukkan ke dalam mode "pasif" di mana koneksi masuk diakui dan mengantrekan penerimaan tertunda oleh proses.
Fungsi ini biasanya digunakan oleh server (atau aplikasi apa pun yang ingin menerima koneksi) yang dapat memiliki lebih dari satu permintaan koneksi pada satu waktu: jika permintaan koneksi tiba dengan antrean penuh, klien akan menerima kesalahan dengan indikasi WSAECONNREFUSED.
Listen mencoba untuk terus berfungsi secara rasional ketika tidak ada port yang tersedia (deskriptor). Ini akan menerima koneksi sampai antrean dikosongkan. Jika port tersedia, panggilan nanti ke Listen atau Accept akan mengisi ulang antrean ke "backlog" saat ini atau terbaru, jika memungkinkan, dan melanjutkan mendengarkan koneksi masuk.
CAsyncSocket::m_hSocket
SOCKET Berisi handel untuk soket yang dienkapsulasi oleh objek iniCAsyncSocket.
SOCKET m_hSocket;
CAsyncSocket::OnAccept
Dipanggil oleh kerangka kerja untuk memberi tahu soket mendengarkan bahwa ia dapat menerima permintaan koneksi yang tertunda dengan memanggil Accept fungsi anggota.
virtual void OnAccept(int nErrorCode);
Parameter
nErrorCode
Kesalahan terbaru pada soket. Kode kesalahan berikut berlaku untuk OnAccept fungsi anggota:
0 Fungsi berhasil dijalankan.
WSAENETDOWNImplementasi Windows Sockets mendeteksi bahwa subsistem jaringan gagal.
Keterangan
Untuk informasi selengkapnya, lihat Soket Windows: Pemberitahuan Soket.
CAsyncSocket::OnClose
Dipanggil oleh kerangka kerja untuk memberi tahu soket ini bahwa soket yang terhubung ditutup oleh prosesnya.
virtual void OnClose(int nErrorCode);
Parameter
nErrorCode
Kesalahan terbaru pada soket. Kode kesalahan berikut berlaku untuk OnClose fungsi anggota:
0 Fungsi berhasil dijalankan.
WSAENETDOWNImplementasi Windows Sockets mendeteksi bahwa subsistem jaringan gagal.WSAECONNRESETKoneksi direset oleh sisi jarak jauh.WSAECONNABORTEDKoneksi dibatalkan karena waktu habis atau kegagalan lainnya.
Keterangan
Untuk informasi selengkapnya, lihat Soket Windows: Pemberitahuan Soket.
CAsyncSocket::OnConnect
Dipanggil oleh kerangka kerja untuk memberi tahu soket penghubung ini bahwa upaya koneksinya selesai, baik berhasil atau dalam kesalahan.
virtual void OnConnect(int nErrorCode);
Parameter
nErrorCode
Kesalahan terbaru pada soket. Kode kesalahan berikut berlaku untuk OnConnect fungsi anggota:
0 Fungsi berhasil dijalankan.
WSAEADDRINUSEAlamat yang ditentukan sudah digunakan.WSAEADDRNOTAVAILAlamat yang ditentukan tidak tersedia dari komputer lokal.WSAEAFNOSUPPORTAlamat dalam keluarga yang ditentukan tidak dapat digunakan dengan soket ini.WSAECONNREFUSEDUpaya untuk menyambungkan ditolak secara paksa.WSAEDESTADDRREQAlamat tujuan diperlukan.WSAEFAULTArgumenlpSockAddrLensalah.WSAEINVALSoket sudah terikat ke alamat.WSAEISCONNSoket sudah tersambung.WSAEMFILETidak ada lagi deskriptor file yang tersedia.WSAENETUNREACHJaringan tidak dapat dijangkau dari host ini saat ini.WSAENOBUFSTidak ada ruang buffer yang tersedia. Soket tidak dapat dihubungkan.WSAENOTCONNSoket tidak tersambung.WSAENOTSOCKDeskriptor adalah file, bukan soket.WSAETIMEDOUTUpaya untuk menyambungkan kehabisan waktu tanpa membuat koneksi.
Keterangan
Catatan
Dalam CSocket, OnConnect fungsi pemberitahuan tidak pernah dipanggil. Untuk koneksi, Anda cukup memanggil Connect, yang akan kembali ketika koneksi selesai (berhasil atau dalam kesalahan). Bagaimana pemberitahuan koneksi ditangani adalah detail implementasi MFC.
Untuk informasi selengkapnya, lihat Soket Windows: Pemberitahuan Soket.
Contoh
void CMyAsyncSocket::OnConnect(int nErrorCode) // CMyAsyncSocket is
// derived from CAsyncSocket
{
if (0 != nErrorCode)
{
switch (nErrorCode)
{
case WSAEADDRINUSE:
AfxMessageBox(_T("The specified address is already in use.\n"));
break;
case WSAEADDRNOTAVAIL:
AfxMessageBox(_T("The specified address is not available from ")
_T("the local machine.\n"));
break;
case WSAEAFNOSUPPORT:
AfxMessageBox(_T("Addresses in the specified family cannot be ")
_T("used with this socket.\n"));
break;
case WSAECONNREFUSED:
AfxMessageBox(_T("The attempt to connect was forcefully rejected.\n"));
break;
case WSAEDESTADDRREQ:
AfxMessageBox(_T("A destination address is required.\n"));
break;
case WSAEFAULT:
AfxMessageBox(_T("The lpSockAddrLen argument is incorrect.\n"));
break;
case WSAEINVAL:
AfxMessageBox(_T("The socket is already bound to an address.\n"));
break;
case WSAEISCONN:
AfxMessageBox(_T("The socket is already connected.\n"));
break;
case WSAEMFILE:
AfxMessageBox(_T("No more file descriptors are available.\n"));
break;
case WSAENETUNREACH:
AfxMessageBox(_T("The network cannot be reached from this host ")
_T("at this time.\n"));
break;
case WSAENOBUFS:
AfxMessageBox(_T("No buffer space is available. The socket ")
_T("cannot be connected.\n"));
break;
case WSAENOTCONN:
AfxMessageBox(_T("The socket is not connected.\n"));
break;
case WSAENOTSOCK:
AfxMessageBox(_T("The descriptor is a file, not a socket.\n"));
break;
case WSAETIMEDOUT:
AfxMessageBox(_T("The attempt to connect timed out without ")
_T("establishing a connection. \n"));
break;
default:
TCHAR szError[256];
_stprintf_s(szError, _T("OnConnect error: %d"), nErrorCode);
AfxMessageBox(szError);
break;
}
AfxMessageBox(_T("Please close the application"));
}
CAsyncSocket::OnConnect(nErrorCode);
}
CAsyncSocket::OnOutOfBandData
Dipanggil oleh kerangka kerja untuk memberi tahu soket penerima bahwa soket pengiriman memiliki data di luar band untuk dikirim.
virtual void OnOutOfBandData(int nErrorCode);
Parameter
nErrorCode
Kesalahan terbaru pada soket. Kode kesalahan berikut berlaku untuk OnOutOfBandData fungsi anggota:
0 Fungsi berhasil dijalankan.
WSAENETDOWNImplementasi Windows Sockets mendeteksi bahwa subsistem jaringan gagal.
Keterangan
Data di luar band adalah saluran independen logis yang terkait dengan setiap pasangan soket jenis SOCK_STREAMyang terhubung. Saluran ini umumnya digunakan untuk mengirim data mendesak.
MFC mendukung data di luar band, tetapi pengguna kelas CAsyncSocket tidak dianjurkan untuk menggunakannya. Cara yang lebih mudah adalah dengan membuat soket kedua untuk meneruskan data tersebut. Untuk informasi selengkapnya tentang data di luar band, lihat Soket Windows: Pemberitahuan Soket.
CAsyncSocket::OnReceive
Dipanggil oleh kerangka kerja untuk memberi tahu soket ini bahwa ada data dalam buffer yang dapat diambil dengan memanggil Receive fungsi anggota.
virtual void OnReceive(int nErrorCode);
Parameter
nErrorCode
Kesalahan terbaru pada soket. Kode kesalahan berikut berlaku untuk OnReceive fungsi anggota:
0 Fungsi berhasil dijalankan.
WSAENETDOWNImplementasi Windows Sockets mendeteksi bahwa subsistem jaringan gagal.
Keterangan
Untuk informasi selengkapnya, lihat Soket Windows: Pemberitahuan Soket.
Contoh
void CMyAsyncSocket::OnReceive(int nErrorCode) // CMyAsyncSocket is
// derived from CAsyncSocket
{
static int i = 0;
i++;
TCHAR buff[4096];
int nRead;
nRead = Receive(buff, 4096);
switch (nRead)
{
case 0:
Close();
break;
case SOCKET_ERROR:
if (GetLastError() != WSAEWOULDBLOCK)
{
AfxMessageBox(_T("Error occurred"));
Close();
}
break;
default:
buff[nRead] = _T('\0'); //terminate the string
CString szTemp(buff);
m_strRecv += szTemp; // m_strRecv is a CString declared
// in CMyAsyncSocket
if (szTemp.CompareNoCase(_T("bye")) == 0)
{
ShutDown();
s_eventDone.SetEvent();
}
}
CAsyncSocket::OnReceive(nErrorCode);
}
CAsyncSocket::OnSend
Dipanggil oleh kerangka kerja untuk memberi tahu soket bahwa sekarang dapat mengirim data dengan memanggil Send fungsi anggota.
virtual void OnSend(int nErrorCode);
Parameter
nErrorCode
Kesalahan terbaru pada soket. Kode kesalahan berikut berlaku untuk OnSend fungsi anggota:
0 Fungsi berhasil dijalankan.
WSAENETDOWNImplementasi Windows Sockets mendeteksi bahwa subsistem jaringan gagal.
Keterangan
Untuk informasi selengkapnya, lihat Soket Windows: Pemberitahuan Soket.
Contoh
// CMyAsyncSocket is derived from CAsyncSocket and defines the
// following variables:
// CString m_sendBuffer; //for async send
// int m_nBytesSent;
// int m_nBytesBufferSize;
void CMyAsyncSocket::OnSend(int nErrorCode)
{
while (m_nBytesSent < m_nBytesBufferSize)
{
int dwBytes;
if ((dwBytes = Send((LPCTSTR)m_sendBuffer + m_nBytesSent,
m_nBytesBufferSize - m_nBytesSent)) == SOCKET_ERROR)
{
if (GetLastError() == WSAEWOULDBLOCK)
{
break;
}
else
{
TCHAR szError[256];
_stprintf_s(szError, _T("Server Socket failed to send: %d"),
GetLastError());
Close();
AfxMessageBox(szError);
}
}
else
{
m_nBytesSent += dwBytes;
}
}
if (m_nBytesSent == m_nBytesBufferSize)
{
m_nBytesSent = m_nBytesBufferSize = 0;
m_sendBuffer = _T("");
}
CAsyncSocket::OnSend(nErrorCode);
}
CAsyncSocket::operator =
Menetapkan nilai baru ke CAsyncSocket objek.
void operator=(const CAsyncSocket& rSrc);
Parameter
rSrc
Referensi ke objek yang sudah ada CAsyncSocket .
Keterangan
Panggil fungsi ini untuk menyalin objek yang ada CAsyncSocket ke objek lain CAsyncSocket .
CAsyncSocket::operator SOCKET
Gunakan operator ini untuk mengambil SOCKET handel CAsyncSocket objek.
operator SOCKET() const;
Tampilkan Nilai
Jika berhasil, handel SOCKET objek; jika tidak, NULL.
Keterangan
Anda dapat menggunakan handel untuk memanggil API Windows secara langsung.
CAsyncSocket::Receive
Panggil fungsi anggota ini untuk menerima data dari soket.
virtual int Receive(
void* lpBuf,
int nBufLen,
int nFlags = 0);
Parameter
lpBuf
Buffer untuk data masuk.
nBufLen
Panjang lpBuf dalam byte.
nFlags
Menentukan cara panggilan dilakukan. Semantik fungsi ini ditentukan oleh opsi soket dan nFlags parameter . Yang terakhir dibangun dengan menggabungkan salah satu nilai berikut dengan operator C++ bitwise OR (|):
MSG_PEEKIntip data masuk. Data disalin ke dalam buffer tetapi tidak dihapus dari antrean input.MSG_OOBMemproses data di luar band.
Tampilkan Nilai
Jika tidak ada kesalahan yang terjadi, Receive mengembalikan jumlah byte yang diterima. Jika koneksi telah ditutup, koneksi akan mengembalikan 0. Jika tidak, nilai SOCKET_ERROR dikembalikan, dan kode kesalahan tertentu dapat diambil dengan memanggil GetLastError. Kesalahan berikut berlaku untuk fungsi anggota ini:
WSANOTINITIALISEDKeberhasilanAfxSocketInitharus terjadi sebelum menggunakan API ini.WSAENETDOWNImplementasi Windows Sockets mendeteksi bahwa subsistem jaringan gagal.WSAENOTCONNSoket tidak tersambung.WSAEINPROGRESSOperasi Pemblokiran Windows Sockets sedang berlangsung.WSAENOTSOCKDeskriptor bukan soket.WSAEOPNOTSUPPMSG_OOBditentukan, tetapi soket bukan tipeSOCK_STREAM.WSAESHUTDOWNSoket telah dimatikan; tidak dimungkinkan untuk memanggilReceivesoket setelahShutDowndipanggil dengannHowdiatur ke 0 atau 2.WSAEWOULDBLOCKSoket ditandai sebagai nonblocking danReceiveoperasi akan diblokir.WSAEMSGSIZEDatagram terlalu besar agar pas dengan buffer yang ditentukan dan dipotong.WSAEINVALSoket belum terikat denganBind.WSAECONNABORTEDSirkuit virtual dibatalkan karena waktu habis atau kegagalan lainnya.WSAECONNRESETSirkuit virtual direset oleh sisi jarak jauh.
Keterangan
Fungsi ini digunakan untuk aliran terhubung atau soket datagram dan digunakan untuk membaca data masuk.
Untuk soket jenis SOCK_STREAM, informasi sebanyak yang saat ini tersedia hingga ukuran buffer yang disediakan dikembalikan. Jika soket telah dikonfigurasi untuk penerimaan in-line dari data di luar band (opsi SO_OOBINLINEsoket ) dan data di luar band yang belum dibaca, hanya data di luar band yang akan dikembalikan. Aplikasi dapat menggunakan IOCtlSIOCATMARK opsi atau OnOutOfBandData untuk menentukan apakah ada lagi data di luar band yang tetap harus dibaca.
Untuk soket datagram, data diekstrak dari datagram antrean pertama, hingga ukuran buffer yang disediakan. Jika datagram lebih besar dari buffer yang disediakan, buffer diisi dengan bagian pertama datagram, kelebihan data hilang, dan Receive mengembalikan nilai SOCKET_ERROR dengan kode kesalahan yang diatur ke WSAEMSGSIZE. Jika tidak ada data masuk yang tersedia di soket, nilai SOCKET_ERROR dikembalikan dengan kode kesalahan yang diatur ke WSAEWOULDBLOCK. Fungsi OnReceive panggilan balik dapat digunakan untuk menentukan kapan lebih banyak data tiba.
Jika soket berjenis SOCK_STREAM dan sisi jarak jauh telah mematikan koneksi dengan anggun, akan Receive segera selesai dengan 0 byte diterima. Jika koneksi telah direset, Receive akan gagal dengan kesalahan WSAECONNRESET.
Receive harus dipanggil hanya sekali untuk setiap kali CAsyncSocket::OnReceive dipanggil.
Contoh
Lihat contoh untuk CAsyncSocket::OnReceive.
CAsyncSocket::ReceiveFrom
Panggil fungsi anggota ini untuk menerima datagram dan menyimpan alamat sumber dalam SOCKADDR struktur atau di rSocketAddress.
int ReceiveFrom(
void* lpBuf,
int nBufLen,
CString& rSocketAddress,
UINT& rSocketPort,
int nFlags = 0);
int ReceiveFrom(
void* lpBuf,
int nBufLen,
SOCKADDR* lpSockAddr,
int* lpSockAddrLen,
int nFlags = 0);
Parameter
lpBuf
Buffer untuk data masuk.
nBufLen
Panjang lpBuf dalam byte.
rSocketAddress
Referensi ke CString objek yang menerima alamat IP angka putus-putus.
rSocketPort
Referensi ke yang UINT menyimpan port.
lpSockAddr
Penunjuk ke SOCKADDR struktur yang menyimpan alamat sumber saat dikembalikan.
lpSockAddrLen
Penunjuk ke panjang alamat sumber dalam lpSockAddr byte.
nFlags
Menentukan cara panggilan dilakukan. Semantik fungsi ini ditentukan oleh opsi soket dan nFlags parameter . Yang terakhir dibangun dengan menggabungkan salah satu nilai berikut dengan operator C++ bitwise OR (|):
MSG_PEEKIntip data masuk. Data disalin ke dalam buffer tetapi tidak dihapus dari antrean input.MSG_OOBMemproses data di luar band.
Tampilkan Nilai
Jika tidak ada kesalahan yang terjadi, ReceiveFrom mengembalikan jumlah byte yang diterima. Jika koneksi telah ditutup, koneksi akan mengembalikan 0. Jika tidak, nilai SOCKET_ERROR dikembalikan, dan kode kesalahan tertentu dapat diambil dengan memanggil GetLastError. Kesalahan berikut berlaku untuk fungsi anggota ini:
WSANOTINITIALISEDKeberhasilanAfxSocketInitharus terjadi sebelum menggunakan API ini.WSAENETDOWNImplementasi Windows Sockets mendeteksi bahwa subsistem jaringan gagal.WSAEFAULTArgumenlpSockAddrLentidak valid:lpSockAddrbuffer terlalu kecil untuk mengakomodasi alamat serekan.WSAEINPROGRESSOperasi Pemblokiran Windows Sockets sedang berlangsung.WSAEINVALSoket belum terikat denganBind.WSAENOTCONNSoket tidak tersambung (SOCK_STREAMhanya).WSAENOTSOCKDeskriptor bukan soket.WSAEOPNOTSUPPMSG_OOBditentukan, tetapi soket bukan tipeSOCK_STREAM.WSAESHUTDOWNSoket telah dimatikan; tidak dimungkinkan untuk memanggilReceiveFromsoket setelahShutDowndipanggil dengannHowdiatur ke 0 atau 2.WSAEWOULDBLOCKSoket ditandai sebagai nonblocking danReceiveFromoperasi akan diblokir.WSAEMSGSIZEDatagram terlalu besar agar pas dengan buffer yang ditentukan dan dipotong.WSAECONNABORTEDSirkuit virtual dibatalkan karena waktu habis atau kegagalan lainnya.WSAECONNRESETSirkuit virtual direset oleh sisi jarak jauh.
Keterangan
Fungsi ini digunakan untuk membaca data masuk pada soket (mungkin terhubung) dan mengambil alamat tempat data dikirim.
Untuk menangani alamat IPv6, gunakan CAsyncSocket::ReceiveFromEx.
Untuk soket jenis SOCK_STREAM, informasi sebanyak yang saat ini tersedia hingga ukuran buffer yang disediakan dikembalikan. Jika soket telah dikonfigurasi untuk penerimaan in-line dari data di luar band (opsi SO_OOBINLINEsoket ) dan data di luar band yang belum dibaca, hanya data di luar band yang akan dikembalikan. Aplikasi dapat menggunakan IOCtlSIOCATMARK opsi atau OnOutOfBandData untuk menentukan apakah ada lagi data di luar band yang tetap harus dibaca. Parameter lpSockAddr dan lpSockAddrLen diabaikan untuk SOCK_STREAM soket.
Untuk soket datagram, data diekstrak dari datagram antrean pertama, hingga ukuran buffer yang disediakan. Jika datagram lebih besar dari buffer yang disediakan, buffer diisi dengan bagian pertama pesan, data berlebih hilang, dan ReceiveFrom mengembalikan nilai SOCKET_ERROR dengan kode kesalahan yang diatur ke WSAEMSGSIZE.
Jika lpSockAddr bukan nol, dan soket berjenis SOCK_DGRAM, alamat jaringan soket yang mengirim data disalin ke struktur yang SOCKADDR sesuai. Nilai yang ditunjukkan oleh lpSockAddrLen diinisialisasi ke ukuran struktur ini, dan dimodifikasi saat kembali untuk menunjukkan ukuran aktual alamat yang disimpan di sana. Jika tidak ada data masuk yang tersedia di soket, ReceiveFrom panggilan menunggu data tiba kecuali soket tidak diblokir. Dalam hal ini, nilai SOCKET_ERROR dikembalikan dengan kode kesalahan yang diatur ke WSAEWOULDBLOCK. Panggilan OnReceive balik dapat digunakan untuk menentukan kapan lebih banyak data tiba.
Jika soket berjenis SOCK_STREAM dan sisi jarak jauh telah mematikan koneksi dengan anggun, akan ReceiveFrom segera selesai dengan 0 byte diterima.
CAsyncSocket::ReceiveFromEx
Panggil fungsi anggota ini untuk menerima datagram dan menyimpan alamat sumber dalam SOCKADDR struktur atau di rSocketAddress (menangani alamat IPv6).
int ReceiveFromEx(
void* lpBuf,
int nBufLen,
CString& rSocketAddress,
UINT& rSocketPort,
int nFlags = 0);
Parameter
lpBuf
Buffer untuk data masuk.
nBufLen
Panjang lpBuf dalam byte.
rSocketAddress
Referensi ke CString objek yang menerima alamat IP angka putus-putus.
rSocketPort
Referensi ke yang UINT menyimpan port.
nFlags
Menentukan cara panggilan dilakukan. Semantik fungsi ini ditentukan oleh opsi soket dan nFlags parameter . Yang terakhir dibangun dengan menggabungkan salah satu nilai berikut dengan operator C++ bitwise OR (|):
MSG_PEEKIntip data masuk. Data disalin ke dalam buffer tetapi tidak dihapus dari antrean input.MSG_OOBMemproses data di luar band.
Tampilkan Nilai
Jika tidak ada kesalahan yang terjadi, ReceiveFromEx mengembalikan jumlah byte yang diterima. Jika koneksi telah ditutup, koneksi akan mengembalikan 0. Jika tidak, nilai SOCKET_ERROR dikembalikan, dan kode kesalahan tertentu dapat diambil dengan memanggil GetLastError. Kesalahan berikut berlaku untuk fungsi anggota ini:
WSANOTINITIALISEDKeberhasilanAfxSocketInitharus terjadi sebelum menggunakan API ini.WSAENETDOWNImplementasi Windows Sockets mendeteksi bahwa subsistem jaringan gagal.WSAEFAULTArgumenlpSockAddrLentidak valid:lpSockAddrbuffer terlalu kecil untuk mengakomodasi alamat serekan.WSAEINPROGRESSOperasi Pemblokiran Windows Sockets sedang berlangsung.WSAEINVALSoket belum terikat denganBind.WSAENOTCONNSoket tidak tersambung (SOCK_STREAMhanya).WSAENOTSOCKDeskriptor bukan soket.WSAEOPNOTSUPPMSG_OOBditentukan, tetapi soket bukan tipeSOCK_STREAM.WSAESHUTDOWNSoket telah dimatikan; tidak dimungkinkan untuk memanggilReceiveFromExsoket setelahShutDowndipanggil dengannHowdiatur ke 0 atau 2.WSAEWOULDBLOCKSoket ditandai sebagai nonblocking danReceiveFromExoperasi akan diblokir.WSAEMSGSIZEDatagram terlalu besar agar pas dengan buffer yang ditentukan dan dipotong.WSAECONNABORTEDSirkuit virtual dibatalkan karena waktu habis atau kegagalan lainnya.WSAECONNRESETSirkuit virtual direset oleh sisi jarak jauh.
Keterangan
Fungsi ini digunakan untuk membaca data masuk pada soket (mungkin terhubung) dan mengambil alamat tempat data dikirim.
Fungsi ini sama dengan CAsyncSocket::ReceiveFrom kecuali bahwa ia menangani alamat IPv6 serta protokol yang lebih lama.
Untuk soket jenis SOCK_STREAM, informasi sebanyak yang saat ini tersedia hingga ukuran buffer yang disediakan dikembalikan. Jika soket telah dikonfigurasi untuk penerimaan in-line dari data di luar band (opsi SO_OOBINLINEsoket ) dan data di luar band yang belum dibaca, hanya data di luar band yang akan dikembalikan. Aplikasi dapat menggunakan IOCtlSIOCATMARK opsi atau OnOutOfBandData untuk menentukan apakah ada lagi data di luar band yang tetap harus dibaca. Parameter lpSockAddr dan lpSockAddrLen diabaikan untuk SOCK_STREAM soket.
Untuk soket datagram, data diekstrak dari datagram antrean pertama, hingga ukuran buffer yang disediakan. Jika datagram lebih besar dari buffer yang disediakan, buffer diisi dengan bagian pertama pesan, data berlebih hilang, dan ReceiveFromEx mengembalikan nilai SOCKET_ERROR dengan kode kesalahan yang diatur ke WSAEMSGSIZE.
Jika lpSockAddr bukan nol, dan soket berjenis SOCK_DGRAM, alamat jaringan soket yang mengirim data disalin ke struktur yang SOCKADDR sesuai. Nilai yang ditunjukkan oleh lpSockAddrLen diinisialisasi ke ukuran struktur ini, dan dimodifikasi saat kembali untuk menunjukkan ukuran aktual alamat yang disimpan di sana. Jika tidak ada data masuk yang tersedia di soket, ReceiveFromEx panggilan menunggu data tiba kecuali soket tidak diblokir. Dalam hal ini, nilai SOCKET_ERROR dikembalikan dengan kode kesalahan yang diatur ke WSAEWOULDBLOCK. Panggilan OnReceive balik dapat digunakan untuk menentukan kapan lebih banyak data tiba.
Jika soket berjenis SOCK_STREAM dan sisi jarak jauh telah mematikan koneksi dengan anggun, akan ReceiveFromEx segera selesai dengan 0 byte diterima.
CAsyncSocket::Send
Panggil fungsi anggota ini untuk mengirim data pada soket yang tersambung.
virtual int Send(
const void* lpBuf,
int nBufLen,
int nFlags = 0);
Parameter
lpBuf
Buffer yang berisi data yang akan dikirimkan.
nBufLen
Panjang data dalam lpBuf byte.
nFlags
Menentukan cara panggilan dilakukan. Semantik fungsi ini ditentukan oleh opsi soket dan nFlags parameter . Yang terakhir dibangun dengan menggabungkan salah satu nilai berikut dengan operator C++ bitwise OR (|):
MSG_DONTROUTEMenentukan bahwa data tidak boleh tunduk pada perutean. Pemasok Windows Sockets dapat memilih untuk mengabaikan bendera ini.MSG_OOBKirim data di luar band (SOCK_STREAMhanya).
Tampilkan Nilai
Jika tidak ada kesalahan yang terjadi, Send mengembalikan jumlah total karakter yang dikirim. (Perhatikan bahwa ini bisa kurang dari angka yang ditunjukkan oleh nBufLen.) Jika tidak, nilai SOCKET_ERROR dikembalikan, dan kode kesalahan tertentu dapat diambil dengan memanggil GetLastError. Kesalahan berikut berlaku untuk fungsi anggota ini:
WSANOTINITIALISEDKeberhasilanAfxSocketInitharus terjadi sebelum menggunakan API ini.WSAENETDOWNImplementasi Windows Sockets mendeteksi bahwa subsistem jaringan gagal.WSAEACCESAlamat yang diminta adalah alamat siaran, tetapi bendera yang sesuai tidak ditetapkan.WSAEINPROGRESSOperasi Pemblokiran Windows Sockets sedang berlangsung.WSAEFAULTArgumenlpBuftidak berada di bagian ruang alamat pengguna yang valid.WSAENETRESETKoneksi harus direset karena implementasi Windows Sockets menghilangkannya.WSAENOBUFSImplementasi Windows Sockets melaporkan kebuntuan buffer.WSAENOTCONNSoket tidak tersambung.WSAENOTSOCKDeskriptor bukan soket.WSAEOPNOTSUPPMSG_OOBditentukan, tetapi soket bukan tipeSOCK_STREAM.WSAESHUTDOWNSoket telah dimatikan; tidak dimungkinkan untuk memanggilSendsoket setelahShutDowndipanggil dengannHowdiatur ke 1 atau 2.WSAEWOULDBLOCKSoket ditandai sebagai nonblocking dan operasi yang diminta akan diblokir.WSAEMSGSIZESoket berjenisSOCK_DGRAM, dan datagram lebih besar dari maksimum yang didukung oleh implementasi Windows Sockets.WSAEINVALSoket belum terikat denganBind.WSAECONNABORTEDSirkuit virtual dibatalkan karena waktu habis atau kegagalan lainnya.WSAECONNRESETSirkuit virtual direset oleh sisi jarak jauh.
Keterangan
Send digunakan untuk menulis data keluar pada aliran yang terhubung atau soket datagram. Untuk soket datagram, perawatan harus dilakukan untuk tidak melebihi ukuran paket IP maksimum dari subnet yang mendasar, yang diberikan oleh iMaxUdpDg elemen dalam struktur yang WSADATA dikembalikan oleh AfxSocketInit. Jika data terlalu panjang untuk diteruskan secara atomik melalui protokol yang mendasar, kesalahan WSAEMSGSIZE dikembalikan melalui GetLastError, dan tidak ada data yang dikirimkan.
Perhatikan bahwa untuk soket datagram keberhasilan penyelesaian Send tidak menunjukkan bahwa data berhasil dikirimkan.
Pada CAsyncSocket objek jenis SOCK_STREAM, jumlah byte yang ditulis dapat antara 1 dan panjang yang diminta, tergantung pada ketersediaan buffer pada host lokal dan asing.
Contoh
Lihat contoh untuk CAsyncSocket::OnSend.
CAsyncSocket::SendTo
Panggil fungsi anggota ini untuk mengirim data ke tujuan tertentu.
int SendTo(
const void* lpBuf,
int nBufLen,
UINT nHostPort,
LPCTSTR lpszHostAddress = NULL,
int nFlags = 0);
int SendTo(
const void* lpBuf,
int nBufLen,
const SOCKADDR* lpSockAddr,
int nSockAddrLen,
int nFlags = 0);
Parameter
lpBuf
Buffer yang berisi data yang akan dikirimkan.
nBufLen
Panjang data dalam lpBuf byte.
nHostPort
Port yang mengidentifikasi aplikasi soket.
lpszHostAddress
Alamat jaringan soket tempat objek ini terhubung: nama komputer seperti "ftp.microsoft.com," atau angka putus-putus seperti "128.56.22.8".
nFlags
Menentukan cara panggilan dilakukan. Semantik fungsi ini ditentukan oleh opsi soket dan nFlags parameter . Yang terakhir dibangun dengan menggabungkan salah satu nilai berikut dengan operator C++ bitwise OR (|):
MSG_DONTROUTEMenentukan bahwa data tidak boleh tunduk pada perutean. Pemasok Windows Sockets dapat memilih untuk mengabaikan bendera ini.MSG_OOBKirim data di luar band (SOCK_STREAMhanya).
lpSockAddr
Penunjuk ke SOCKADDR struktur yang berisi alamat soket target.
nSockAddrLen
Panjang alamat dalam lpSockAddr byte.
Tampilkan Nilai
Jika tidak ada kesalahan yang terjadi, SendTo mengembalikan jumlah total karakter yang dikirim. (Perhatikan bahwa ini bisa kurang dari angka yang ditunjukkan oleh nBufLen.) Jika tidak, nilai SOCKET_ERROR dikembalikan, dan kode kesalahan tertentu dapat diambil dengan memanggil GetLastError. Kesalahan berikut berlaku untuk fungsi anggota ini:
WSANOTINITIALISEDKeberhasilanAfxSocketInitharus terjadi sebelum menggunakan API ini.WSAENETDOWNImplementasi Windows Sockets mendeteksi bahwa subsistem jaringan gagal.WSAEACCESAlamat yang diminta adalah alamat siaran, tetapi bendera yang sesuai tidak ditetapkan.WSAEINPROGRESSOperasi Pemblokiran Windows Sockets sedang berlangsung.WSAEFAULTParameterlpBufataulpSockAddrbukan bagian dari ruang alamat pengguna, ataulpSockAddrargumen terlalu kecil (kurang dari ukuranSOCKADDRstruktur).WSAEINVALNama host tidak valid.WSAENETRESETKoneksi harus direset karena implementasi Windows Sockets menghilangkannya.WSAENOBUFSImplementasi Windows Sockets melaporkan kebuntuan buffer.WSAENOTCONNSoket tidak tersambung (SOCK_STREAMhanya).WSAENOTSOCKDeskriptor bukan soket.WSAEOPNOTSUPPMSG_OOBditentukan, tetapi soket bukan tipeSOCK_STREAM.WSAESHUTDOWNSoket telah dimatikan; tidak dimungkinkan untuk memanggilSendTosoket setelahShutDowndipanggil dengannHowdiatur ke 1 atau 2.WSAEWOULDBLOCKSoket ditandai sebagai nonblocking dan operasi yang diminta akan diblokir.WSAEMSGSIZESoket berjenisSOCK_DGRAM, dan datagram lebih besar dari maksimum yang didukung oleh implementasi Windows Sockets.WSAECONNABORTEDSirkuit virtual dibatalkan karena waktu habis atau kegagalan lainnya.WSAECONNRESETSirkuit virtual direset oleh sisi jarak jauh.WSAEADDRNOTAVAILAlamat yang ditentukan tidak tersedia dari komputer lokal.WSAEAFNOSUPPORTAlamat dalam keluarga yang ditentukan tidak dapat digunakan dengan soket ini.WSAEDESTADDRREQAlamat tujuan diperlukan.WSAENETUNREACHJaringan tidak dapat dijangkau dari host ini saat ini.
Keterangan
SendTo digunakan pada datagram atau soket streaming dan digunakan untuk menulis data keluar pada soket. Untuk soket datagram, perawatan harus dilakukan untuk tidak melebihi ukuran paket IP maksimum dari subnet yang mendasar, yang diberikan oleh iMaxUdpDg elemen dalam struktur yang WSADATA diisi oleh AfxSocketInit. Jika data terlalu panjang untuk diteruskan secara atomik melalui protokol yang mendasar, kesalahan WSAEMSGSIZE dikembalikan, dan tidak ada data yang dikirimkan.
Perhatikan bahwa keberhasilan penyelesaian SendTo tidak menunjukkan bahwa data berhasil dikirimkan.
SendTo hanya digunakan pada SOCK_DGRAM soket untuk mengirim datagram ke soket tertentu yang diidentifikasi oleh lpSockAddr parameter .
Untuk mengirim siaran ( SOCK_DGRAM hanya), alamat dalam lpSockAddr parameter harus dibangun menggunakan alamat INADDR_BROADCAST IP khusus (didefinisikan dalam file WINSOCK.Hheader Soket Windows ) bersama dengan nomor port yang dimaksudkan. Atau, jika lpszHostAddress parameternya adalah NULL, soket dikonfigurasi untuk siaran. Umumnya tidak dapat dihindari untuk datagram siaran melebihi ukuran di mana fragmentasi dapat terjadi, yang menyiratkan bahwa bagian data dari datagram (tidak termasuk header) tidak boleh melebihi 512 byte.
Untuk menangani alamat IPv6, gunakan CAsyncSocket::SendToEx.
CAsyncSocket::SendToEx
Panggil fungsi anggota ini untuk mengirim data ke tujuan tertentu (menangani alamat IPv6).
int SendToEx(
const void* lpBuf,
int nBufLen,
UINT nHostPort,
LPCTSTR lpszHostAddress = NULL,
int nFlags = 0);
Parameter
lpBuf
Buffer yang berisi data yang akan dikirimkan.
nBufLen
Panjang data dalam lpBuf byte.
nHostPort
Port yang mengidentifikasi aplikasi soket.
lpszHostAddress
Alamat jaringan soket tempat objek ini terhubung: nama komputer seperti "ftp.microsoft.com," atau angka putus-putus seperti "128.56.22.8".
nFlags
Menentukan cara panggilan dilakukan. Semantik fungsi ini ditentukan oleh opsi soket dan nFlags parameter . Yang terakhir dibangun dengan menggabungkan salah satu nilai berikut dengan operator C++ bitwise OR (|):
MSG_DONTROUTEMenentukan bahwa data tidak boleh tunduk pada perutean. Pemasok Windows Sockets dapat memilih untuk mengabaikan bendera ini.MSG_OOBKirim data di luar band (SOCK_STREAMhanya).
Tampilkan Nilai
Jika tidak ada kesalahan yang terjadi, SendToEx mengembalikan jumlah total karakter yang dikirim. (Perhatikan bahwa ini bisa kurang dari angka yang ditunjukkan oleh nBufLen.) Jika tidak, nilai SOCKET_ERROR dikembalikan, dan kode kesalahan tertentu dapat diambil dengan memanggil GetLastError. Kesalahan berikut berlaku untuk fungsi anggota ini:
WSANOTINITIALISEDKeberhasilanAfxSocketInitharus terjadi sebelum menggunakan API ini.WSAENETDOWNImplementasi Windows Sockets mendeteksi bahwa subsistem jaringan gagal.WSAEACCESAlamat yang diminta adalah alamat siaran, tetapi bendera yang sesuai tidak ditetapkan.WSAEINPROGRESSOperasi Pemblokiran Windows Sockets sedang berlangsung.WSAEFAULTParameterlpBufataulpSockAddrbukan bagian dari ruang alamat pengguna, ataulpSockAddrargumen terlalu kecil (kurang dari ukuranSOCKADDRstruktur).WSAEINVALNama host tidak valid.WSAENETRESETKoneksi harus direset karena implementasi Windows Sockets menghilangkannya.WSAENOBUFSImplementasi Windows Sockets melaporkan kebuntuan buffer.WSAENOTCONNSoket tidak tersambung (SOCK_STREAMhanya).WSAENOTSOCKDeskriptor bukan soket.WSAEOPNOTSUPPMSG_OOBditentukan, tetapi soket bukan tipeSOCK_STREAM.WSAESHUTDOWNSoket telah dimatikan; tidak dimungkinkan untuk memanggilSendToExsoket setelahShutDowndipanggil dengannHowdiatur ke 1 atau 2.WSAEWOULDBLOCKSoket ditandai sebagai nonblocking dan operasi yang diminta akan diblokir.WSAEMSGSIZESoket berjenisSOCK_DGRAM, dan datagram lebih besar dari maksimum yang didukung oleh implementasi Windows Sockets.WSAECONNABORTEDSirkuit virtual dibatalkan karena waktu habis atau kegagalan lainnya.WSAECONNRESETSirkuit virtual direset oleh sisi jarak jauh.WSAEADDRNOTAVAILAlamat yang ditentukan tidak tersedia dari komputer lokal.WSAEAFNOSUPPORTAlamat dalam keluarga yang ditentukan tidak dapat digunakan dengan soket ini.WSAEDESTADDRREQAlamat tujuan diperlukan.WSAENETUNREACHJaringan tidak dapat dijangkau dari host ini saat ini.
Keterangan
Metode ini sama dengan CAsyncSocket::SendTo kecuali bahwa metode ini menangani alamat IPv6 serta protokol yang lebih lama.
SendToEx digunakan pada datagram atau soket streaming dan digunakan untuk menulis data keluar pada soket. Untuk soket datagram, perawatan harus dilakukan untuk tidak melebihi ukuran paket IP maksimum dari subnet yang mendasar, yang diberikan oleh iMaxUdpDg elemen dalam struktur yang WSADATA diisi oleh AfxSocketInit. Jika data terlalu panjang untuk diteruskan secara atomik melalui protokol yang mendasar, kesalahan WSAEMSGSIZE dikembalikan, dan tidak ada data yang dikirimkan.
Perhatikan bahwa keberhasilan penyelesaian SendToEx tidak menunjukkan bahwa data berhasil dikirimkan.
SendToEx hanya digunakan pada SOCK_DGRAM soket untuk mengirim datagram ke soket tertentu yang diidentifikasi oleh lpSockAddr parameter .
Untuk mengirim siaran ( SOCK_DGRAM hanya), alamat dalam lpSockAddr parameter harus dibangun menggunakan alamat INADDR_BROADCAST IP khusus (didefinisikan dalam file WINSOCK.Hheader Soket Windows ) bersama dengan nomor port yang dimaksudkan. Atau, jika lpszHostAddress parameternya adalah NULL, soket dikonfigurasi untuk siaran. Umumnya tidak dapat dihindari untuk datagram siaran melebihi ukuran di mana fragmentasi dapat terjadi, yang menyiratkan bahwa bagian data dari datagram (tidak termasuk header) tidak boleh melebihi 512 byte.
CAsyncSocket::SetSockOpt
Panggil fungsi anggota ini untuk mengatur opsi soket.
BOOL SetSockOpt(
int nOptionName,
const void* lpOptionValue,
int nOptionLen,
int nLevel = SOL_SOCKET);
Parameter
nOptionName
Opsi soket yang nilainya akan diatur.
lpOptionValue
Penunjuk ke buffer tempat nilai untuk opsi yang diminta disediakan.
nOptionLen
lpOptionValue Ukuran buffer dalam byte.
nLevel
Tingkat di mana opsi didefinisikan; satu-satunya tingkat yang didukung adalah SOL_SOCKET dan IPPROTO_TCP.
Tampilkan Nilai
Bukan nol jika fungsi berhasil; jika tidak, 0, dan kode kesalahan tertentu dapat diambil dengan memanggil GetLastError. Kesalahan berikut berlaku untuk fungsi anggota ini:
WSANOTINITIALISEDKeberhasilanAfxSocketInitharus terjadi sebelum menggunakan API ini.WSAENETDOWNImplementasi Windows Sockets mendeteksi bahwa subsistem jaringan gagal.WSAEFAULTlpOptionValuetidak berada dalam bagian yang valid dari ruang alamat proses.WSAEINPROGRESSOperasi Pemblokiran Windows Sockets sedang berlangsung.WSAEINVALnLeveltidak valid, atau informasi dilpOptionValuetidak valid.WSAENETRESETKoneksi telah kehabisan waktu ketikaSO_KEEPALIVEdiatur.WSAENOPROTOOPTOpsi tidak diketahui atau tidak didukung. Secara khusus,SO_BROADCASTtidak didukung pada soket jenisSOCK_STREAM, sementaraSO_DONTLINGER, ,SO_KEEPALIVESO_LINGER, danSO_OOBINLINEtidak didukung pada soket jenisSOCK_DGRAM.WSAENOTCONNKoneksi telah direset ketikaSO_KEEPALIVEdiatur.WSAENOTSOCKDeskriptor bukan soket.
Keterangan
SetSockOpt mengatur nilai saat ini untuk opsi soket yang terkait dengan soket jenis apa pun, dalam status apa pun. Meskipun opsi dapat ada di beberapa tingkat protokol, spesifikasi ini hanya menentukan opsi yang ada di tingkat "soket" paling atas. Opsi memengaruhi operasi soket, seperti apakah data yang dipercepat diterima di aliran data normal, apakah pesan siaran dapat dikirim di soket, dan sebagainya.
Ada dua jenis opsi soket: Opsi Boolean yang mengaktifkan atau menonaktifkan fitur atau perilaku, dan opsi yang memerlukan nilai atau struktur bilangan bulat. Untuk mengaktifkan opsi Boolean, lpOptionValue arahkan ke bilangan bulat bukan nol. Untuk menonaktifkan titik opsi lpOptionValue ke bilangan bulat yang sama dengan nol.
nOptionLen harus sama dengan sizeof(BOOL) untuk opsi Boolean. Untuk opsi lain, lpOptionValue arahkan ke bilangan bulat atau struktur yang berisi nilai yang diinginkan untuk opsi tersebut, dan nOptionLen merupakan panjang bilangan bulat atau struktur.
SO_LINGER mengontrol tindakan yang diambil ketika data yang tidak dikirim diantrekan pada soket dan Close fungsi dipanggil untuk menutup soket.
Secara default, soket tidak dapat diikat (lihat Bind) ke alamat lokal yang sudah digunakan. Namun, terkadang, mungkin diinginkan untuk "menggunakan kembali" alamat dengan cara ini. Karena setiap koneksi diidentifikasi secara unik oleh kombinasi alamat lokal dan jarak jauh, tidak ada masalah dengan memiliki dua soket yang terikat ke alamat lokal yang sama selama alamat jarak jauh berbeda.
Untuk menginformasikan implementasi Windows Sockets bahwa Bind panggilan pada soket tidak boleh dilarang karena alamat yang diinginkan sudah digunakan oleh soket lain, aplikasi harus mengatur SO_REUSEADDR opsi soket untuk soket sebelum mengeluarkan Bind panggilan. Perhatikan bahwa opsi hanya ditafsirkan pada saat Bind panggilan: oleh karena itu tidak perlu (tetapi tidak berbahaya) untuk mengatur opsi pada soket yang tidak terikat ke alamat yang ada, dan mengatur atau mengatur ulang opsi setelah Bind panggilan tidak berpengaruh pada soket ini atau lainnya.
Aplikasi dapat meminta agar implementasi Windows Sockets memungkinkan penggunaan paket "tetap hidup" pada koneksi Protokol Kontrol Transmisi (TCP) dengan mengaktifkan SO_KEEPALIVE opsi soket. Implementasi Windows Sockets tidak perlu mendukung penggunaan tetap hidup: jika ya, semantik yang tepat khusus implementasi tetapi harus sesuai dengan bagian 4.2.3.6 dari RFC 1122: "Persyaratan untuk Host Internet - Lapisan Komunikasi." Jika koneksi dihilangkan sebagai akibat dari "tetap hidup" kode WSAENETRESET kesalahan dikembalikan ke panggilan apa pun yang sedang berlangsung pada soket, dan setiap panggilan berikutnya akan gagal dengan WSAENOTCONN.
Opsi TCP_NODELAY menonaktifkan algoritma Nagle. Algoritma Nagle digunakan untuk mengurangi jumlah paket kecil yang dikirim oleh host dengan menyangga data pengiriman yang tidak diakui sampai paket ukuran penuh dapat dikirim. Namun, untuk beberapa aplikasi algoritma ini dapat menghambat performa, dan TCP_NODELAY dapat digunakan untuk mematikannya. Penulis aplikasi tidak boleh mengatur TCP_NODELAY kecuali dampak melakukannya dipahami dengan baik dan diinginkan, karena pengaturan TCP_NODELAY dapat memiliki dampak negatif yang signifikan pada performa jaringan.
TCP_NODELAY adalah satu-satunya opsi soket yang didukung yang menggunakan tingkat IPPROTO_TCP; semua opsi lainnya menggunakan tingkat SOL_SOCKET.
Beberapa implementasi informasi debug output suplai Soket Windows jika SO_DEBUG opsi diatur oleh aplikasi.
Opsi berikut didukung untuk SetSockOpt. Jenis mengidentifikasi jenis data yang ditangani oleh lpOptionValue.
| Nilai | Jenis | Makna |
|---|---|---|
SO_BROADCAST |
BOOL |
Izinkan transmisi pesan siaran pada soket. |
SO_DEBUG |
BOOL |
Rekam informasi penelusuran kesalahan. |
SO_DONTLINGER |
BOOL |
Jangan blokir Close menunggu data yang belum dikirim. Mengatur opsi ini setara dengan pengaturan SO_LINGER dengan l_onoff diatur ke nol. |
SO_DONTROUTE |
BOOL |
Jangan merutekan: kirim langsung ke antarmuka. |
SO_KEEPALIVE |
BOOL |
Kirim tetap hidup. |
SO_LINGER |
struct LINGER |
Hidup pada Close jika data yang tidak terkiron ada. |
SO_OOBINLINE |
BOOL |
Menerima data di luar band di aliran data normal. |
SO_RCVBUF |
int |
Tentukan ukuran buffer untuk penerimaan. |
SO_REUSEADDR |
BOOL |
Izinkan soket terikat ke alamat yang sudah digunakan. (Lihat Ikatan.) |
SO_SNDBUF |
int |
Tentukan ukuran buffer untuk pengiriman. |
TCP_NODELAY |
BOOL |
Menonaktifkan algoritma Nagle untuk mengirim coalescing. |
Opsi Berkeley Software Distribution (BSD) yang tidak didukung untuk SetSockOpt adalah:
| Nilai | Jenis | Makna |
|---|---|---|
SO_ACCEPTCONN |
BOOL |
Soket mendengarkan |
SO_ERROR |
int |
Dapatkan status kesalahan dan bersihkan. |
SO_RCVLOWAT |
int |
Menerima tanda air rendah. |
SO_RCVTIMEO |
int |
Menerima batas waktu |
SO_SNDLOWAT |
int |
Kirim tanda air rendah. |
SO_SNDTIMEO |
int |
Kirim batas waktu. |
SO_TYPE |
int |
Jenis soket. |
IP_OPTIONS |
Atur bidang opsi di header IP. |
CAsyncSocket::ShutDown
Panggil fungsi anggota ini untuk menonaktifkan pengiriman, penerimaan, atau keduanya pada soket.
BOOL ShutDown(int nHow = sends);
Parameter
nHow
Bendera yang menjelaskan jenis operasi apa yang tidak akan lagi diizinkan, menggunakan nilai enumerasi berikut:
penerimaan = 0
kirim = 1
keduanya = 2
Tampilkan Nilai
Bukan nol jika fungsi berhasil; jika tidak, 0, dan kode kesalahan tertentu dapat diambil dengan memanggil GetLastError. Kesalahan berikut berlaku untuk fungsi anggota ini:
WSANOTINITIALISEDKeberhasilanAfxSocketInitharus terjadi sebelum menggunakan API ini.WSAENETDOWNImplementasi Windows Sockets mendeteksi bahwa subsistem jaringan gagal.WSAEINVALnHowtidak valid.WSAEINPROGRESSOperasi Pemblokiran Windows Sockets sedang berlangsung.WSAENOTCONNSoket tidak tersambung (SOCK_STREAMhanya).WSAENOTSOCKDeskriptor bukan soket.
Keterangan
ShutDown digunakan pada semua jenis soket untuk menonaktifkan penerimaan, transmisi, atau keduanya. Jika nHow adalah 0, penerimaan berikutnya pada soket akan dilarang. Ini tidak berpengaruh pada lapisan protokol yang lebih rendah.
Untuk Protokol Kontrol Transmisi (TCP), jendela TCP tidak diubah dan data masuk akan diterima (tetapi tidak diakui) sampai jendela habis. Untuk Protokol Datagram Pengguna (UDP), datagram masuk diterima dan diantrekan. Tidak akan ada paket kesalahan ICMP yang dihasilkan. Jika nHow 1, pengiriman berikutnya tidak diizinkan. Untuk soket TCP, FIN akan dikirim. Pengaturan nHow ke 2 menonaktifkan pengiriman dan penerimaan seperti yang dijelaskan di atas.
Perhatikan bahwa tidak menutup soket, dan sumber daya yang ShutDown terpasang pada soket tidak akan dibebaskan hingga Close dipanggil. Aplikasi tidak boleh mengandalkan untuk dapat menggunakan kembali soket setelah dimatikan. Secara khusus, implementasi Windows Sockets tidak diperlukan untuk mendukung penggunaan Connect pada soket tersebut.
Contoh
Lihat contoh untuk CAsyncSocket::OnReceive.
CASyncSocket::Socket
Mengalokasikan handel soket.
BOOL Socket(
int nSocketType = SOCK_STREAM,
long lEvent = FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE,
int nProtocolType = 0,
int nAddressFormat = PF_INET);
Parameter
nSocketType
SOCK_STREAM Menentukan atau SOCK_DGRAM.
lEvent
Bitmask yang menentukan kombinasi peristiwa jaringan di mana aplikasi tertarik.
FD_READ: Ingin menerima pemberitahuan kesiapan untuk membaca.FD_WRITE: Ingin menerima pemberitahuan kesiapan untuk menulis.FD_OOB: Ingin menerima pemberitahuan kedatangan data di luar band.FD_ACCEPT: Ingin menerima pemberitahuan koneksi masuk.FD_CONNECT: Ingin menerima pemberitahuan koneksi yang telah selesai.FD_CLOSE: Ingin menerima pemberitahuan penutupan soket.
nProtocolType
Protokol yang akan digunakan dengan soket yang khusus untuk keluarga alamat yang ditunjukkan.
nAddressFormat
Spesifikasi keluarga alamat.
Tampilkan Nilai
Mengembalikan TRUE keberhasilan, FALSE jika gagal.
Keterangan
Metode ini mengalokasikan handel soket. Ini tidak memanggil CAsyncSocket::Bind untuk mengikat soket ke alamat tertentu, jadi Anda perlu memanggil Bind nanti untuk mengikat soket ke alamat tertentu. Anda dapat menggunakan CAsyncSocket::SetSockOpt untuk mengatur opsi soket sebelum terikat.
Lihat juga
CObject Kelas
Bagan Hierarki
CSocket Kelas
CSocketFile Kelas