Если я правильно понял логику BeginSend:
private void sendToClient(Client client, String data)
{
byte[] byteData = Encoding.UTF8.GetBytes(data); //It must be UTF8
client.BeginSend(byteData, 0, byteData.Length, 0,
new AsyncCallback(sendCallback), client);
}
private void sendCallback(IAsyncResult iar)
{
Socket client = (Socket)iar.AsyncState;
int bytesSent = client.EndSend(iar);
}
Я отправил данные одному клиенту правильно.
Но если я хочу отправить данные для большего количества клиентов:
/**
* I am using dictionary, because I hold the clients with login-key
*/
private void SendToClients(Dictionary<string, Client> connectedClients, String data)
{
foreach(Client client in connectedClients.Values)
{
sendToClient(client, data);
}
}
Или по-другому, я могу использовать SocketAsyncEventArgs для отправки всех клиентов:
private void sendToClients(Dictionary<string, Client> connectedClients, String data)
{
SocketAsyncEventArgs asyncEvent;
byte[] byteData = Encoding.UTF8.GetBytes(data); //It must be UTF8
lock (connectedClients)
{
foreach (Client client in connectedClients.Values)
{
try
{
asyncEvent = new SocketAsyncEventArgs();
asyncEvent.SetBuffer(byteData, 0, byteData.Length);
client.Socket.SendAsync(asyncEvent);
}
catch (Exception ex)
{
//ERROR.
}
}
}
}
Но оба метода sendToClients работают медленно для меня и / или иногда сервер не может отправить данные клиенту любому . Пакет может быть потерян.
Пример:
Клиент1 получил 103 пакета
Client2 получил 107 пакетов
Client3 получил 102 пакета
Clientn получил 106 пакетов
Но в конце должно быть 111 пакетов.
Существуют ли другие методы / логики / технологии для отправки одних данных более чем одному клиенту или что-то неправильно использовалось в моих примерах?
Заранее спасибо.