|
|
От: |
impure_soul
|
|
| Дата: | 10.10.07 13:46 | ||
| Оценка: | |||
S>Данные при передаче буфферизуются. Поэтому Socket.Receive (или EndReceive) прчитает столько байт, сколько у него на данный момент есть в буфере. Данные, переданные с клиента одним Socket.Send могут приниматься на другой стороне несколькими Socket.Receive. Об этом надо помнить.
S>Если ты передаешь в один сокет не сплошной поток байт, а логически отдельные части, тебе следует предпринять специальные меры, чтобы правильно разделить принимаемый поток на другой стороне.
S>Например сначала можно посылать размер передаваемых данных (Int32 — 4 байта), а потом сами данные. На другой стороне ты сначала читаешь 4 байта, преобразуешь их в Int32 и видишь размер идущих следом данных. Выделяешь соотвтетствующий буфер и повторяешь Receive пока на прочитаешь их все.
public class MyMessageType
{
MyMessageTypeHeader header;
MyMessageTypeData data;
public MyMessageTypeHeader Header
{
get { return header; }
set { header = value; }
}
public MyMessageTypeData Data
{
get { return data; }
set { data = value; }
}
...
}
public class MyMessageTypeHeader
{
byte[] UID;
User userFrom;
User usersTo;
Int64 part;
Int64 partsCount;
MessageType messageType;
DateTime timeStamp = DateTime.Now;
Dictionary<string, string> parameters;
...
}
public class MyMessageTypeData
{
Dictionary<string, string> parameters;
public Dictionary<string, string> Parameters
{
get { return parameters; }
set { parameters = value; }
}
byte[] dataContainer;
public byte[] DataContainer
{
get { return dataContainer; }
set { dataContainer = value; }
}
}