На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
> сокет на SocketAsyncEventArgs , как из клиента-слушателя послать 2 сообщения подряд
    Здравствуйте,
    Исходил все форумы, никто не отвечает, а проблема вот какая.
    Мне нужен клиент на SocketAsyncEventArgs, который большей частью получает сообщения от сервера, и только иногда подает на сервер команды.
    По канонам микрософта написал примерно так
    ExpandedWrap disabled
      // объявления
      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 (один на прием, другой на передачу), но сокет с одинаковыми параметрами два раза не коннектится…
    Заколдованные круг, честное слово. После приема сообщения от сервера в колбэке снова надо встать на прием, после передачи – тем более. Практически всегда мне нужно сразу после отправки команды слушать сервер, и как тут вклиниться с еще одной командой, которую надо послать на сервер?
    Можно ли как-то кроме SocketAsyncEventArgs.Completed узнать об окончании асинхронной операции?
    Заранее благодарю за любой ответ.
    0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
    0 пользователей:


    Рейтинг@Mail.ru
    [ Script execution time: 0,0218 ]   [ 16 queries used ]   [ Generated: 2.05.24, 22:06 GMT ]