Форум: "Сети";
Текущий архив: 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