Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2006.02.12;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.041 c
2-1138029460
Змей
2006-01-23 18:17
2006.02.12
текст по центру в edit


2-1137936751
Aleks
2006-01-22 16:32
2006.02.12
Мастера подскажите как определить появилось информационное окно


5-1124699893
capkoh
2005-08-22 12:38
2006.02.12
TWinControl неизбежен?


1-1137163081
yarvu
2006-01-13 17:38
2006.02.12
Зоздание объекта в др.приложении.


4-1133473668
sergey1
2005-12-02 00:47
2006.02.12
как в ListBox e можно сделать переход в директорию





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский