Bagikan melalui


Kode Kontrol SIO_RCVALL

Deskripsi

Kode kontrol SIO_RCVALL memungkinkan soket untuk menerima semua paket IPv4 atau IPv6 yang melewati antarmuka jaringan.

Untuk melakukan operasi ini, panggil fungsi WSAIoctl atau WSPIoctl dengan parameter berikut.

int WSAIoctl(
  (socket) s,            // descriptor identifying a socket
  SIO_RCV_ALL,                       // dwIoControlCode
  NULL,                              // lpvInBuffer
  0,                                 // cbInBuffer
  NULL,                              // lpvOutBuffer output buffer
  (DWORD) cbOutBuffer,            // size of output buffer  
  (LPDWORD) lpcbBytesReturned,    // number of bytes returned
  (LPWSAOVERLAPPED) lpOverlapped, // OVERLAPPED structure
  (LPWSAOVERLAPPED_COMPLETION_ROUTINE) lpCompletionRoutine,  // completion routine
);

Parameter

s

Deskriptor yang mengidentifikasi soket.

dwIoControlCode

Kode kontrol untuk operasi. Gunakan SIO_RCVALL untuk operasi ini.

lpvInBuffer

Penunjuk ke buffer input yang harus berisi nilai opsi. Nilai yang mungkin untuk opsi IOCTL SIO_RCVALL ditentukan dalam enumerasi RCVALL_VALUE yang ditentukan dalam file header Mstcpip.h .

Nilai yang mungkin untuk SIO_RCVALL adalah sebagai berikut:

Nilai Makna
RCVALL_OFF Nonaktifkan opsi ini sehingga soket tidak menerima semua paket IPv4 atau IPv6 yang melewati antarmuka jaringan.
RCVALL_ON Aktifkan opsi ini sehingga soket menerima semua paket IPv4 atau IPv6 yang melewati antarmuka jaringan. Opsi ini memungkinkan mode promiscuous pada kartu antarmuka jaringan (NIC), jika NIC mendukung mode promiscuous. Pada segmen LAN dengan hub jaringan, NIC yang mendukung mode promiscuous akan menangkap semua lalu lintas IPv4 atau IPv6 di LAN, termasuk lalu lintas antara komputer lain pada segmen LAN yang sama. Semua paket yang ditangkap (IPv4 atau IPv6, tergantung pada soket) akan dikirimkan ke soket mentah. Opsi ini tidak akan mengambil paket lain (paket ARP, IPX, dan NetBEUI, misalnya) pada antarmuka. Netmon menggunakan mode yang sama untuk antarmuka jaringan, tetapi tidak menggunakan opsi ini untuk menangkap lalu lintas.
RCVALL_SOCKETLEVELONLY Fitur ini saat ini tidak diimplementasikan, sehingga pengaturan opsi ini tidak memiliki pengaruh apa pun.
RCVALL_IPLEVEL Aktifkan opsi ini sehingga soket IPv4 atau IPv6 menerima semua paket di tingkat IP yang melewati antarmuka jaringan. Opsi ini tidak mengaktifkan mode promiscuous pada kartu antarmuka jaringan. Opsi ini hanya memengaruhi pemrosesan paket di tingkat IP. NIC masih hanya menerima paket yang diarahkan ke alamat unicast dan multicast yang dikonfigurasi. Namun, soket dengan opsi ini diaktifkan akan menerima tidak hanya paket yang diarahkan ke alamat IP tertentu, tetapi akan menerima semua paket IPv4 atau IPv6 yang diterima NIC. Opsi ini tidak akan mengambil paket lain (paket ARP, IPX, dan NetBEUI, misalnya) yang diterima pada antarmuka.

cbInBuffer

Ukuran, dalam byte, dari buffer input. Parameter ini harus sama dengan atau lebih besar dari ukuran nilai enumerasi RCVALL_VALUE yang ditujukkan oleh parameter lpvInBuffer .

lpvOutBuffer

