![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Мастера, объясните
Jo © (2002-07-31 07:48:00)TServerSocket TClientSocket
Не получается сделать отправку в цикле. Мне надо отправить, например, данные в 50Кб 5 раз. Если ставлю breakpoint после send, то он нормально отправляет. Если убираю breakpoint, идет первая посылка, следующие не доходят. 8(
Digitman (2002-07-31 13:54:00) [1]см. раздел "Win32 programmer"s reference" , ключ.слово - FD_WRITE
Jo (2002-07-31 13:29:00) [2]Спасибо. Но все-таки подробности о OnWrite хотелось бы знать. Подскажи где почитать можно или сам объясни поподробнее.
Digitman (2002-07-31 11:45:00) [3]ну, примерно так , если уж не хочешь вдаваться в подробности использования 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 10:50:00) [4]Digitman, пожалуйста, напиши пример, что необходимо сделать. Погибаю. Сроки сдачи горят. 8((((
Digitman (2002-07-31 09:48:00) [5]Потому что готовность гнезда к записи в буфер передачи в режиме ctNonBlocking фиксируется фактом возникновения события OnWrite(). А в твоем коде это событие нигде не используется. Событие же OnWrite() в режиме ctNonBlocking - асинхронное, условие его возбуждения в осн.потоке ты создал строчкой
Application->ProcessMessages(), что, впрочем, не делает твой код полностью корректным.
Одним словом - выполнять send-методы в ctNonBlocking-режиме следует лишь по факту возникновения события OnWrite(). Точно так же, как асинхронное чтение корректно лишь по факту события OnRead()
Jo (2002-07-31 09:14:00) [6]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;
}
}
Почему так работает?
Jo (2002-07-31 08:26:00) [7]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 08:24:00) [8]C breakpoint-ом - 4 раза, без - 2раза
Jo (2002-07-31 08:20:00) [9]Отправляю 9К 2 раза, ставлю breakpoint, приходит 8к - 1к - 8к - 1к. Убираю breakpoint, приходит 8k - 1k.
Digitman (2002-07-31 08:14:00) [10]И что ? Сколько раз событие OnRead() возникает ? Сему равно значение переменной iReceived в каждом из возникших событий после вызова ReceiveBuf() ?
Jo (2002-07-31 08:10:00) [11]Я уже все заремарил. Оставил только вот это.
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:08:00) [12]У тебя с приемом проблемы, а не с отправкой.
Приводи код обработчика OnRead/OnClientRead