複数のクライアントにデータを送信:(非同期)私が正しく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);
}
を私が正しく1つのクライアントにデータを送ってきました。
しかし、私はより多くのクライアントのためにデータを送信する場合:
/**
* 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);
}
}
またはanotherwayに、私はすべてのクライアントに送信する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は、パケット
クライアント2が受信クライアント3はClientn 106のパケットに
を受けたが、それは111のパケットであるべきである102のパケット
を受信
107のパケット
を受信最後に。複数のクライアントに1つのデータを送信するための方法やロジックや技術がありますか、私の例で間違って使われていますか?
ありがとうございます。
あなたは次のような意味を持っていますか:タスク .Factory.FromAsync( stream.BeginSend、stream.EndSend、buffer、0、buffer.Length、client);私はチェックするためにブールを設定しました。もしそれが複雑であれば –
Racooon
はい、いいえ。あなたのFromAsyncソケット呼び出しがうまくいくように見えます。しかし、別のブールを使用しないでください。タスクにはIsCompletedプロパティがあります。しかし、実際には、完了したかどうかを気にする必要はありません。新しいタスクの実行が完了すると、 'ContinueWith'メソッドを使用して終了します。基礎となるタスクは、すべてのチェックとスケジューリングを行います。 – Tyson
タイソンありがとう、私は今それをテストしています。 – Racooon