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

Вниз

Подсчет информации переданной сокетом   Найти похожие ветки 

 
alexta   (2002-07-11 02:52) [0]

Привет, знатоки!

Может кто сталкивался. Как подсчитать количество информации переданной сокетом за определенное время? С подсчетом входящей - проблем нет, а вот с исходящей...

С уважением, Алексей.


 
Malder   (2002-07-12 16:50) [1]

Поделись, как ты подсчитываешь входящий траффик ?


 
Malder   (2002-07-15 13:38) [2]

Ау.


 
Pingo   (2002-07-15 13:50) [3]

>> Поделись, как ты подсчитываешь входящий траффик ?


 
alexta   (2002-07-16 16:23) [4]

Сорри за ожидание.

Это легко.
ClientRead - навешен на OnRead Client-а, OnTimer - на OnTimer Timer-а.

var
InputTraffic: integer;
InfoCounter: integer;
Timer: TTimer;
Client: TClientSocket;

procedure ClientRead(Sender: TObject; Socket: TCustomWinSocket);
var
Buf: PChar;
len: integer;
begin
len:=Socket.ReceiveLength;
GetMem(Buf,len);
len:=Socket.ReceiveBuf(Buf,len);
inc(InfoCounter);

//----------
// your code
//----------

FreeMem(Buf);
end;

procedure OnTimer(Sender: TObject);
begin
InputTraffic:=InfoCounter div Timer.Interval;
InfoCounter:=0;
end;


 
alexta   (2002-07-16 16:41) [5]

Опечатка получилась. В 4-ой строке ClientRead нужно:
inc(InfoCounter,len);


 
Digitman   (2002-07-16 17:30) [6]

Ну так - по аналогии и исходящий считай :

CurrentlyBytesSent:=Socket.SendBuf(Buf, BytesToSend);
Inc(TotalBytesSent, CurrentlyBytesSent);

И в чем проблема ?



 
Digitman   (2002-07-16 17:34) [7]

Ну так - по аналогии и исходящий считай :

CurrentlyBytesSent:=Socket.SendBuf(Buf, BytesToSend);
Inc(TotalBytesSent, CurrentlyBytesSent);

И в чем проблема ?



 
Song   (2002-07-16 18:09) [8]

GetIPStatistics()


 
alexta   (2002-07-16 20:09) [9]

>2 Digitman
Такой вариант не пройдет. У меня nonblocking сокет. Поэтому SendBuf возвращает количество байтов поставленных в очередь на отправку (во внутренний буфер сокета). К реально отправленым - не имеет никакого отношения.


 
alexta   (2002-07-16 20:13) [10]

> Song
Не катит. GetIPStatistics - дает информацию по текущему IP. То есть она вывалит мне общий исходящий трафик, а мне нужно именно конкретного сокета.


 
Digitman   (2002-07-17 08:46) [11]

>alexta

Буферизация работает в любом случае : и в блок. режиме и в неблокирующем.

Если тебя смущает сей факт, то обрати внимание на событие OnWrite(). Это событие в неблок.режиме фиксирует факт освобождения буфера и это вполне можно использовать, интерпретируя как сигнал о фактической передаче данных при одном или более предыдущих вызовах send().

Вот детальное описание его (события) "потрохов" в том же хэлпе :

The FD_WRITE network event is handled slightly differently. An FD_WRITE network event is recorded when a socket is first connected with connect/WSAConnect or accepted with accept/WSAAccept, and then after a send fails with WSAEWOULDBLOCK and buffer space becomes available. Therefore, an application can assume that sends are possible starting from the first FD_WRITE network event setting and lasting until a send returns WSAEWOULDBLOCK. After such a failure the application will find out that sends are again possible when an FD_WRITE network event is recorded and the associated event object is set.


 
alexta   (2002-07-17 15:55) [12]

> Digitman

Меня смущает не буферизация, а время возникновения OnWrite. Да, оно возникает после освобождения буфера (это и есть плохо). Теоретически повесив секундомер на OnWrite и счетчик на SendBuf можно подсчитать трафик. НО! Если ты передаеш данные большого объема, то возникновение события произойдет очень поздно. И получится, что ты получил общий трафик сокета за n-ое время - что не есть хорошо. Я бы хотел определять трафик за заданое время. Не знаеш, может можно как-то достучаться хотя-бы до буфера сокета? Тогда используя передачу через поток можно было-бы определить какой кусок уже передан.


 
Digitman   (2002-07-17 17:23) [13]

Я не думаю, что это так уж страшно и коряво - за заданное время подсчитать фактический объем отправленных дейтаграмм, подсчитав как результат усредненный траффик за период. Ведь и входящий траффик (о подсчете которого ты как бы не волнуешься) - тоже усредненный получается ! Те же M чтений по N байт за время T...

И почему тебя, кстати, не смущает аналогичная же ситуация при чтении, когда FD_READ возникает просто при непустом буфере приема ? Не вижу разницы ...

Но, если уж тебя потянуло на более низкий уровень, "копать" нужно в библиотеке WS2HELP.DLL, это - посредник между WinsockAPI и ядром , она ближе к файловым операциям и run-time-нотификациям событий в сетевом транспорте.


 
alexta   (2002-07-17 20:07) [14]

OnRead отличается от OnWrite тем, что это событие возникает при ЧАСТИЧНОМ наполнении буфера (точность возрастает, событие OnRead более дифференциировано). Максимальный объем принятых данных при OnRead у меня был около 12 Кб. OnWrite же возникало только после полной передачи буфера (у меня было например 1 Мб и больше).
За Ws2help.dll - спасибо. Попробую что-то нарыть.


 
Digitman   (2002-07-18 09:30) [15]

>alexta

Не совсем так.

FD_READ возникает при непустом буфере гнезда-приемника.

Ничто не мешает тебе при FD_READ читать буфер с ДОСТУПНЫМ содержимым переданного за один прием потока, например, в 3 кб за 3 приема по 1 кб в каждом. Тогда, если в обработчике FD_READ считывать очередные фрагменты потока по 1 кб, всего возникнет не менее 3-х событий FD_READ. Прими это во внимание.



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

Форум: "Сети";
Текущий архив: 2002.09.23;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.014 c
3-73566
Starter2
2002-09-03 14:56
2002.09.23
BDE + BCD поля


6-73787
Alex_LG
2002-07-07 22:48
2002.09.23
Как узнать имеет ли машина


3-73510
Pavel_S
2002-08-31 15:43
2002.09.23
ПОМОГИТЕ С ADO


1-73646
Демонов Е.В.
2002-09-10 16:29
2002.09.23
А что если метод в секцию Published ?


4-73929
Scaut
2002-06-21 17:24
2002.09.23
По поводу получения handle





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский