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

Вниз

Мастера, объясните   Найти похожие ветки 

 
Jo   (2002-07-31 07:48) [0]

TServerSocket TClientSocket

Не получается сделать отправку в цикле. Мне надо отправить, например, данные в 50Кб 5 раз. Если ставлю breakpoint после send, то он нормально отправляет. Если убираю breakpoint, идет первая посылка, следующие не доходят. 8(


 
Digitman ©   (2002-07-31 08:08) [1]

У тебя с приемом проблемы, а не с отправкой.
Приводи код обработчика OnRead/OnClientRead


 
Jo   (2002-07-31 08:10) [2]

Я уже все заремарил. Оставил только вот это.

void * pdBuffer = new(char[Socket->ReceiveLength()]);

int iReceived = Socket->ReceiveBuf(pdBuffer, Socket->ReceiveLength());

delete pdBuffer;

Form1->Memo1->Lines->Add(":"+IntToStr(iReceived));


 
Digitman ©   (2002-07-31 08:14) [3]

И что ? Сколько раз событие OnRead() возникает ? Сему равно значение переменной iReceived в каждом из возникших событий после вызова ReceiveBuf() ?


 
Jo   (2002-07-31 08:20) [4]

Отправляю 9К 2 раза, ставлю breakpoint, приходит 8к - 1к - 8к - 1к. Убираю breakpoint, приходит 8k - 1k.


 
Jo   (2002-07-31 08:24) [5]

C breakpoint-ом - 4 раза, без - 2раза


 
Jo   (2002-07-31 08:26) [6]

void __fastcall TCSocket::Send(TPacket* pPacket)
{
int iSize = 0x1000;

void *c = new char[iSize];

TMemoryStream *pMemStream = new TMemoryStream;

// pMemStream->Write(pPacket->Packet(), pPacket->PacketLen);

pMemStream->Write(c, iSize);

delete c;

pMemStream->Position = 0;

pSocket->Socket->SendStream(pMemStream);
}


 
Jo   (2002-07-31 09:14) [7]

int iSize = 0x2000;

void *c = new char[iSize];

TMemoryStream *pMemStream = new TMemoryStream;

pMemStream->Write(c, iSize);

delete c;

pMemStream->Position = 0;

int Count = 0;

while (!pSocket->Socket->SendStream(pMemStream))
{
Application->ProcessMessages();
Count++;
if (Count>10000) break;
}
}

Почему так работает?


 
Digitman ©   (2002-07-31 09:48) [8]

Потому что готовность гнезда к записи в буфер передачи в режиме ctNonBlocking фиксируется фактом возникновения события OnWrite(). А в твоем коде это событие нигде не используется. Событие же OnWrite() в режиме ctNonBlocking - асинхронное, условие его возбуждения в осн.потоке ты создал строчкой
Application->ProcessMessages(), что, впрочем, не делает твой код полностью корректным.

Одним словом - выполнять send-методы в ctNonBlocking-режиме следует лишь по факту возникновения события OnWrite(). Точно так же, как асинхронное чтение корректно лишь по факту события OnRead()


 
Jo   (2002-07-31 10:50) [9]

Digitman, пожалуйста, напиши пример, что необходимо сделать. Погибаю. Сроки сдачи горят. 8((((


 
Digitman ©   (2002-07-31 11:45) [10]

ну, примерно так , если уж не хочешь вдаваться в подробности использования OnWrite() :

with MyStream do
try
while Socket.Connected and (Position < Size) and Socket.SendStream(MyStream) do
Application.ProcessMessages;
except
on ESocketError do
raise;
end;


 
Jo   (2002-07-31 13:29) [11]

Спасибо. Но все-таки подробности о OnWrite хотелось бы знать. Подскажи где почитать можно или сам объясни поподробнее.


 
Digitman ©   (2002-07-31 13:54) [12]

см. раздел "Win32 programmer"s reference" , ключ.слово - FD_WRITE



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

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

Наверх




Память: 0.49 MB
Время: 0.014 c
4-98402
ssv
2002-08-13 14:09
2002.09.30
WNetGetResourceParent


3-97952
wed
2002-09-07 18:53
2002.09.30
Как сгруппировать данные по неделям ?


14-98276
MalkoLinge
2002-08-31 12:28
2002.09.30
Встреча в Киеве !!!


1-98096
Донской
2002-09-19 20:16
2002.09.30
Есть ли ограничение на количество строк в одном файле unit?


14-98282
Елена
2002-09-03 06:25
2002.09.30
Менеджеры закачек