У меня есть клиент, который будет отправлять на сервер много данных из разных потоков.
Пакет использует следующий формат: PACKET_ID CONTENT END_OF_PACKET_INDICATOR
У меня есть следующая функция onDataRectained:
public void OnDataReceived(IAsyncResult asyn)
{
SocketPacket socketData = (SocketPacket)asyn.AsyncState;
int iRx = 0;
iRx = socketData.m_currentSocket.EndReceive(asyn);
char[] chars = new char[iRx + 1];
System.Text.Decoder d = System.Text.Encoding.UTF8.GetDecoder();
int charLen = d.GetChars(socketData.dataBuffer, 0, iRx, chars, 0);
MessageBox.Show("Incoming data: " + socketData.dataBuffer.Length.ToString() + " from socket(" + socketData.socket_id + ")");
char[] PACKET_END_IDENTIFIER = { (char)2, (char)1, (char)2, (char)1 };
for (int i = 0; i < iRx; i++)
{
GLOBAL_BUFFER.Add(chars[iRx]);
}
if (PacketEndReached(chars, PACKET_END_IDENTIFIER))
{
// done reading the data
PROCESS_PACKET(GLOBAL_BUFFER);
}
WaitForData(socketData.m_currentSocket, socketData.socket_id);
}
Мой размер буфера сокета установлен на 100. Если я отправлю 1000 байтов, они будут разделены на 10 частей, а onDataRectained будет запущено 10 раз.
Все, что мне нужно сделать, это продолжать считывать данные в буфер для каждого отдельного пакета, отправляемого моим клиентом, до тех пор, пока не будет запущен PacketEndReached, а затем передавать буфер в другую функцию, которая будет обрабатывать данные.
Если я определю GLOBAL_BUFFER для хранения входящих данных, то если клиент отправляет данные из нескольких потоков, не перепутаются ли данные?Мне нужен способ прочитать все данные для каждого отдельного пакета, отправленного моему клиенту.
Спасибо!
ОБНОВЛЕНИЕ:
Это мой текущий класс:
public partial class TCP_SERVER
{
const int MAX_CLIENTS = 3000;
const int MAX_SOCKET_BUFFER_SIZE = 10;
public AsyncCallback pfnWorkerCallBack;
private Socket m_mainSocket;
private Socket[] m_workerSocket = new Socket[MAX_CLIENTS];
private int m_clientCount = 0;
public GLOBAL_BUFFER;
public void StartServer(int listen_port)
public void OnClientConnect(IAsyncResult asyn)
public void ProcessIncomingData(char[] INCOMING_DATA, int CLIENT_ID)
public void OnDataReceived(IAsyncResult asyn)
}
Как видите, GLOBAL_BUFFER определен «глобально».Если клиент отправляет пакет_1, для отправки которого требуется 10 секунд, и в то же время пакет_2, который для отправки данных занимает 2 секунды, будет перепутан.Мне нужно собрать данные для каждого пакета в отдельности .