2012-02-25 10 views
7

ho provato - per la prima volta - per controllare una presa da modo basso livello
Percorrendo tutorial, affrontato queste righe:Socket.IOControl - Documentation Ambiguous

byte[] byTrue = new byte [4] {1, 0, 0, 0}; 
byte[] byOut = new byte [4] {1, 0, 0, 0}; 

_Socket.IOControl(IOControlCode.ReceiveAll, byTrue, byOut); 

ho fatto riferimento alla MSDN documentation , ma è davvero molto ambiguo.

Domanda:

Quali sono array questi 2 byte? In che cosa sono usati?
La documentazione dice OPZIONI: quali opzioni?

risposta

7

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.

+0

Grazie per il tuo commento utile dettagliato, ma per quanto riguarda la matrice "byOut"? –

+1

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

0

Il primo array deve contenere il byte che scriverai - i dati verranno inviati- Il secondo array conterrà i dati di output al termine dell'operazione di ricezione. Quindi, in base all'operazione IOControlCode, imposterai uno dei due parametri su null.

+0

Impostarli entrambi su null danno errore! –

Problemi correlati