Bagikan melalui


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

CObject

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 Keberhasilan AfxSocketInit harus terjadi sebelum menggunakan API ini.

  • WSAENETDOWN Implementasi Windows Sockets mendeteksi bahwa subsistem jaringan gagal.

  • WSAEFAULT Argumen lpSockAddrLen terlalu kecil (kurang dari SOCKADDR ukuran struktur).

  • WSAEINPROGRESS Panggilan Windows Sockets pemblokiran sedang berlangsung.

  • WSAEINVALListen 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 Keberhasilan AfxSocketInit 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 Keberhasilan AfxSocketInit harus terjadi sebelum menggunakan API ini.

  • WSAENETDOWN Implementasi Windows Sockets mendeteksi bahwa subsistem jaringan gagal.

  • WSAEADDRINUSE Alamat yang ditentukan sudah digunakan. (Lihat SO_REUSEADDR opsi soket di bawah SetSockOpt.)

  • WSAEFAULT Argumen nSockAddrLen terlalu kecil (kurang dari SOCKADDR 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 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:

  • WSANOTINITIALISED Keberhasilan AfxSocketInit 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 Argumen nSockAddrLen 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 Keberhasilan AfxSocketInit 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

CreateSocket 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 kosong CSocket baru sebagai parameternya. Anda harus membuat objek ini sebelum memanggil Accept. Perlu diingat bahwa jika objek soket ini keluar dari cakupan, koneksi ditutup. Jangan panggil Create untuk objek soket baru ini.

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_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 Keberhasilan AfxSocketInit harus terjadi sebelum menggunakan API ini.

  • WSAENETDOWN Implementasi Windows Sockets mendeteksi bahwa subsistem jaringan gagal.

  • WSAEFAULT Argumen lpSockAddrLen 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 Keberhasilan AfxSocketInit harus terjadi sebelum menggunakan API ini.

  • WSAENETDOWN Implementasi Windows Sockets mendeteksi bahwa subsistem jaringan gagal.

  • WSAEFAULT Argumen lpSockAddrLen 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 Keberhasilan AfxSocketInit harus terjadi sebelum menggunakan API ini.

  • WSAENETDOWN Implementasi Windows Sockets mendeteksi bahwa subsistem jaringan gagal.

  • WSAEFAULT Argumen lpSockAddrLen tidak cukup besar.

  • WSAEINPROGRESS Operasi Pemblokiran Windows Sockets sedang berlangsung.

  • WSAENOTSOCK Deskriptor bukan soket.

  • WSAEINVAL Soket belum terikat ke alamat dengan Bind.

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 Keberhasilan AfxSocketInit harus terjadi sebelum menggunakan API ini.

  • WSAENETDOWN Implementasi Windows Sockets mendeteksi bahwa subsistem jaringan gagal.

  • WSAEFAULT Argumen lpSockAddrLen tidak cukup besar.

  • WSAEINPROGRESS Operasi Pemblokiran Windows Sockets sedang berlangsung.

  • WSAENOTSOCK Deskriptor bukan soket.

  • WSAEINVAL Soket belum terikat ke alamat dengan Bind.

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 Keberhasilan AfxSocketInit harus terjadi sebelum menggunakan API ini.

  • WSAENETDOWN Implementasi Windows Sockets mendeteksi bahwa subsistem jaringan gagal.

  • WSAEFAULT Argumen lpOptionLen tidak valid.

  • WSAEINPROGRESS Operasi Pemblokiran Windows Sockets sedang berlangsung.

  • WSAENOPROTOOPT Opsi tidak diketahui atau tidak didukung. Secara khusus, SO_BROADCAST tidak didukung pada soket jenis SOCK_STREAM, sementara SO_ACCEPTCONN, , SO_DONTLINGERSO_KEEPALIVE, SO_LINGER, dan SO_OOBINLINE tidak didukung pada soket jenis SOCK_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 Keberhasilan AfxSocketInit harus terjadi sebelum menggunakan API ini.

  • WSAENETDOWN Implementasi Windows Sockets mendeteksi bahwa subsistem jaringan gagal.

  • WSAEINVALlCommand bukan perintah yang valid, atau lpArgument bukan parameter yang dapat diterima untuk lCommand, 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. Parameter lpArgument menunjuk pada , yang bukan nol jika mode nonblokir akan diaktifkan dan nol jika akan dinonaktifkan DWORD. Jika AsyncSelect telah dikeluarkan pada soket, maka setiap upaya yang digunakan IOCtl untuk mengatur soket kembali ke mode pemblokiran akan gagal dengan WSAEINVAL. Untuk mengatur soket kembali ke mode pemblokiran dan mencegah WSAEINVAL kesalahan, aplikasi harus terlebih dahulu menonaktifkan AsyncSelect dengan memanggil AsyncSelect dengan parameter sama dengan lEvent 0, lalu memanggil IOCtl.

  • FIONREAD Tentukan jumlah maksimum byte yang dapat dibaca dengan satu Receive panggilan dari soket ini. Parameter lpArgument menunjuk di DWORD tempat IOCtl menyimpan hasilnya. Jika soket ini berjenis SOCK_STREAM, FIONREAD mengembalikan jumlah total data yang dapat dibaca dalam satu Receive; ini biasanya sama dengan jumlah total data yang diantrekan pada soket. Jika soket ini berjenis SOCK_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 jenis SOCK_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 berikutnya Receive atau ReceiveFrom dilakukan pada soket akan mengambil beberapa atau semua data sebelum "tanda"; aplikasi harus menggunakan SIOCATMARK 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 bahwa Receive atau ReceiveFrom tidak akan pernah mencampur data di luar band dan normal dalam panggilan yang sama.) Parameter lpArgument menunjuk di DWORD tempat IOCtl 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 Keberhasilan AfxSocketInit 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 dengan Bind 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 mendukung Listen 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 Argumen lpSockAddrLen 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_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.

  • 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 Keberhasilan AfxSocketInit 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.

  • WSAEOPNOTSUPPMSG_OOB ditentukan, tetapi soket bukan tipe SOCK_STREAM.

  • WSAESHUTDOWN Soket telah dimatikan; tidak dimungkinkan untuk memanggil Receive soket setelah ShutDown dipanggil dengan nHow diatur ke 0 atau 2.

  • WSAEWOULDBLOCK Soket ditandai sebagai nonblocking dan Receive operasi akan diblokir.

  • WSAEMSGSIZE Datagram terlalu besar agar pas dengan buffer yang ditentukan dan dipotong.

  • WSAEINVAL Soket belum terikat dengan Bind.

  • 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_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_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 Keberhasilan AfxSocketInit harus terjadi sebelum menggunakan API ini.

  • WSAENETDOWN Implementasi Windows Sockets mendeteksi bahwa subsistem jaringan gagal.

  • WSAEFAULT Argumen lpSockAddrLen tidak valid: lpSockAddr buffer terlalu kecil untuk mengakomodasi alamat serekan.

  • WSAEINPROGRESS Operasi Pemblokiran Windows Sockets sedang berlangsung.

  • WSAEINVAL Soket belum terikat dengan Bind.

  • WSAENOTCONN Soket tidak tersambung (SOCK_STREAM hanya).

  • WSAENOTSOCK Deskriptor bukan soket.

  • WSAEOPNOTSUPPMSG_OOB ditentukan, tetapi soket bukan tipe SOCK_STREAM.

  • WSAESHUTDOWN Soket telah dimatikan; tidak dimungkinkan untuk memanggil ReceiveFrom soket setelah ShutDown dipanggil dengan nHow diatur ke 0 atau 2.

  • WSAEWOULDBLOCK Soket ditandai sebagai nonblocking dan ReceiveFrom 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_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_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 Keberhasilan AfxSocketInit harus terjadi sebelum menggunakan API ini.

  • WSAENETDOWN Implementasi Windows Sockets mendeteksi bahwa subsistem jaringan gagal.

  • WSAEFAULT Argumen lpSockAddrLen tidak valid: lpSockAddr buffer terlalu kecil untuk mengakomodasi alamat serekan.

  • WSAEINPROGRESS Operasi Pemblokiran Windows Sockets sedang berlangsung.

  • WSAEINVAL Soket belum terikat dengan Bind.

  • WSAENOTCONN Soket tidak tersambung (SOCK_STREAM hanya).

  • WSAENOTSOCK Deskriptor bukan soket.

  • WSAEOPNOTSUPPMSG_OOB ditentukan, tetapi soket bukan tipe SOCK_STREAM.

  • WSAESHUTDOWN Soket telah dimatikan; tidak dimungkinkan untuk memanggil ReceiveFromEx soket setelah ShutDown dipanggil dengan nHow diatur ke 0 atau 2.

  • WSAEWOULDBLOCK Soket ditandai sebagai nonblocking dan ReceiveFromEx 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_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_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 Keberhasilan AfxSocketInit 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 Argumen lpBuf 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.

  • WSAEOPNOTSUPPMSG_OOB ditentukan, tetapi soket bukan tipe SOCK_STREAM.

  • WSAESHUTDOWN Soket telah dimatikan; tidak dimungkinkan untuk memanggil Send soket setelah ShutDown dipanggil dengan nHow diatur ke 1 atau 2.

  • WSAEWOULDBLOCK Soket ditandai sebagai nonblocking dan operasi yang diminta akan diblokir.

  • WSAEMSGSIZE Soket berjenis SOCK_DGRAM, dan datagram lebih besar dari maksimum yang didukung oleh implementasi Windows Sockets.

  • WSAEINVAL Soket belum terikat dengan Bind.

  • 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 Keberhasilan AfxSocketInit 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 Parameter lpBuf atau lpSockAddr bukan bagian dari ruang alamat pengguna, atau lpSockAddr argumen terlalu kecil (kurang dari ukuran SOCKADDR 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.

  • WSAEOPNOTSUPPMSG_OOB ditentukan, tetapi soket bukan tipe SOCK_STREAM.

  • WSAESHUTDOWN Soket telah dimatikan; tidak dimungkinkan untuk memanggil SendTo soket setelah ShutDown dipanggil dengan nHow diatur ke 1 atau 2.

  • WSAEWOULDBLOCK Soket ditandai sebagai nonblocking dan operasi yang diminta akan diblokir.

  • WSAEMSGSIZE Soket berjenis SOCK_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.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_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 Keberhasilan AfxSocketInit 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 Parameter lpBuf atau lpSockAddr bukan bagian dari ruang alamat pengguna, atau lpSockAddr argumen terlalu kecil (kurang dari ukuran SOCKADDR 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.

  • WSAEOPNOTSUPPMSG_OOB ditentukan, tetapi soket bukan tipe SOCK_STREAM.

  • WSAESHUTDOWN Soket telah dimatikan; tidak dimungkinkan untuk memanggil SendToEx soket setelah ShutDown dipanggil dengan nHow diatur ke 1 atau 2.

  • WSAEWOULDBLOCK Soket ditandai sebagai nonblocking dan operasi yang diminta akan diblokir.

  • WSAEMSGSIZE Soket berjenis SOCK_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.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:

  • WSANOTINITIALISED Keberhasilan AfxSocketInit harus terjadi sebelum menggunakan API ini.

  • WSAENETDOWN Implementasi Windows Sockets mendeteksi bahwa subsistem jaringan gagal.

  • WSAEFAULTlpOptionValue tidak berada dalam bagian yang valid dari ruang alamat proses.

  • WSAEINPROGRESS Operasi Pemblokiran Windows Sockets sedang berlangsung.

  • WSAEINVALnLevel tidak valid, atau informasi di lpOptionValue tidak valid.

  • WSAENETRESET Koneksi telah kehabisan waktu ketika SO_KEEPALIVE diatur.

  • WSAENOPROTOOPT Opsi tidak diketahui atau tidak didukung. Secara khusus, SO_BROADCAST tidak didukung pada soket jenis SOCK_STREAM, sementara SO_DONTLINGER, , SO_KEEPALIVESO_LINGER, dan SO_OOBINLINE tidak didukung pada soket jenis SOCK_DGRAM.

  • WSAENOTCONN Koneksi telah direset ketika SO_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 Keberhasilan AfxSocketInit harus terjadi sebelum menggunakan API ini.

  • WSAENETDOWN Implementasi Windows Sockets mendeteksi bahwa subsistem jaringan gagal.

  • WSAEINVALnHow 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