У меня есть два SocketAsyncEventArgs
на Client
, например:
void Accepted(object s, SocketAsyncEventArgs e)
{
e.Completed -= Accepted;
Client c = new Client()
{
SendArgs = e,
RecvArgs = new SocketAsyncEventArgs()
};
c.RecvArgs.AcceptSocket = e.AcceptSocket;
c.RecvArgs.Completed += Received;
c.SendArgs.Completed += Sent;
SetBuffer(c.RecvArgs, bufferLength);
c.RecvArgs.AcceptSocket.ReceiveAsync(c.RecvArgs);
Accept();
}
Когда Client
отправляет данные, вызывается функция Received
, а в функции Received
я отправляю что угодноон получен всем подключенным Clients
следующим образом:
void Received(object s, SocketAsyncEventArgs e)
{
if (e.BytesTransferred > 0 && e.SocketError == SocketError.Success)
{
int packetSize = BitConverter.ToInt32(e.Buffer);
SetBuffer(e, packetSize);
e.AcceptSocket.Receive(e.Buffer);
foreach (var c in Clients)
{
c.SendArgs.SetBuffer(e.Buffer);
c.SendArgs.AcceptSocket.SendAsync(c.SendArgs);
}
SetBuffer(e, bufferLength);
e.AcceptSocket.ReceiveAsync(e);
}
else RemoveClient(e);
}
Все подключенные Clients
получают данные от сервера, НО он не вызывает обратный вызов Sent
! Ранее я пробовал использовать один SocketAsyncEventArgs
для SendAsync
и ReceiveAsync
, и поведение было одинаковым!
Почему и как решить эту проблему? Я видел что-то вроде этого:
bool raised = e.AcceptSocket.SendAsync(args);
if(!raised) Sent(args);
НО я не хочу делать это вручную таким образом.