CAsyncSocket
Kelas
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:
WSANOTINITIALISED
KeberhasilanAfxSocketInit
harus terjadi sebelum menggunakan API ini.WSAENETDOWN
Implementasi Windows Sockets mendeteksi bahwa subsistem jaringan gagal.WSAEFAULT
ArgumenlpSockAddrLen
terlalu kecil (kurang dariSOCKADDR
ukuran struktur).WSAEINPROGRESS
Panggilan Windows Sockets pemblokiran sedang berlangsung.WSAEINVAL
Listen
tidak dipanggil sebelum menerima.WSAEMFILE
Antrean kosong saat masuk untuk menerima dan tidak ada deskriptor yang tersedia.WSAENOBUFS
Tidak ada ruang buffer yang tersedia.WSAENOTSOCK
Deskriptor bukan soket.WSAEOPNOTSUPP
Soket yang direferensikan bukan jenis yang mendukung layanan berorientasi koneksi.WSAEWOULDBLOCK
Soket 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_READ
Ingin menerima pemberitahuan kesiapan untuk membaca.FD_WRITE
Ingin menerima pemberitahuan saat data tersedia untuk dibaca.FD_OOB
Ingin menerima pemberitahuan kedatangan data di luar band.FD_ACCEPT
Ingin menerima pemberitahuan koneksi masuk.FD_CONNECT
Ingin menerima pemberitahuan hasil koneksi.FD_CLOSE
Ingin 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:
WSANOTINITIALISED
KeberhasilanAfxSocketInit
harus terjadi sebelum menggunakan API ini.WSAENETDOWN
Implementasi Windows Sockets mendeteksi bahwa subsistem jaringan gagal.WSAEINVAL
Menunjukkan bahwa salah satu parameter yang ditentukan tidak valid.WSAEINPROGRESS
Operasi 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_READ
Ingin menerima pemberitahuan kesiapan untuk membaca.FD_WRITE
Ingin menerima pemberitahuan saat data tersedia untuk dibaca.FD_OOB
Ingin menerima pemberitahuan kedatangan data di luar band.FD_ACCEPT
Ingin menerima pemberitahuan koneksi masuk.FD_CONNECT
Ingin menerima pemberitahuan hasil koneksi.FD_CLOSE
Ingin 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.
WSANOTINITIALISED
KeberhasilanAfxSocketInit
harus terjadi sebelum menggunakan API ini.WSAENETDOWN
Implementasi Windows Sockets mendeteksi bahwa subsistem jaringan gagal.WSAEADDRINUSE
Alamat yang ditentukan sudah digunakan. (LihatSO_REUSEADDR
opsi soket di bawahSetSockOpt
.)WSAEFAULT
ArgumennSockAddrLen
terlalu kecil (kurang dariSOCKADDR
ukuran struktur).WSAEINPROGRESS
Panggilan Windows Sockets pemblokiran sedang berlangsung.WSAEAFNOSUPPORT
Keluarga alamat yang ditentukan tidak didukung oleh port ini.WSAEINVAL
Soket sudah terikat ke alamat.WSAENOBUFS
Tidak tersedia cukup buffer, terlalu banyak koneksi.WSAENOTSOCK
Deskriptor 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 Create
soket tersebutAccept
.)
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 GetSockOpt
anggota .
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 WSAEWOULDBLOCK
kesalahan , 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:
WSANOTINITIALISED
KeberhasilanAfxSocketInit
harus terjadi sebelum menggunakan API ini.WSAENETDOWN
Implementasi Windows Sockets mendeteksi bahwa subsistem jaringan gagal.WSAEADDRINUSE
Alamat yang ditentukan sudah digunakan.WSAEINPROGRESS
Panggilan Windows Sockets pemblokiran sedang berlangsung.WSAEADDRNOTAVAIL
Alamat yang ditentukan tidak tersedia dari komputer lokal.WSAEAFNOSUPPORT
Alamat dalam keluarga yang ditentukan tidak dapat digunakan dengan soket ini.WSAECONNREFUSED
Upaya untuk menyambungkan ditolak.WSAEDESTADDRREQ
Alamat tujuan diperlukan.WSAEFAULT
ArgumennSockAddrLen
salah.WSAEINVAL
Alamat host tidak valid.WSAEISCONN
Soket sudah tersambung.WSAEMFILE
Tidak ada lagi deskriptor file yang tersedia.WSAENETUNREACH
Jaringan tidak dapat dijangkau dari host ini saat ini.WSAENOBUFS
Tidak ada ruang buffer yang tersedia. Soket tidak dapat dihubungkan.WSAENOTSOCK
Deskriptor bukan soket.WSAETIMEDOUT
Coba sambungkan waktu habis tanpa membuat koneksi.WSAEWOULDBLOCK
Soket 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 Receive
berikutnyaSend
.
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_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.
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:
WSANOTINITIALISED
KeberhasilanAfxSocketInit
harus terjadi sebelum menggunakan API ini.WSAENETDOWN
Implementasi Windows Sockets mendeteksi bahwa subsistem jaringan gagal.WSAEAFNOSUPPORT
Keluarga alamat yang ditentukan tidak didukung.WSAEINPROGRESS
Operasi Pemblokiran Windows Sockets sedang berlangsung.WSAEMFILE
Tidak ada lagi deskriptor file yang tersedia.WSAENOBUFS
Tidak ada ruang buffer yang tersedia. Soket tidak dapat dibuat.WSAEPROTONOSUPPORT
Port yang ditentukan tidak didukung.WSAEPROTOTYPE
Port yang ditentukan adalah tipe yang salah untuk soket ini.WSAESOCKTNOSUPPORT
Jenis 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_STREAM
Menyediakan aliran byte berbasis koneksi yang berurutan, andal, dupleks penuh, dan berbasis koneksi. Menggunakan Protokol Kontrol Transmisi (TCP) untuk keluarga alamat Internet.SOCK_DGRAM
Mendukung 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
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.
Penting
Create
tidak 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_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.
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:
WSANOTINITIALISED
KeberhasilanAfxSocketInit
harus terjadi sebelum menggunakan API ini.WSAENETDOWN
Implementasi Windows Sockets mendeteksi bahwa subsistem jaringan gagal.WSAEFAULT
ArgumenlpSockAddrLen
tidak cukup besar.WSAEINPROGRESS
Panggilan Windows Sockets pemblokiran sedang berlangsung.WSAENOTCONN
Soket tidak tersambung.WSAENOTSOCK
Deskriptor 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:
WSANOTINITIALISED
KeberhasilanAfxSocketInit
harus terjadi sebelum menggunakan API ini.WSAENETDOWN
Implementasi Windows Sockets mendeteksi bahwa subsistem jaringan gagal.WSAEFAULT
ArgumenlpSockAddrLen
tidak cukup besar.WSAEINPROGRESS
Panggilan Windows Sockets pemblokiran sedang berlangsung.WSAENOTCONN
Soket tidak tersambung.WSAENOTSOCK
Deskriptor 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:
WSANOTINITIALISED
KeberhasilanAfxSocketInit
harus terjadi sebelum menggunakan API ini.WSAENETDOWN
Implementasi Windows Sockets mendeteksi bahwa subsistem jaringan gagal.WSAEFAULT
ArgumenlpSockAddrLen
tidak cukup besar.WSAEINPROGRESS
Operasi Pemblokiran Windows Sockets sedang berlangsung.WSAENOTSOCK
Deskriptor bukan soket.WSAEINVAL
Soket 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:
WSANOTINITIALISED
KeberhasilanAfxSocketInit
harus terjadi sebelum menggunakan API ini.WSAENETDOWN
Implementasi Windows Sockets mendeteksi bahwa subsistem jaringan gagal.WSAEFAULT
ArgumenlpSockAddrLen
tidak cukup besar.WSAEINPROGRESS
Operasi Pemblokiran Windows Sockets sedang berlangsung.WSAENOTSOCK
Deskriptor bukan soket.WSAEINVAL
Soket 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:
WSANOTINITIALISED
KeberhasilanAfxSocketInit
harus terjadi sebelum menggunakan API ini.WSAENETDOWN
Implementasi Windows Sockets mendeteksi bahwa subsistem jaringan gagal.WSAEFAULT
ArgumenlpOptionLen
tidak valid.WSAEINPROGRESS
Operasi Pemblokiran Windows Sockets sedang berlangsung.WSAENOPROTOOPT
Opsi tidak diketahui atau tidak didukung. Secara khusus,SO_BROADCAST
tidak didukung pada soket jenisSOCK_STREAM
, sementaraSO_ACCEPTCONN
, ,SO_DONTLINGER
SO_KEEPALIVE
,SO_LINGER
, danSO_OOBINLINE
tidak didukung pada soket jenisSOCK_DGRAM
.WSAENOTSOCK
Deskriptor 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:
WSANOTINITIALISED
KeberhasilanAfxSocketInit
harus terjadi sebelum menggunakan API ini.WSAENETDOWN
Implementasi Windows Sockets mendeteksi bahwa subsistem jaringan gagal.WSAEINVAL
lCommand
bukan perintah yang valid, ataulpArgument
bukan parameter yang dapat diterima untuklCommand
, atau perintah tidak berlaku untuk jenis soket yang disediakan.WSAEINPROGRESS
Operasi Pemblokiran Windows Sockets sedang berlangsung.WSAENOTSOCK
Deskriptor 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:
FIONBIO
Aktifkan atau nonaktifkan mode nonblocking pada soket. ParameterlpArgument
menunjuk pada , yang bukan nol jika mode nonblokir akan diaktifkan dan nol jika akan dinonaktifkanDWORD
. JikaAsyncSelect
telah dikeluarkan pada soket, maka setiap upaya yang digunakanIOCtl
untuk mengatur soket kembali ke mode pemblokiran akan gagal denganWSAEINVAL
. Untuk mengatur soket kembali ke mode pemblokiran dan mencegahWSAEINVAL
kesalahan, aplikasi harus terlebih dahulu menonaktifkanAsyncSelect
dengan memanggilAsyncSelect
dengan parameter sama denganlEvent
0, lalu memanggilIOCtl
.FIONREAD
Tentukan jumlah maksimum byte yang dapat dibaca dengan satuReceive
panggilan dari soket ini. ParameterlpArgument
menunjuk diDWORD
tempatIOCtl
menyimpan hasilnya. Jika soket ini berjenisSOCK_STREAM
,FIONREAD
mengembalikan jumlah total data yang dapat dibaca dalam satuReceive
; ini biasanya sama dengan jumlah total data yang diantrekan pada soket. Jika soket ini berjenisSOCK_DGRAM
,FIONREAD
mengembalikan ukuran datagram pertama yang diantrekan pada soket.SIOCATMARK
Tentukan apakah semua data di luar band telah dibaca. Ini hanya berlaku untuk soket jenisSOCK_STREAM
yang 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 berikutnyaReceive
atauReceiveFrom
dilakukan pada soket akan mengambil beberapa atau semua data sebelum "tanda"; aplikasi harus menggunakanSIOCATMARK
operasi 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 bahwaReceive
atauReceiveFrom
tidak akan pernah mencampur data di luar band dan normal dalam panggilan yang sama.) ParameterlpArgument
menunjuk diDWORD
tempatIOCtl
menyimpan 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:
WSANOTINITIALISED
KeberhasilanAfxSocketInit
harus terjadi sebelum menggunakan API ini.WSAENETDOWN
Implementasi Windows Sockets mendeteksi bahwa subsistem jaringan gagal.WSAEADDRINUSE
Upaya telah dilakukan untuk mendengarkan alamat yang digunakan.WSAEINPROGRESS
Operasi Pemblokiran Windows Sockets sedang berlangsung.WSAEINVAL
Soket belum terikat denganBind
atau sudah tersambung.WSAEISCONN
Soket sudah tersambung.WSAEMFILE
Tidak ada lagi deskriptor file yang tersedia.WSAENOBUFS
Tidak ada ruang buffer yang tersedia.WSAENOTSOCK
Deskriptor bukan soket.WSAEOPNOTSUPP
Soket yang dirujuk bukan jenis yang mendukungListen
operasi.
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.
WSAENETDOWN
Implementasi 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.
WSAENETDOWN
Implementasi Windows Sockets mendeteksi bahwa subsistem jaringan gagal.WSAECONNRESET
Koneksi direset oleh sisi jarak jauh.WSAECONNABORTED
Koneksi 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.
WSAEADDRINUSE
Alamat yang ditentukan sudah digunakan.WSAEADDRNOTAVAIL
Alamat yang ditentukan tidak tersedia dari komputer lokal.WSAEAFNOSUPPORT
Alamat dalam keluarga yang ditentukan tidak dapat digunakan dengan soket ini.WSAECONNREFUSED
Upaya untuk menyambungkan ditolak secara paksa.WSAEDESTADDRREQ
Alamat tujuan diperlukan.WSAEFAULT
ArgumenlpSockAddrLen
salah.WSAEINVAL
Soket sudah terikat ke alamat.WSAEISCONN
Soket sudah tersambung.WSAEMFILE
Tidak ada lagi deskriptor file yang tersedia.WSAENETUNREACH
Jaringan tidak dapat dijangkau dari host ini saat ini.WSAENOBUFS
Tidak ada ruang buffer yang tersedia. Soket tidak dapat dihubungkan.WSAENOTCONN
Soket tidak tersambung.WSAENOTSOCK
Deskriptor adalah file, bukan soket.WSAETIMEDOUT
Upaya 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.
WSAENETDOWN
Implementasi Windows Sockets mendeteksi bahwa subsistem jaringan gagal.
Keterangan
Data di luar band adalah saluran independen logis yang terkait dengan setiap pasangan soket jenis SOCK_STREAM
yang 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.
WSAENETDOWN
Implementasi 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.
WSAENETDOWN
Implementasi 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_PEEK
Intip data masuk. Data disalin ke dalam buffer tetapi tidak dihapus dari antrean input.MSG_OOB
Memproses 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:
WSANOTINITIALISED
KeberhasilanAfxSocketInit
harus terjadi sebelum menggunakan API ini.WSAENETDOWN
Implementasi Windows Sockets mendeteksi bahwa subsistem jaringan gagal.WSAENOTCONN
Soket tidak tersambung.WSAEINPROGRESS
Operasi Pemblokiran Windows Sockets sedang berlangsung.WSAENOTSOCK
Deskriptor bukan soket.WSAEOPNOTSUPP
MSG_OOB
ditentukan, tetapi soket bukan tipeSOCK_STREAM
.WSAESHUTDOWN
Soket telah dimatikan; tidak dimungkinkan untuk memanggilReceive
soket setelahShutDown
dipanggil dengannHow
diatur ke 0 atau 2.WSAEWOULDBLOCK
Soket ditandai sebagai nonblocking danReceive
operasi akan diblokir.WSAEMSGSIZE
Datagram terlalu besar agar pas dengan buffer yang ditentukan dan dipotong.WSAEINVAL
Soket belum terikat denganBind
.WSAECONNABORTED
Sirkuit virtual dibatalkan karena waktu habis atau kegagalan lainnya.WSAECONNRESET
Sirkuit 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_OOBINLINE
soket ) 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_PEEK
Intip data masuk. Data disalin ke dalam buffer tetapi tidak dihapus dari antrean input.MSG_OOB
Memproses 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:
WSANOTINITIALISED
KeberhasilanAfxSocketInit
harus terjadi sebelum menggunakan API ini.WSAENETDOWN
Implementasi Windows Sockets mendeteksi bahwa subsistem jaringan gagal.WSAEFAULT
ArgumenlpSockAddrLen
tidak valid:lpSockAddr
buffer terlalu kecil untuk mengakomodasi alamat serekan.WSAEINPROGRESS
Operasi Pemblokiran Windows Sockets sedang berlangsung.WSAEINVAL
Soket belum terikat denganBind
.WSAENOTCONN
Soket tidak tersambung (SOCK_STREAM
hanya).WSAENOTSOCK
Deskriptor bukan soket.WSAEOPNOTSUPP
MSG_OOB
ditentukan, tetapi soket bukan tipeSOCK_STREAM
.WSAESHUTDOWN
Soket telah dimatikan; tidak dimungkinkan untuk memanggilReceiveFrom
soket setelahShutDown
dipanggil dengannHow
diatur ke 0 atau 2.WSAEWOULDBLOCK
Soket ditandai sebagai nonblocking danReceiveFrom
operasi akan diblokir.WSAEMSGSIZE
Datagram terlalu besar agar pas dengan buffer yang ditentukan dan dipotong.WSAECONNABORTED
Sirkuit virtual dibatalkan karena waktu habis atau kegagalan lainnya.WSAECONNRESET
Sirkuit 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_OOBINLINE
soket ) 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_PEEK
Intip data masuk. Data disalin ke dalam buffer tetapi tidak dihapus dari antrean input.MSG_OOB
Memproses 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:
WSANOTINITIALISED
KeberhasilanAfxSocketInit
harus terjadi sebelum menggunakan API ini.WSAENETDOWN
Implementasi Windows Sockets mendeteksi bahwa subsistem jaringan gagal.WSAEFAULT
ArgumenlpSockAddrLen
tidak valid:lpSockAddr
buffer terlalu kecil untuk mengakomodasi alamat serekan.WSAEINPROGRESS
Operasi Pemblokiran Windows Sockets sedang berlangsung.WSAEINVAL
Soket belum terikat denganBind
.WSAENOTCONN
Soket tidak tersambung (SOCK_STREAM
hanya).WSAENOTSOCK
Deskriptor bukan soket.WSAEOPNOTSUPP
MSG_OOB
ditentukan, tetapi soket bukan tipeSOCK_STREAM
.WSAESHUTDOWN
Soket telah dimatikan; tidak dimungkinkan untuk memanggilReceiveFromEx
soket setelahShutDown
dipanggil dengannHow
diatur ke 0 atau 2.WSAEWOULDBLOCK
Soket ditandai sebagai nonblocking danReceiveFromEx
operasi akan diblokir.WSAEMSGSIZE
Datagram terlalu besar agar pas dengan buffer yang ditentukan dan dipotong.WSAECONNABORTED
Sirkuit virtual dibatalkan karena waktu habis atau kegagalan lainnya.WSAECONNRESET
Sirkuit 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_OOBINLINE
soket ) 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_DONTROUTE
Menentukan bahwa data tidak boleh tunduk pada perutean. Pemasok Windows Sockets dapat memilih untuk mengabaikan bendera ini.MSG_OOB
Kirim data di luar band (SOCK_STREAM
hanya).
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:
WSANOTINITIALISED
KeberhasilanAfxSocketInit
harus terjadi sebelum menggunakan API ini.WSAENETDOWN
Implementasi Windows Sockets mendeteksi bahwa subsistem jaringan gagal.WSAEACCES
Alamat yang diminta adalah alamat siaran, tetapi bendera yang sesuai tidak ditetapkan.WSAEINPROGRESS
Operasi Pemblokiran Windows Sockets sedang berlangsung.WSAEFAULT
ArgumenlpBuf
tidak berada di bagian ruang alamat pengguna yang valid.WSAENETRESET
Koneksi harus direset karena implementasi Windows Sockets menghilangkannya.WSAENOBUFS
Implementasi Windows Sockets melaporkan kebuntuan buffer.WSAENOTCONN
Soket tidak tersambung.WSAENOTSOCK
Deskriptor bukan soket.WSAEOPNOTSUPP
MSG_OOB
ditentukan, tetapi soket bukan tipeSOCK_STREAM
.WSAESHUTDOWN
Soket telah dimatikan; tidak dimungkinkan untuk memanggilSend
soket setelahShutDown
dipanggil dengannHow
diatur ke 1 atau 2.WSAEWOULDBLOCK
Soket ditandai sebagai nonblocking dan operasi yang diminta akan diblokir.WSAEMSGSIZE
Soket berjenisSOCK_DGRAM
, dan datagram lebih besar dari maksimum yang didukung oleh implementasi Windows Sockets.WSAEINVAL
Soket belum terikat denganBind
.WSAECONNABORTED
Sirkuit virtual dibatalkan karena waktu habis atau kegagalan lainnya.WSAECONNRESET
Sirkuit 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_DONTROUTE
Menentukan bahwa data tidak boleh tunduk pada perutean. Pemasok Windows Sockets dapat memilih untuk mengabaikan bendera ini.MSG_OOB
Kirim data di luar band (SOCK_STREAM
hanya).
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:
WSANOTINITIALISED
KeberhasilanAfxSocketInit
harus terjadi sebelum menggunakan API ini.WSAENETDOWN
Implementasi Windows Sockets mendeteksi bahwa subsistem jaringan gagal.WSAEACCES
Alamat yang diminta adalah alamat siaran, tetapi bendera yang sesuai tidak ditetapkan.WSAEINPROGRESS
Operasi Pemblokiran Windows Sockets sedang berlangsung.WSAEFAULT
ParameterlpBuf
ataulpSockAddr
bukan bagian dari ruang alamat pengguna, ataulpSockAddr
argumen terlalu kecil (kurang dari ukuranSOCKADDR
struktur).WSAEINVAL
Nama host tidak valid.WSAENETRESET
Koneksi harus direset karena implementasi Windows Sockets menghilangkannya.WSAENOBUFS
Implementasi Windows Sockets melaporkan kebuntuan buffer.WSAENOTCONN
Soket tidak tersambung (SOCK_STREAM
hanya).WSAENOTSOCK
Deskriptor bukan soket.WSAEOPNOTSUPP
MSG_OOB
ditentukan, tetapi soket bukan tipeSOCK_STREAM
.WSAESHUTDOWN
Soket telah dimatikan; tidak dimungkinkan untuk memanggilSendTo
soket setelahShutDown
dipanggil dengannHow
diatur ke 1 atau 2.WSAEWOULDBLOCK
Soket ditandai sebagai nonblocking dan operasi yang diminta akan diblokir.WSAEMSGSIZE
Soket berjenisSOCK_DGRAM
, dan datagram lebih besar dari maksimum yang didukung oleh implementasi Windows Sockets.WSAECONNABORTED
Sirkuit virtual dibatalkan karena waktu habis atau kegagalan lainnya.WSAECONNRESET
Sirkuit virtual direset oleh sisi jarak jauh.WSAEADDRNOTAVAIL
Alamat yang ditentukan tidak tersedia dari komputer lokal.WSAEAFNOSUPPORT
Alamat dalam keluarga yang ditentukan tidak dapat digunakan dengan soket ini.WSAEDESTADDRREQ
Alamat tujuan diperlukan.WSAENETUNREACH
Jaringan 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.H
header 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_DONTROUTE
Menentukan bahwa data tidak boleh tunduk pada perutean. Pemasok Windows Sockets dapat memilih untuk mengabaikan bendera ini.MSG_OOB
Kirim data di luar band (SOCK_STREAM
hanya).
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:
WSANOTINITIALISED
KeberhasilanAfxSocketInit
harus terjadi sebelum menggunakan API ini.WSAENETDOWN
Implementasi Windows Sockets mendeteksi bahwa subsistem jaringan gagal.WSAEACCES
Alamat yang diminta adalah alamat siaran, tetapi bendera yang sesuai tidak ditetapkan.WSAEINPROGRESS
Operasi Pemblokiran Windows Sockets sedang berlangsung.WSAEFAULT
ParameterlpBuf
ataulpSockAddr
bukan bagian dari ruang alamat pengguna, ataulpSockAddr
argumen terlalu kecil (kurang dari ukuranSOCKADDR
struktur).WSAEINVAL
Nama host tidak valid.WSAENETRESET
Koneksi harus direset karena implementasi Windows Sockets menghilangkannya.WSAENOBUFS
Implementasi Windows Sockets melaporkan kebuntuan buffer.WSAENOTCONN
Soket tidak tersambung (SOCK_STREAM
hanya).WSAENOTSOCK
Deskriptor bukan soket.WSAEOPNOTSUPP
MSG_OOB
ditentukan, tetapi soket bukan tipeSOCK_STREAM
.WSAESHUTDOWN
Soket telah dimatikan; tidak dimungkinkan untuk memanggilSendToEx
soket setelahShutDown
dipanggil dengannHow
diatur ke 1 atau 2.WSAEWOULDBLOCK
Soket ditandai sebagai nonblocking dan operasi yang diminta akan diblokir.WSAEMSGSIZE
Soket berjenisSOCK_DGRAM
, dan datagram lebih besar dari maksimum yang didukung oleh implementasi Windows Sockets.WSAECONNABORTED
Sirkuit virtual dibatalkan karena waktu habis atau kegagalan lainnya.WSAECONNRESET
Sirkuit virtual direset oleh sisi jarak jauh.WSAEADDRNOTAVAIL
Alamat yang ditentukan tidak tersedia dari komputer lokal.WSAEAFNOSUPPORT
Alamat dalam keluarga yang ditentukan tidak dapat digunakan dengan soket ini.WSAEDESTADDRREQ
Alamat tujuan diperlukan.WSAENETUNREACH
Jaringan 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.H
header 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:
WSANOTINITIALISED
KeberhasilanAfxSocketInit
harus terjadi sebelum menggunakan API ini.WSAENETDOWN
Implementasi Windows Sockets mendeteksi bahwa subsistem jaringan gagal.WSAEFAULT
lpOptionValue
tidak berada dalam bagian yang valid dari ruang alamat proses.WSAEINPROGRESS
Operasi Pemblokiran Windows Sockets sedang berlangsung.WSAEINVAL
nLevel
tidak valid, atau informasi dilpOptionValue
tidak valid.WSAENETRESET
Koneksi telah kehabisan waktu ketikaSO_KEEPALIVE
diatur.WSAENOPROTOOPT
Opsi tidak diketahui atau tidak didukung. Secara khusus,SO_BROADCAST
tidak didukung pada soket jenisSOCK_STREAM
, sementaraSO_DONTLINGER
, ,SO_KEEPALIVE
SO_LINGER
, danSO_OOBINLINE
tidak didukung pada soket jenisSOCK_DGRAM
.WSAENOTCONN
Koneksi telah direset ketikaSO_KEEPALIVE
diatur.WSAENOTSOCK
Deskriptor 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:
WSANOTINITIALISED
KeberhasilanAfxSocketInit
harus terjadi sebelum menggunakan API ini.WSAENETDOWN
Implementasi Windows Sockets mendeteksi bahwa subsistem jaringan gagal.WSAEINVAL
nHow
tidak valid.WSAEINPROGRESS
Operasi Pemblokiran Windows Sockets sedang berlangsung.WSAENOTCONN
Soket tidak tersambung (SOCK_STREAM
hanya).WSAENOTSOCK
Deskriptor 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