Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.64/42: Рейтинг темы: голосов - 42, средняя оценка - 4.64
10 / 10 / 4
Регистрация: 27.04.2010
Сообщений: 122
1

Асинхронные сокеты

31.05.2011, 09:07. Просмотров 8297. Ответов 7
Метки нет (Все метки)


Здравствуйте. Очень нужна ваша помощь. Вот callback функция которая передается в метод асинхронного чтения сокета BeginReceive:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
  private void ReceiveCallback(IAsyncResult result)
        {
            ConnectionInfo connection = (ConnectionInfo)result.AsyncState;
            string _data="";
            try
            {
                int bytesRead = connection.Socket.EndReceive(result);
                if (bytesRead != 0)
                {
                //что-то делаем с полученными данными
                 connection.Socket.BeginReceive(connection.Buffer, 0, connection.Buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallback), connection);
                }
                else CloseConnection(connection);
            }
            catch (SocketException ex)
            {
                CloseConnection(connection);
                if (_errorEvent != null)
                {
                    _errorEvent("Ошибка получения данных:" + ex.Message);
                }
            }
Дело в том что этот код работает нормально если сервер и клиент расположены на одном компе, но если клиент обращается через интерент то появляется слудующая проблема. К примеру отправляется 5 кб информации.
C#
1
 int bytesRead = connection.Socket.EndReceive(result);
возвращает не все данные примерно 3700 байт, а в connection.Socket.Aveiable показано что есть еще данные 2300 байт. Как сделать так чтоб EndReceive вернул все сразу, дождался завершения чтения? ReceiveBufferSize сокета установлен в 20000. Повторюсь, если и клиент и сервер на одном компе то все нормально. Надеюсь на вашу помощь.

Добавлено через 15 часов 25 минут
Друзья, неужели никто не пользуется асинхронными сокетами?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
31.05.2011, 09:07
Ответы с готовыми решениями:

Клиент + Сервер, асинхронные сокеты
Привет! Пишу клиент серверное приложение на основе асинхронных сокетов. Цель передача картинки....

Передача файлов, используя асинхронные сокеты
Как, используя класс SocketAsyncEventArgs передавать файлы от клиента серверу, или наоборот? До...

Асинхронные сокеты. Работа из нескольких окон
Есть клиент и есть сервер. Написаны по примерам которые можно найти здесь и здесь соответственно....

Асинхронные сокеты: организация взаимодействия сервера и клиента
Добрый день. У меня стоит следующая задача: клиент шлет запрос серверу и сервер начинает слать...

7
1265 / 966 / 113
Регистрация: 12.01.2010
Сообщений: 1,971
31.05.2011, 09:20 2
Откуда ж сокету знать когда там данные закончатся, может еще 2500 байт, а может там хд фильм на 15 гигов..
0
386 / 375 / 22
Регистрация: 08.02.2011
Сообщений: 1,078
31.05.2011, 09:41 3
Советую использовать синхронные. На MSDN почитай, там есть все с примерами.
0
10 / 10 / 4
Регистрация: 27.04.2010
Сообщений: 122
31.05.2011, 10:29  [ТС] 4
Синхронные не вариант, уже весь сервер под асинхронные написан. Как так сокеты не знают сколько там инфы, протокол ведь TCP, в протоколе явно указан размер данных, если я не ошибаюсь. В свойстве available сокета указанно что есть еще данные. Должен же быть способ чтоб как-то обойти эту проблему.
0
386 / 375 / 22
Регистрация: 08.02.2011
Сообщений: 1,078
31.05.2011, 10:49 5
Вот пример из MSDN http://msdn.microsoft.com/en-us/library/fx6588te
1
10 / 10 / 4
Регистрация: 27.04.2010
Сообщений: 122
31.05.2011, 11:25  [ТС] 6
Огромное спасибо Алексей. Оказалось все намного проще чем я думал Просто нужно было проверить все ли данные пришли и если нет повторить чтение из буффера сокета.
Вот то что нужно было добавить:
C#
1
2
3
4
5
6
7
8
9
10
11
  if (connection.Socket.Available == 0)
                  {
                     _data = connection.dataBuffer.ToString();
                      if (_dataReciveEvent == null)
                          RecivedData = _data;
                      else
                          _dataReciveEvent((uint)bytesRead, _data); //событие получения данных
                  }
                  else
               connection.Socket.BeginReceive(connection.Buffer, 0, connection.Buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallback), connection);
                }
0
386 / 375 / 22
Регистрация: 08.02.2011
Сообщений: 1,078
31.05.2011, 12:49 7
Да всегда рад помочь, просто у меня был всего один опыт написания подобного приложения, и я выбрал синхронные, поэтому сам в асинхронные еще не вникал. И с С# я знаком очень поверхностно, пишу на Vb.net.
0
10 / 10 / 4
Регистрация: 27.04.2010
Сообщений: 122
31.05.2011, 12:57  [ТС] 8
Асинхронные, не асинхронные сокеты работают по одному принципу, только в аснихронных уже встроенна поддержка многопоточного(фонового) выполнения. В синхронных пришлось бы это писать самому. А ошибка которая была у меня присуще как тем так и другим типам сокетов.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
31.05.2011, 12:57

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Асинхронные сокеты: Как организовать разделение на прием сообщений и прием файлов
Изучив синхронные сокеты, перешел к изучению асинхронных. Столкнулся вот с чем, как, используя...

Как "правильно" принимать данные используя асинхронные сокеты?
Приветульки. Я столкнулся с некой проблемой, сервер не мог десериализовать данные пришедшие от...

асинхронные делегаты
Добрый день. Вопрос мой об ассинронных делегатах. Я не могу никак понять EndInvoke() дожидается...

Асинхронные операции
Есть у меня источник с элементами (ObservableCollection), и специальные коллекции "отображения",...

Асинхронные операции на C#
Реализую обмен данными с устройством по USB-каналу (bulk передача) с использованием функций WinUSB...

Асинхронные операции
Console.WriteLine("Some code"); using (var fs = new System.IO.FileStream("File.txt",...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.