none
Можно ли и как создать два SocketAsyncEventArgs на один сокет. RRS feed

  • Вопрос

  • Здравствуйте,

    Есть сокетный клиент, который и слушает и пишет. Можно ли задать два разных SocketAsyncEventArgs, чтобы можно было в одном слушать, а в другом писать.

    Думаю, что мои неудачные попытки связаны с тем, что не понимаю SocketAsyncEventArgs.UserToken: почему коннект устанавливают так

    socketEventArg.UserToken = socket;

    socket.ConnectAsync(socketEventArg);

    А посылают так

    socket = e.UserToken as Socket;

    socket.ReceiveAsync(e);

     

    Заранее спасибо

    8 декабря 2010 г. 8:00

Ответы

  • Да, в примере используется 1 объект SocketAsyncEventArgs. Помоему вам стоит посмотреть в сторону нормальной организации асинхронного клиента, а не создавать 2 объекта SocketAsyncEventArgs. Как я понял, они все равно выполяются синхронно. Ничего хорошего из этого не выйдет.

    Есть хорошая статья про сокеты и их использование в .net, и там есть про асинхронные операции, можете посмотреть тут - Преимущества быстродействующих сокетов в .NET .


    Для связи [mail]
    • Предложено в качестве ответа Abolmasov Dmitry 14 декабря 2010 г. 9:41
    • Помечено в качестве ответа Abolmasov Dmitry 17 декабря 2010 г. 11:40
    10 декабря 2010 г. 10:10

Все ответы

  • Посмотрите пример использования SocketAsyncEventArgs , чтобы понять как с ним работать.


    Для связи [mail]
    8 декабря 2010 г. 10:04
  • Спасибо, Дмитрий, но этот пример я изучил. Кстати, там написано, что создается два экземпляра класса SocketAsyncEventArgs, что у меня вызывает непонимание. Вот как я представляю процессы, приведенные в этом примере

    1. создается SocketAsyncEventArgs

    2. он привязывается к хосту

    3. создается на этом же хосте сокет

    4. сокет коннектится к хосту

    5. через колбэк посылается Хелло (ProcessConnect)

    6. через колбэк принимаются данные (ProcessSend)

    7. через колбэк закрываем сокет (ProcessReceive)

    И все (на мой взгляд) происходит с ОДНИМ экземпляром SocketAsyncEventArgs. Подобную схему я как раз и использовал, но в моем случае (как я писал) клиент и слушает и пишет, и конструкция, подобная описанной в примере, генерит исключение "Данный экземпляр SocketAsyncEventArgs уже используется" когда я шлю подряд две команды на сокет. Поэтому и задумался о создании двух отдельных экземпляров SocketAsyncEventArgs.

    Подскажите, пожалуйста, где я не прав.

    8 декабря 2010 г. 11:54
  • Да, в примере используется 1 объект SocketAsyncEventArgs. Помоему вам стоит посмотреть в сторону нормальной организации асинхронного клиента, а не создавать 2 объекта SocketAsyncEventArgs. Как я понял, они все равно выполяются синхронно. Ничего хорошего из этого не выйдет.

    Есть хорошая статья про сокеты и их использование в .net, и там есть про асинхронные операции, можете посмотреть тут - Преимущества быстродействующих сокетов в .NET .


    Для связи [mail]
    • Предложено в качестве ответа Abolmasov Dmitry 14 декабря 2010 г. 9:41
    • Помечено в качестве ответа Abolmasov Dmitry 17 декабря 2010 г. 11:40
    10 декабря 2010 г. 10:10