Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.02.12;
Скачать: CL | DM;

Вниз

Result := recv(FSocket, Buf, Count, MSG_PEEK);   Найти похожие ветки 

 
seeker ©   (2005-11-02 15:28) [0]

Смотрю буфер
Result := recv(FSocket, Buf, Count, MSG_PEEK);
Все Ok с просмотром, только вот проблема,возникает новое событие FD_READ при каждом просмотре.Даже если после просмотра считать все содержимое буфера то событие всеравно взводиться.
Может кто знает как это обойти.
зы:
WSAAsyncSelect(FSocket, Handle, 0, 0);
не помогает.


 
Digitman ©   (2005-11-02 15:45) [1]

прожуй  и приведи РЕАЛЬНЫЙ код


 
Seeker ©   (2005-11-02 15:57) [2]


> Digitman ©

Я, почему-то, не сомневался что первым будешь ты.
Специально для тебя, любителя стандартных борландовских сетеых компонентов, код:
function TClientSocket.PeekBuf(var Buf; Count: Integer): Integer;
var
 ErrorCode: Integer;
begin
 Lock;
 try
   Result := 0;
   if (Count = -1) and FConnected then
     ioctlsocket(FSocket, FIONREAD, Longint(Result))
   else begin
     if not FConnected then Exit;
     Result := recv(FSocket, Buf, Count, MSG_PEEK);
     if Result = SOCKET_ERROR then
     begin
       ErrorCode := WSAGetLastError;
       if ErrorCode <> WSAEWOULDBLOCK then
       begin
         Error(eeReceive, ErrorCode);
         Disconnect(FSocket);
         if ErrorCode <> 0 then
           raise ESocketError.CreateResFmt(@sWindowsSocketError,
             [SysErrorMessage(ErrorCode), ErrorCode, "recv"]);
       end;
     end;
   end;
 finally
   Unlock;
 end;
end;

зы: 2Digitman, можно было и самому подумать.


 
Digitman ©   (2005-11-02 16:11) [3]

так ...
а теперь укажи на строчку, что тебя повергла в сомнение ..


 
seeker ©   (2005-11-02 16:24) [4]


> возникает новое событие FD_READ при каждом просмотре.

Если я сделаю N просмотров,то в очередь ставиться N- сообщений FD_READ.


 
Digitman ©   (2005-11-02 17:06) [5]

так ..

о каких таких "просмотрах" ты речь ведешь ?

давай уже языком WinsockAPI, а не доморощенным .. коль скоро ты процитировал тело метода) ...


 
seeker ©   (2005-11-02 17:43) [6]


> о каких таких "просмотрах" ты речь ведешь ?

для особенно "одаренных" поправлюсь(сути проблеммы это не поменяет).

Если я вызову N раз PeekBuf(), то в очередь поставиться N сообщений FD_READ.
OFF
2Digitman, читая твои посты(по крайней мере в разделе "Сети"), я заметил одну удивительную вещь,полезной информации,в смысле кода или дельного совета, в них , ну отсилы процентов 5, остальное - так "вода".
Так что ... иди лесом.


 
seeker ©   (2005-11-02 17:43) [7]


> о каких таких "просмотрах" ты речь ведешь ?

для особенно "одаренных" поправлюсь(сути проблеммы это не поменяет).

Если я вызову N раз PeekBuf(), то в очередь поставиться N сообщений FD_READ.
OFF
2Digitman, читая твои посты(по крайней мере в разделе "Сети"), я заметил одну удивительную вещь,полезной информации,в смысле кода или дельного совета, в них , ну отсилы процентов 5, остальное - так "вода".
Так что ... иди лесом.


 
Digitman ©   (2005-11-02 18:12) [8]


> seeker ©   (02.11.05 17:43) [7]


Содрав и поцитировав здесь "один-в-один" тело метода TCustomWinSocket.ReceiveBuf() под соусом какого-то там хрен знает откуда взявшегося метода TClientSocket.PeekBuf() ты чести себе не сделал и занялся, видимо, откровенным плагиатом. даже не удосужившись пояснить суть своих изысканий)


