Domanda

vorrei un aiuto con il seguente. questo è a che fare con i socket asincroni.

dal mittente:

string stringData = "Welcome to my server server server";
byte[] message1 = Encoding.ASCII.GetBytes(stringData);

//MessageBox.Show(message1.Length.ToString());

client.BeginSend(message1, 0, message1.Length, SocketFlags.None, new AsyncCallback(SendData), client);

qui come si può vedere, il message.length può essere trovato.

-

sul client:

  Socket remote = (Socket)iar.AsyncState;
  int recv = remote.EndReceive(iar);
  string stringData = Encoding.ASCII.GetString(data, 0, recv);

la mia domanda è c'è un modo per accedere alla lunghezza effettiva dei dati inviati e sulla base di tali dati chiamata di ricevono fino a quando è ricevuto il messaggio completo?

È stato utile?

Soluzione

No - TCP / IP è un flusso di protocollo. Solo perché hai inviato i dati con una sola chiamata non significa che verrà inviato come un pacchetto, o che non sarà fusa con altri pacchetti. In altre parole, invio "X" allora "Y" è equivalente ad inviare "XY" -. Essi potrebbero essere trasmessi con gli stessi pacchetti, indistinguibile all'altra estremità

Se si desidera che l'idea di un "messaggio" individuo in un ruscello, si dovrebbe anteporre i dati con pochi byte dichiarando esplicitamente la sua lunghezza. (Un'alternativa è quella di utilizzare un delimitatore, ma preferisco di gran lunga utilizzare un prefisso di lunghezza - rende più facile sapere quanti dati hai ancora di ricevere, non c'è bisogno di preoccuparsi di iniziare a consumare il messaggio successivo, e non si deve preoccupare di fuggire il delimitatore in qualche forma.)

Altri suggerimenti

Solo se qualcosa viene trasmesso per comunicare la lunghezza -. Sia pre-pend la lunghezza al messaggio, oppure inviare un carattere di terminazione di qualche tipo

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