Обратный вызов SocketAsyncEventArgs обратного вызова SendAsync не работает - PullRequest
0 голосов
/ 31 октября 2019

У меня есть два 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);

НО я не хочу делать это вручную таким образом.

...