> Если я вызову N раз PeekBuf(), то в очередь поставиться
> N сообщений FD_READ


врешь.
причем - нагло.

в очередь будет поставлено ровно столько сообщений, сколько определяет Winsock-логика, которая подразумевает постановку в очередь FD_READ-сообщений лишь в том случае, если буфер чтения не пуст.

а пуст ли он будет, это буфер, даже якобы полного его прочтения - оно тебе знать не дано.. на то и существует FD_READ, чтобы известить тебя о непустой очереди чтения.


 
seeker ©   (2005-11-02 18:31) [9]


> Содрав и поцитировав здесь "один-в-один" тело метода TCustomWinSocket.
> ReceiveBuf() под соусом какого-то там хрен знает откуда
> взявшегося метода TClientSocket.PeekBuf() ты чести себе
> не сделал и занялся, видимо, откровенным плагиатом. даже
> не удосужившись пояснить суть своих изысканий)

Специально для тебя, чтоб невозникало лишних вопросов...

> врешь.
> причем - нагло.

Может ты тогда объяснишь, почему после такой комбинации

PeekBuf();
RcvBuf();

где RcvBuf() считывает из буфера все данные, приходит сообщение FD_READ,
причем
ioctlsocket(FSocket, FIONREAD, Longint(Result))
показывает что данных в буфере нет(и я знаю что их там не может быть в данном(моём) случае).


 
seeker ©   (2005-11-02 18:31) [10]


> Содрав и поцитировав здесь "один-в-один" тело метода TCustomWinSocket.
> ReceiveBuf() под соусом какого-то там хрен знает откуда
> взявшегося метода TClientSocket.PeekBuf() ты чести себе
> не сделал и занялся, видимо, откровенным плагиатом. даже
> не удосужившись пояснить суть своих изысканий)

Специально для тебя, чтоб невозникало лишних вопросов...

> врешь.
> причем - нагло.

Может ты тогда объяснишь, почему после такой комбинации

PeekBuf();
RcvBuf();

где RcvBuf() считывает из буфера все данные, приходит сообщение FD_READ,
причем
ioctlsocket(FSocket, FIONREAD, Longint(Result))
показывает что данных в буфере нет(и я знаю что их там не может быть в данном(моём) случае).


 
Verg ©   (2005-11-02 23:10) [11]

Потому, что recv с флагом MSG_PEEK взводит NetWorkEvent, т.к. после ее выполнения в буфере сокета остались несчитанные данные. Второй recv считывает все данные, но event-то остался взведен от первого вызова recv.
Вот ты и получаешь второе событие FD_READ, а данных нет.

Для чтения (FD_READ) взводится по факту:

1. Из нижлежащего уровня в буфер сокета поступила порция данных, а сам буфер был пуст.
2. Функция recv не считала из буфера всех данных (MSG_PEEK - не исключение).


 
seeker ©   (2005-11-03 09:43) [12]

Спасибо всем.Решение найдено.
зы:
Может ты тогда объяснишь, почему после такой комбинации

PeekBuf();
RcvBuf();

где RcvBuf() считывает из буфера

Сдесь я конечно ступил.



Страницы: 1 вся ветка

Текущий архив: 2006.02.12;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.069 c
2-1138130238
Бася
2006-01-24 22:17
2006.02.12
Какая прога лучше для создания файла помощи?


15-1137961672
Volf_555
2006-01-22 23:27
2006.02.12
Купил оптическую мышу Delfics-курсор начал ежесекундно сдрагивать


11-1118837957
rOOse
2005-06-15 16:19
2006.02.12
Как использовать asm версию функций?


6-1131019600
nikk
2005-11-03 15:06
2006.02.12
Получение папок локального компа


8-1125754470
stef
2005-09-03 17:34
2006.02.12
масштабирование canvas