Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.04.2014, 18:06   #1
lawliet93
Форумчанин
 
Регистрация: 30.08.2011
Сообщений: 102
По умолчанию Как "правильно" принимать данные используя асинхронные сокеты?

Приветульки. Я столкнулся с некой проблемой, сервер не мог десериализовать данные пришедшие от клиента, если я дебажу этот самый сервер, ну это когда нажимаю F11 и каждая команда на сервере поочереди выполняется. Я думал, что проблема именно в отправляемых данных или в десериализации, но нет, проблема была в том, как сервер принимает и обрабатывает данные. Общая схема приняти и обработки данных выглядит так, напишу на недоделаном C#, чтобы была ясна суть
Код:
Socket socket=new Socket(); //создаю сокет
 
socket.BeginReceive(buffer,new AsyncCallback(ReceiveCallback),socket); //слушаю сокет, как только придут
                                                                                                  //данные - они запишутся в buffer 
                                                                                                  //и вызовится метод ReceiveCallback
 
void ReceiveCallback(var result)
{
  Socket socket = (Socket)result.AsyncState; //это я получаю socket, который был последний аргументом в 
                                                              //BeginReceive
 
  int nubmerOfReceivedBytes = socket.EndReceive(result); //по всей видимости BeginReceive работает в другом потоке, тут мы закрываем этот поток
                                                                              // и получаем длину полученных данных (количество байт)
   какой-то код; //здесь я обращаюсь к buffer'у, в котором записаны полученные данные и как-то их обрабатываю
  //и снова пытаюсь принять данные
  socket.BeginReceive(buffer,new AsyncCallback(ReceiveCallback),socket);
}
Так вот, для каждого пакета данных отправленного клиентом, должен быть запущен BeginReceive, а что, если придут два пакета данных, но будет запущен один BeginReceive? походу, данные будут просто запихиваться в буффер, ну я вообще не знаю, как оно там работает. Но я провел маленький эксперимент, на клиенте выводил количество байт, которые отправляю серверу, а на сервере выводил количество принятых байт, и вот была такая ситуация
Клиент: Отправлено 15 байт, Отправлено 22 байт
Сервер: Принято 37 байт
Так вот, как решить эту проблему и сделать, чтобы сервер всегда принимал пакеты данных раздельно?
lawliet93 вне форума Ответить с цитированием
Старый 03.04.2014, 18:40   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

TCP протокол работает с потоком данных, а не пакетами.
разделяйте внутри своего формата на сообщения.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 03.04.2014, 21:00   #3
lawliet93
Форумчанин
 
Регистрация: 30.08.2011
Сообщений: 102
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
TCP протокол работает с потоком данных, а не пакетами.
разделяйте внутри своего формата на сообщения.
это еще как понимать???!!!
lawliet93 вне форума Ответить с цитированием
Старый 04.04.2014, 13:59   #4
lawliet93
Форумчанин
 
Регистрация: 30.08.2011
Сообщений: 102
По умолчанию

ну окей окей, я понял
lawliet93 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Постоянно слетает галочка "автоматически" в "Параметры Excel", "Формулы", "Вычисления в книге" Alexsandrr Microsoft Office Excel 4 19.10.2013 14:22
timeout в Объекте работает "не правильно" - нет так как задумано pompiduskus JavaScript, Ajax 1 27.09.2013 20:02
Как "в ручную" правильно организовать ведение истории в базе данных grenles БД в Delphi 2 18.09.2010 10:53
Как обойти "преобразование типа из "string" в "float" невозможно" lexluter1988 Помощь студентам 1 07.08.2010 12:23
Как реализовать "ретранслятор" запросов через сокеты? Kanaris Работа с сетью в Delphi 3 04.12.2009 16:58