2017-02-05 18 views
1

Я работаю над приложением чата в C# с сервером, закодированным в C++, я уже могу отправлять и получать сообщения между моими клиентами. Но моя проблема в настоящее время, что требуется определить структуру пакета TCP сам, как:C# Структура пакета TCP

[numberOfsequence: uint16_t] [ID: uint16_t] [данные: х] Где:

  1. numberOfsequence: это номер моего пакета (чтобы гарантировать, что в
    принимать пакеты в порядке, я знаю, что это автоматически regled по протоколу TCP, но я хочу сделать это также)
  2. ID: represente типа
    operartion (login, message, disconnect) id будет как 0000 для логин, 0001 для сообщения ....
  3. Данные: информация.

     //TO connect 
    
         TcpClient clientSocket; 
         NetworkStream serverStream; 
         clientSocket.Connect(IPAddress.Parse(textBoxIP.Text), Convert.ToInt32(textBoxPort.Text)); 
         serverStream = clientSocket.GetStream(); 
    
    
         //Sending login 
         byte[] outStream = System.Text.Encoding.ASCII.GetBytes(textBoxLogin.Text); 
         serverStream.Write(outStream, 0, outStream.Length); 
         serverStream.Flush(); 
    

Так что мой вопрос заключается в том, чтобы определить структуру пакета? спасибо

+0

Предполагается, что это невозможно, если вы используете TCPClient, tcp и его внутренняя структура является стандартом и, насколько я знаю, реализована на низкоуровневой аппаратной базе = вашей сетевой карте, чтобы сделать ее быстрой. –

+0

Если вы хотите нести ответственность за целостность пакета, вы должны использовать другой протокол, например udp. –

ответ

1

Вы должны указать длину поля data в структуре пакета. Это связано с тем, что TCP не обрабатывает пакеты, а потоки. Основной протокол может обрезать или объединить ваши пакеты, которые вы должны обработать и исправить самостоятельно.

Таким образом, если мы будем считать numberOfSequence и id поля быть фиксированной длины, но длина data поля может меняться, это моя рекомендованная структура пакета:

numberOfSequence: 2 bytes 
id: 2 bytes 
dlength: 2 bytes 
data: dlength bytes 

Как вы можете видеть, Поле dlength указывает длину части данных. Принимающая сторона должна проанализировать информацию dlength перед чтением поля data. Если принятый «пакет» содержит больше байтов, чем указывает поле dlength, переполненные байты фактически являются частью следующего пакета. Если значение dlength больше, чем полученные данные, вы должны подождать, пока отправитель не запишет остальную часть данных в поток.