Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Result := recv(FSocket, Buf, Count, MSG_PEEK);


seeker ©   (2005-11-02 15:28:00) 

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


seeker   (2005-11-03 09:43:00) [1]

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

PeekBuf();
RcvBuf();

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

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


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

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

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

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


seeker   (2005-11-02 18:31:00) [3]


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

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

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

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

PeekBuf();
RcvBuf();

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


seeker   (2005-11-02 18:31:00) [4]


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

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

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

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

PeekBuf();
RcvBuf();

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


Digitman   (2005-11-02 18:12:00) [5]


> 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 17:43:00) [6]


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

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

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


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


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

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

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


Digitman   (2005-11-02 17:06:00) [8]

так ..

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

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


seeker   (2005-11-02 16:24:00) [9]


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

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


Digitman   (2005-11-02 16:11:00) [10]

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


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


> 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 15:45:00) [12]

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо