Domanda

Abbiamo fatto un po 'di comunicazione di base TCP, ma hanno alcune domande. Stiamo comunicando con un server TCP in cui il flusso delle transazioni è descritto come segue:

  

Il mittente avvia la transazione   inviando uno STX (0x02 ASCII)   carattere, quindi attende la   destinatario di rispondere con l'invio di un ACK   (ASCII 0x06) carattere. Dopo un ACK   è ricevuto, il mittente trasmette un   quattro byte, non firmato, big-endian   numero intero che rappresenta la dimensione del   messaggio payload, seguito dal   payload, e infine un MD5 16 byte   messaggio digerire per il carico utile. Se   il destinatario è soddisfatto con la   messaggio, invia un carattere ACK.

<STX> = ASCII 0x02
<ACK> = ASCII 0x06

Sender: <STX>     <0x00><0x00><0x00><0x05><'H'><'E'><'L'><'L'><'O'><0xEB><0x61>...
Recipient:   <ACK>                                                                <ACK>

Uso prese NET (System.Net.Sockets.Socket), qual è il modo corretto di gestire il controllo del trasferimento STX / ACK? Fa l'handle di socket automaticamente (cioè Dobbiamo semplicemente chiamiamo socket.Send (byteData)), o abbiamo bisogno di inviare esplicitamente la STX, attesa per ACK, ecc.?

Lo stesso vale per la ricezione:.? Do abbiamo semplicemente ricevere i dati in arrivo, o abbiamo bisogno di ascoltare per un carattere STX, inviare un ACK, prepararsi per il carico utile, etc

Se il controllo di trasferimento viene gestito automaticamente, ci sono bandiere di socket specifico che abbiamo bisogno di impostare?

A proposito: Abbiamo trovato diversi link (come il seguente) che si sono rivelati utili per il messaggio inquadratura, ma nessuno discutere il controllo del trasferimento STX / ACK:

È stato utile?

Soluzione

Hehe, questo era un protocollo porta seriale, probabilmente appena trasferito invariato da usare prese invece. Non che raro, anche se non è molto adatto per un flusso di come implementa TCP.

Bene, seguire le istruzioni. Dando per scontato che il cliente, di leggere un byte e verificare la sua è 0x02. Se lo è, mandare indietro un byte, 0x06. In caso contrario, continuare a leggere fino a vedere il 0x02. Ora sei 'connesse', ma si sapeva già che.

Avanti, leggere 4 byte in modo da sapere la lunghezza del pacchetto, leggere tanti byte + 2 per ottenere il resto del pacchetto. Mi piacerebbe ignorare il 'MD5 digest', TCP è abbastanza affidabile per non necessario fare doppio verificare la validità dei dati ricevuti. Mandare indietro un byte, 0x06.

L'unica cosa che non è chiaro è se si dovrebbe aspettare una 0x02 prima che la lunghezza del pacchetto o meno. Il testo dice che non lo fai, il diagramma dice che fai.

Altri suggerimenti

TCP non conosce il protocollo a livello di applicazione. socket TCP è solo un flusso di byte bidirezionale. Si deve inviare in modo esplicito / leggere quelle STX e ACK byte.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top