Penunjuk ke buffer output. Parameter ini tidak digunakan untuk operasi ini.

cbOutBuffer

Ukuran, dalam byte, dari buffer output. Parameter ini tidak digunakan untuk operasi ini.

lpcbBytesReturned

Penunjuk ke variabel yang menerima ukuran, dalam byte, dari data yang disimpan dalam buffer output. Parameter ini tidak digunakan untuk operasi ini.

lpvOverlapped

Penunjuk ke struktur WSAOVERLAPPED .

Jika soket dibuat tanpa atribut yang tumpang tindih, parameter lpOverlapped diabaikan.

Jika s dibuka dengan atribut yang tumpang tindih dan parameter lpOverlapped bukan NULL, operasi dilakukan sebagai operasi yang tumpang tindih (asinkron). Dalam hal ini, parameter lpOverlapped harus menunjuk ke struktur WSAOVERLAPPED yang valid.

Untuk operasi yang tumpang tindih, fungsi WSAIoctl atau WSPIoctl segera kembali, dan metode penyelesaian yang sesuai disinyalkan ketika operasi telah selesai. Jika tidak, fungsi tidak kembali sampai operasi selesai atau terjadi kesalahan.

lpCompletionRoutine

Jenis: LPWSAOVERLAPPED_COMPLETION_ROUTINE _In_opt_

Penunjuk ke rutinitas penyelesaian yang dipanggil ketika operasi telah selesai (diabaikan untuk soket yang tidak tumpang tindih).

lpThreadId

Penunjuk ke struktur WSATHREADID yang akan digunakan oleh penyedia dalam panggilan berikutnya ke WPUQueueApc. Penyedia harus menyimpan struktur WSATHREADID yang direferensikan (bukan penunjuk ke yang sama) sampai setelah fungsi WPUQueueApc kembali.

Catatan Parameter ini hanya berlaku untuk fungsi WSPIoctl .

lpErrno

Penunjuk ke kode kesalahan.

Catatan Parameter ini hanya berlaku untuk fungsi WSPIoctl .

Nilai kembali

Jika operasi berhasil diselesaikan, fungsi WSAIoctl atau WSPIoctl mengembalikan nol.

Jika operasi gagal atau tertunda, fungsi WSAIoctl atau WSPIoctl mengembalikan SOCKET_ERROR. Untuk mendapatkan informasi kesalahan yang diperluas, hubungi WSAGetLastError.

Kode kesalahan Makna
WSA_IO_PENDING Operasi yang tumpang tindih berhasil dimulai dan penyelesaian akan ditunjukkan di lain waktu.
WSA_OPERATION_ABORTED Operasi yang tumpang tindih dibatalkan karena penutupan soket atau eksekusi perintah SIO_FLUSH IOCTL.
WSAEFAULT Parameter lpOverlapped atau lpCompletionRoutine tidak sepenuhnya terkandung dalam bagian ruang alamat pengguna yang valid.
WSAEINPROGRESS Fungsi ini dipanggil ketika panggilan balik sedang berlangsung.
WSAEINTR Operasi pemblokiran terganggu.
WSAEINVAL Parameter dwIoControlCode bukan perintah yang valid, atau parameter input tertentu tidak dapat diterima, atau perintah tidak berlaku untuk jenis soket yang ditentukan. Kesalahan ini juga dikembalikan jika parameter cbInBuffer kurang dari sizeof(UCHAR) atau parameter lpvInBuffer menunjuk ke nilai yang bukan nilai enumerasi RCVALL_VALUE . Kesalahan ini juga dapat dikembalikan jika antarmuka jaringan yang terkait dengan soket tidak dapat ditemukan. Ini dapat terjadi jika antarmuka jaringan yang terkait dengan soket dihapus atau dihapus (hapus PCMCIA atau perangkat jaringan USB, misalnya).
WSAENETDOWN Subsistem jaringan gagal.
WSAENOBUFS Tidak ada ruang buffer yang tersedia.
WSAENOPROTOOPT Opsi soket tidak didukung pada protokol yang ditentukan.
WSAENOTSOCK Deskriptor bukan soket.
WSAEOPNOTSUPP Perintah IOCTL yang ditentukan tidak didukung. Kesalahan ini dikembalikan jika SIO_RCVALL IOCTL tidak didukung oleh penyedia transportasi.

