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