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

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

Вернуться   Форум программистов > C/C++ программирование > C/C++ Сетевое программирование
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.10.2011, 20:02   #1
asdo
 
Регистрация: 23.01.2010
Сообщений: 4
Вопрос select() -> recv(). Неполный прием посылки

Код:
   while(1){
         	   
      ChekSock.fd_count=1;
	   ChekSock.fd_array[0]=pstructMultyParam->S1;

	   TimeSock.tv_sec=0;
	   TimeSock.tv_usec=100;

	   RRESULT=select(NULL,&ChekSock,NULL,NULL,&TimeSock);
              if(RRESULT==1){    
                //    Sleep(10);
                int recv_byte=recv(pstructMultyParam->S1,RecievBufer, 1000000, 0); 
           }

   }
Этот кусок кода по задумке должен реализовывать неблокирующую recv(). Однако, происходит следующая непонятная вещь. Я отправляю (с некоторой частотой<<частоты цикла) на него 40КБ данных, но в recv_byte появляются различные значения 800, 6200, 8000 байт. Причем "приходить" они начинают с большей частотой чем отправляю. Т.е. как бы "распадаются" на мелкие куски, которые успевают поступить в интервал времени между select() и recv(). В доказательство, если после select() поставить задержку, то данные recv() принимает в полном объеме или так же как и если уменьшить объем посылки до ~1кб.

Я считал, что select() врнет номер сокета при возможности чтения (данные поступили) и после этого recv() их гарантированно примет и без подвисания вернет управление. Но картина видится теперь таким образом что select() вернет номер сокета уже сразу же при поступлении первых байт в сокет, а recv() вызовется еще до того как вся посылка придет и примет столько байт сколько их пришло в данный момент и вернет управление не дожидаясь окончания передачи.

Сама по себе recv() (без select() ) принимает всю посылку как положено и возвращает правильное полное количество принятых байт.
Как же все таки происходит на самом деле?
asdo вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
В зависимости от выбора в Select изменить значения другого Select Tayfun HTML и CSS 3 18.08.2011 00:05
Программа для посылки сообщений Zemelya Софт 4 09.03.2011 16:16
Программа для отслеживание посылки vertraut Помощь студентам 2 18.02.2011 17:13
Неполный путь к HTML-файлу в WebBrowser AbekIn3D Общие вопросы Delphi 2 31.10.2009 12:17
Select t1.N,t1.FIO,(select t2.acc from t2 where t2.type=1) from t1,t2 mavlon_m SQL, базы данных 2 17.09.2009 15:28