Fungsi WSAEnumNetworkEvents (winsock2.h)
Fungsi WSAEnumNetworkEvents menemukan kemunculan peristiwa jaringan untuk soket yang ditunjukkan, menghapus rekaman peristiwa jaringan internal, dan mengatur ulang objek peristiwa (opsional).
Sintaks
int WSAAPI WSAEnumNetworkEvents(
[in] SOCKET s,
[in] WSAEVENT hEventObject,
[out] LPWSANETWORKEVENTS lpNetworkEvents
);
Parameter
[in] s
Deskriptor yang mengidentifikasi soket.
[in] hEventObject
Handel opsional yang mengidentifikasi objek peristiwa terkait yang akan direset.
[out] lpNetworkEvents
Penunjuk ke struktur WSANETWORKEVENTS yang diisi dengan catatan peristiwa jaringan yang terjadi dan kode kesalahan terkait.
Mengembalikan nilai
Nilai yang dikembalikan adalah nol jika operasi berhasil. Jika tidak, nilai SOCKET_ERROR dikembalikan, dan nomor kesalahan tertentu dapat diambil dengan memanggil WSAGetLastError.
Kode kesalahan | Makna |
---|---|
Panggilan WSAStartup yang berhasil harus terjadi sebelum menggunakan fungsi ini. | |
Subsistem jaringan gagal. | |
Salah satu parameter yang ditentukan tidak valid. | |
Panggilan Windows Sockets 1.1 yang diblokir sedang berlangsung, atau penyedia layanan masih memproses fungsi panggilan balik. | |
Deskriptor bukan soket. | |
Parameter lpNetworkEvents bukan bagian yang valid dari ruang alamat pengguna. |
Keterangan
Fungsi WSAEnumNetworkEvents digunakan untuk menemukan peristiwa jaringan mana yang telah terjadi untuk soket yang ditunjukkan sejak pemanggilan terakhir fungsi ini. Ini dimaksudkan untuk digunakan bersama dengan WSAEventSelect, yang mengaitkan objek peristiwa dengan satu atau beberapa peristiwa jaringan. Perekaman peristiwa jaringan dimulai ketika WSAEventSelect dipanggil dengan parameter lNetworkEvents nonzero dan tetap berlaku sampai panggilan lain dilakukan ke WSAEventSelect dengan parameter lNetworkEvents diatur ke nol, atau sampai panggilan dilakukan ke WSAAsyncSelect.
WSAEnumNetworkEvents hanya melaporkan aktivitas jaringan dan kesalahan yang dicalonkan melalui WSAEventSelect. Lihat deskripsi pilih dan WSAAsyncSelect untuk mengetahui bagaimana fungsi tersebut melaporkan aktivitas dan kesalahan jaringan.
Catatan internal soket peristiwa jaringan disalin ke struktur yang direferensikan oleh lpNetworkEvents, setelah itu rekaman peristiwa jaringan internal dihapus. Jika parameter hEventObject bukan NULL, objek peristiwa yang ditunjukkan juga diatur ulang. Penyedia Windows Sockets menjamin bahwa operasi penyalinan rekaman peristiwa jaringan, membersihkannya dan mengatur ulang objek peristiwa terkait bersifat atomik, sehingga kejadian berikutnya dari peristiwa jaringan yang ditunjuk akan menyebabkan objek peristiwa diatur. Dalam kasus fungsi ini mengembalikan SOCKET_ERROR, objek peristiwa terkait tidak diatur ulang dan catatan peristiwa jaringan tidak dihapus.
Anggota lNetworkEvents dari struktur WSANETWORKEVENTS menunjukkan peristiwa jaringan FD_XXX mana yang telah terjadi. Array iErrorCode digunakan untuk berisi kode kesalahan terkait dengan indeks array yang sesuai dengan posisi bit peristiwa di lNetworkEvents. Pengidentifikasi seperti FD_READ_BIT dan FD_WRITE_BIT dapat digunakan untuk mengindeks array iErrorCode . Perhatikan bahwa hanya elemen array iErrorCode yang diatur yang sesuai dengan bit yang diatur dalam parameter lNetworkEvents . Parameter lain tidak dimodifikasi (ini penting untuk kompatibilitas mundur dengan aplikasi yang tidak mengetahui peristiwa FD_ROUTING_INTERFACE_CHANGE dan FD_ADDRESS_LIST_CHANGE baru).
Kode kesalahan berikut dapat dikembalikan bersama dengan peristiwa jaringan yang sesuai.
Peristiwa: FD_CONNECT
Kode kesalahan | Makna |
---|---|
WSAEAFNOSUPPORT | Alamat dalam keluarga yang ditentukan tidak dapat digunakan dengan soket ini. |
WSAECONNREFUSED | Upaya untuk terhubung ditolak secara paksa. |
WSAENETUNREACH | Jaringan tidak dapat dijangkau dari host ini saat ini. |
WSAENOBUFS | Tidak ada ruang buffer yang tersedia. Soket tidak dapat dihubungkan. |
WSAETIMEDOUT | Upaya untuk menyambungkan kehabisan waktu tanpa membuat koneksi |
Peristiwa: FD_CLOSE
Kode kesalahan | Makna |
---|---|
WSAENETDOWN | Subsistem jaringan gagal. |
WSAECONNRESET | Koneksi direset oleh sisi jarak jauh. |
WSAECONNABORTED | Koneksi dihentikan karena waktu habis atau kegagalan lainnya. |
Peristiwa: FD_ACCEPT
Peristiwa: FD_ADDRESS_LIST_CHANGE
Peristiwa: FD_GROUP_QOS
Peristiwa: FD_QOS
Peristiwa: FD_OOB
Peristiwa: FD_READ
Peristiwa: FD_WRITE
Kode kesalahan | Makna |
---|---|
WSAENETDOWN | Subsistem jaringan gagal. |
Peristiwa: FD_ROUTING_INTERFACE_CHANGE
Kode kesalahan | Makna |
---|---|
WSAENETUNREACH | Tujuan yang ditentukan tidak lagi dapat dijangkau. |
WSAENETDOWN | Subsistem jaringan gagal. |
Contoh Kode
Contoh berikut menunjukkan penggunaan fungsi WSAEnumNetworkEvents.#ifndef UNICODE
#define UNICODE
#endif
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <winsock2.h>
#include <Ws2tcpip.h>
#include <stdio.h>
// Link with ws2_32.lib
#pragma comment(lib, "Ws2_32.lib")
int main()
{
//-------------------------
// Declare and initialize variables
WSADATA wsaData;
int iResult;
SOCKET SocketArray[WSA_MAXIMUM_WAIT_EVENTS], ListenSocket;
WSAEVENT EventArray[WSA_MAXIMUM_WAIT_EVENTS];
WSANETWORKEVENTS NetworkEvents;
sockaddr_in InetAddr;
DWORD EventTotal = 0;
DWORD Index;
DWORD i;
HANDLE NewEvent = NULL;
// Initialize Winsock
iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
if (iResult != 0) {
wprintf(L"WSAStartup failed with error: %d\n", iResult);
return 1;
}
//-------------------------
// Create a listening socket
ListenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (ListenSocket == INVALID_SOCKET) {
wprintf(L"socket function failed with error: %d\n", WSAGetLastError() );
return 1;
}
InetAddr.sin_family = AF_INET;
InetAddr.sin_addr.s_addr = htonl(INADDR_ANY);
InetAddr.sin_port = htons(27015);
//-------------------------
// Bind the listening socket
iResult = bind(ListenSocket, (SOCKADDR *) & InetAddr, sizeof (InetAddr));
if (iResult != 0) {
wprintf(L"bind failed with error: %d\n", WSAGetLastError() );
return 1;
}
//-------------------------
// Create a new event
NewEvent = WSACreateEvent();
if (NewEvent == NULL) {
wprintf(L"WSACreateEvent failed with error: %d\n", GetLastError() );
return 1;
}
//-------------------------
// Associate event types FD_ACCEPT and FD_CLOSE
// with the listening socket and NewEvent
iResult = WSAEventSelect(ListenSocket, NewEvent, FD_ACCEPT | FD_CLOSE);
if (iResult != 0) {
wprintf(L"WSAEventSelect failed with error: %d\n", WSAGetLastError() );
return 1;
}
//-------------------------
// Start listening on the socket
iResult = listen(ListenSocket, 10);
if (iResult != 0) {
wprintf(L"listen failed with error: %d\n", WSAGetLastError() );
return 1;
}
//-------------------------
// Add the socket and event to the arrays, increment number of events
SocketArray[EventTotal] = ListenSocket;
EventArray[EventTotal] = NewEvent;
EventTotal++;
//-------------------------
// Wait for network events on all sockets
Index = WSAWaitForMultipleEvents(EventTotal, EventArray, FALSE, WSA_INFINITE, FALSE);
Index = Index - WSA_WAIT_EVENT_0;
//-------------------------
// Iterate through all events and enumerate
// if the wait does not fail.
for (i = Index; i < EventTotal; i++) {
Index = WSAWaitForMultipleEvents(1, &EventArray[i], TRUE, 1000, FALSE);
if ((Index != WSA_WAIT_FAILED) && (Index != WSA_WAIT_TIMEOUT)) {
WSAEnumNetworkEvents(SocketArray[i], EventArray[i], &NetworkEvents);
}
}
//...
return 0;
Windows Phone 8: Fungsi ini didukung untuk aplikasi Windows Phone Store di Windows Phone 8 dan yang lebih baru.
Windows 8.1 dan Windows Server 2012 R2: Fungsi ini didukung untuk aplikasi Windows Store di Windows 8.1, Windows Server 2012 R2, dan yang lebih baru.
Persyaratan
Persyaratan | Nilai |
---|---|
Klien minimum yang didukung | Windows 8.1, Windows Vista [aplikasi desktop | Aplikasi UWP] |
Server minimum yang didukung | Windows Server 2003 [aplikasi desktop | Aplikasi UWP] |
Target Platform | Windows |
Header | winsock2.h |
Pustaka | Ws2_32.lib |
DLL | Ws2_32.dll |