Keterangan

IOCTL SIO_RCVALL didukung pada Windows 2000 dan versi sistem operasi yang lebih baru.

IOCTL SIO_RCVALL memungkinkan soket untuk menerima semua paket IPv4 atau IPv6 pada antarmuka jaringan. Handel soket yang diteruskan ke fungsi WSAIoctl atau WSPIoctl harus salah satu dari berikut ini:

  • Soket IPv4 yang dibuat dengan keluarga alamat diatur ke AF_INET, jenis soket diatur ke SOCK_RAW, dan protokol diatur ke IPPROTO_IP.
  • Soket IPv6 yang dibuat dengan keluarga alamat diatur ke AF_INET6, jenis soket diatur ke SOCK_RAW, dan protokol diatur ke IPPROTO_IPV6.

Untuk informasi selengkapnya tentang soket mentah, lihat Soket Mentah TCP/IP.

Soket juga harus terikat ke antarmuka IPv4 atau IPv6 lokal eksplisit, yang berarti Anda tidak dapat mengikat INADDR_ANY atau in6addr_any.

Setelah soket terikat dan IOCTL berhasil diselesaikan, panggilan ke fungsi WSARecv atau recv mengembalikan datagram IPv4 yang melewati antarmuka IPv4 yang diberikan atau mengembalikan datagram IPv6 yang melewati antarmuka IPv6 yang diberikan. Perhatikan bahwa Anda harus menyediakan buffer yang cukup besar. Mengatur IOCTL ini hanya akan mengambil paket IPv4 atau IPv6 pada antarmuka tertentu. IOCTL ini tidak akan mengambil paket lain (paket ARP, IPX, dan NetBEUI, misalnya) pada antarmuka.

Soket yang terikat ke antarmuka lokal tertentu dengan SIO_RCVALL IOCTL hanya akan menerima paket yang melewati antarmuka tersebut. Ini tidak akan menerima paket yang diterima pada antarmuka lain dan diteruskan pada antarmuka lain yang berbeda dari soket yang terikat dengan SIO_RCVALL IOCTL.

Pada Windows Server 2008 dan yang lebih lama, pengaturan IOCTL SIO_RCVALL tidak akan mengambil paket lokal yang dikirim dari antarmuka jaringan. Ini termasuk paket yang diterima pada antarmuka lain dan diteruskan antarmuka jaringan yang ditentukan untuk SIO_RCVALL IOCTL.

Pada Windows 7 dan Windows Server 2008 R2 , ini diubah sehingga paket lokal yang dikirim keluar dari antarmuka jaringan juga diambil. Ini termasuk paket yang diterima pada antarmuka lain dan kemudian meneruskan antarmuka jaringan yang terikat ke soket dengan SIO_RCVALL IOCTL.

Menyetel IOCTL ini memerlukan hak istimewa Administrator pada komputer lokal.

Fitur ini terkadang disebut sebagai mode promiscuous. Setiap perubahan langsung dari menerapkan opsi ini pada satu antarmuka dan kemudian ke antarmuka lain dengan satu panggilan menggunakan IOCTL ini tidak didukung. Aplikasi harus terlebih dahulu menggunakan IOCTL ini untuk menonaktifkan perilaku pada antarmuka pertama, lalu menggunakan IOCTL ini untuk mengaktifkan perilaku pada antarmuka baru.

Lihat juga

soket

Soket Mentah TCP/IP

WSAGetLastError

WSAGetOverlappedResult

WSAIoctl

WSAOVERLAPPED

WSASocketA

WSASocketW