Gli argomenti di array di byte su Socket.IOControl()
sono specifici per IOControlCode
specificato come primo argomento.
Il primo array è per i dati di input, il secondo array è per i dati di output.
Per ulteriori informazioni sul layout specifico per questi array, è utile iniziare osservando l'enumerazione, che elenca tutte le operazioni possibili per voi. Da lì, è necessario incrociare il riferimento con la documentazione elencata per le funzioni C-operabili che esegue il wrapping Socket.IOControl()
. Questi sono WSAIoctl()
e ioctlsocket()
.
IOControlCode Enumeration @ MSDN
WSAIoctl() function @ MSDN
ioctlsocket() function @ MSDN
Per la documentazione per IOControlCode.ReceiveAll
:
Attiva la ricezione di tutti i pacchetti IPv4 sulla rete. Il socket deve avere la famiglia di indirizzi , il tipo di socket deve essere Raw e il tipo di protocollo deve essere IP. L'utente corrente deve appartenere al gruppo di amministratori nel computer locale e il socket deve essere associato a una porta specifica. Questo codice di controllo è supportato su Windows 2000 e sistemi operativi successivi. Questo valore è uguale alla costante Winsock 2 SIO_RCVALL.
Riferimento incrociato SIO_RCVALL
, troviamo che ha una voce nella documentazione di Winsock.
SIO_RCVALL control code @ MSDN
Leggendo questa voce, si menziona che il buffer di ingresso è richiesto di selezionare una modalità di funzionamento, con dimensione minima corrispondente a un RCVALL_VALUE
. Nella tua dichiarazione stai passando il valore 1
nell'array degli argomenti di input. Possiamo controllare i file di intestazione per vedere cosa dovrebbe significare.
Si dovrebbe controllare questo con i file di intestazione C a portata di mano, ma la copia compatibile con interfaccia per vino (emulatore di Windows) dice che il valore per la modalità RCVALL_ON
è 1
. Il metodo .NET dovrebbe racchiudere i dettagli della gestione della dimensione dell'array per te, quindi lo snippet di codice che hai incontrato sta cercando di abilitare RCVALL_ON
per il socket.
ecco il link al file di intestazione C a winehq.org: mstcpip.h at winehq.org
Se avete installato C/C++ il supporto per Visual Studio, si può essere in grado di individuare e mstcpip.h Winsock2.h localmente in un percorso simile al seguente:
C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Include\
la mia copia dice:
//
// Values for use with SIO_RCVALL* options
//
typedef enum {
RCVALL_OFF = 0,
RCVALL_ON = 1,
RCVALL_SOCKETLEVELONLY = 2,
RCVALL_IPLEVEL = 3,
} RCVALL_VALUE, *PRCVALL_VALUE;
non ho potuto trovare alcuna documentazione che dicono specificamente s quale array di byte di dimensioni dovrebbe essere usato per passare un RCVALL_VALUE
, ma se si guardano gli esempi per IOControl()
, usano BitConverter.GetBytes(0)
per i parametri predefiniti che avrebbero una dimensione di 4 byte (corrispondente a un .NET int) e corrisponde al tuo esempio . Questo è abbastanza grande da adattarsi allo RCVALL_VALUE
anche in modalità C.
Grazie per il tuo commento utile dettagliato, ma per quanto riguarda la matrice "byOut"? –
Lo slot parametro specificato con 'byOut' è per ricevere i dati dalla funzione IOControl selezionata. Nel caso di SIO_RCVALL, non sono previsti dati di ritorno speciali (vedere le note per lpvOutBuffer sul collegamento SIO_RCVALL). Potresti essere in grado di passare un array vuoto o addirittura null. – meklarian