Модераторы: gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> SocketAsyncEventArgs сокет, как правильно 
:(
    Опции темы
abb269
Дата 6.12.2010, 16:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 6.12.2010

Репутация: нет
Всего: нет



Здравствуйте,
Помогите, пожалуйста, разобраться с сокетом на SocketAsyncEventArgs на шарпе. 
Мне нужен клиент, который большей частью получает сообщения от сервера, и иногда подает на сервер команды. 
Делаю примерно по такой схеме
Код

// объявления
private Socket socket;
SocketAsyncEventArgs socketEventArg = new SocketAsyncEventArgs();

// соединение
socket = new Socket(
    servAddress.AddressFamily,
    SocketType.Stream,
    ProtocolType.Tcp
    );
socketEventArg.Completed += new EventHandler<SocketAsyncEventArgs>
                                    (SocketEventArg_Completed);
socketEventArg.RemoteEndPoint = new IPEndPoint(servAddress, port);
socketEventArg.UserToken = socket;
socket.ConnectAsync(socketEventArg);

// основной колбэк
private void SocketEventArg_Completed(object sender, SocketAsyncEventArgs e)
{
    try
    {
        switch (e.LastOperation)
        {
            case SocketAsyncOperation.Connect:
                ...
                break;
            case SocketAsyncOperation.Receive:
                if (e.SocketError == SocketError.Success)
                {
                    recvBuffer = e.Buffer;
                    int bytesRead = e.BytesTransferred;
                    // обратотка принятого, после которой иногда
                    // нужно отправить на сокет сообщение
                    socket = e.UserToken as Socket;
                    socket.ReceiveAsync(e);
                }
                break;
            case SocketAsyncOperation.Send:
                if (e.SocketError == SocketError.Success)
                {
                    socket = e.UserToken as Socket;
                    socket.ReceiveAsync(e);
                }
                break;
            default:
                throw new Exception("Invalid operation completed");
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
    }
}

// отправка сообщения (string data)
byte[] bb = Encoding.Default.GetBytes(data);
socketEventArg.SetBuffer(bb, 0, bb.Length);
socket = socketEventArg.UserToken as Socket;
socket.SendAsync(socketEventArg);



Но при подаче двух команд друг за другом (а такое бывает) генерится исключение о том, что экземпляр SocketAsyncEventArgs уже используется в асинхронной операции с сокетом, вторая команда не посылается, а приходящие данные содержат «дырки».
Уже все практически перепробовал. Даже пробовал инициализировать два класса SocketAsyncEventArgs (один на прием, другой на передачу), но сокет с одинаковыми параметрами два раза не коннектится…
Заранее спасибо.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
cully
mr.DUDA
Exception

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, cully, mr.DUDA, Exception.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Распределённые приложения и сеть | Следующая тема »


 




[ Время генерации скрипта: 0.0391 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.