Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Событие OnServerSockeClientWrite [D6, WinXP]


kosmach ©   (2002-08-07 12:44:00) 

Простите если совсем задрал, но как мне сказали, событие onClientWrite происходит, когда сервер передал последний байт из буфера и снова готов передавать, или сразу при коннекте. Однако у меня оно срабатывает, только во втором случае.
Вот код:
...

procedure TForm1.ClientSocketWrite(Sender: TObject;
Socket: TCustomWinSocket);
begin
Memo.Lines.Add("Client: OnWrite");
end;

procedure TForm1.ServerSocketClientWrite(Sender: TObject;
Socket: TCustomWinSocket);
begin
Memo.Lines.Add("Server: OnClientWrite");
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
ClientSocket.Socket.SendText("Hi, Server");
end;

procedure TForm1.ClientSocketRead(Sender: TObject;
Socket: TCustomWinSocket);
begin
Memo.Lines.Add("Client: Rreceive text: "+Socket.ReceiveText);
end;

procedure TForm1.ServerSocketClientRead(Sender: TObject;
Socket: TCustomWinSocket);
begin
Memo.Lines.Add("Server: Rreceive text: "+Socket.ReceiveText);
Socket.SendText("Hi, Client");
end;

...
Однако сколько бы я не отпрвлял message на сервер и не получал ответный, в Memo надписи "Client: OnWrite" и "Server: OnClientWrite" появляются только один раз, сразу после установки соединения.


kosmach   (2002-08-08 13:21:00) [1]


> Alex Demchenko

Спасибо, я так понял, что OnClientWrite возникает не тогда когда уйдет последний байтик из буфера, а когда в буфере появится место, для помещения туда новых байтиков. Потому оно у меня и не срабатывало, так как я туда слишком мало клал и буфер никогда не наполнялся.
Все я ясно, спасибо.


kosmach   (2002-08-08 13:16:00) [2]


> MAYOR ©

Ничего интересного я не придумал, все чего мне надо было - это послать несколько файлов с сервера клиенту, а OnClientWrite, нужен был для того, чтобы раньше времени не убить поток, который я отсылаю с сервера. Раз не работает OnClientWrite, то раз уж мне все равно клиенту имя файла посылать отдельно, так я ему еще и размер послал, а он как весь файл принял, так мне сообщение и послал, что все принял, тут я поток и убиваю. Ну или если чегото не получилось, то при дисконнекте. Вобщем может и через задницу, зато работает, проверял.
Извени, что медленно отвечаю, просто редко сюда заглядываю.


Alex Demchenko   (2002-08-08 13:11:00) [3]


> Однако сколько бы я не отпрвлял message на сервер и не получал
> ответный, в Memo надписи "Client: OnWrite" и "Server: OnClientWrite"
> появляются только один раз, сразу после установки соединения.

Это совсем не так! Дело в том что в OS существует некий буфер отправки информации. Т.е. когда ты вызывает send, то получается что вроде как это non-blocking операция и информация сразу ушла, на самом деле она добавляется в буффер отправки и ждет своего времени. Конечно, этот буфер небесконечен и иногда переполняется, тогда send() вернет -1 (SOCKET_ERROR) и WSAGetLastError WSAEWOULDBLOCK, через некоторое время, когда буфер будет свободен !ВЫЗЫВАЕТСЯ FD_WRITE, в этом случае ClientSocketWrite!. Другими словами FD_WRITE говорит нам о том что соrет готов для записи и можно писать до тех пор, пока не переполнится буффер (ошибка WSAEWOULDBLOCK), после того как FD_WRITE будет вызван опять, можно продолжать запить. Сорри что на компоненте это показать не могу, т.к. пишу обычно свои :)


MAYOR   (2002-08-08 11:52:00) [4]

огда работай в разных потоках!!! у тебя отсылка и прием происходят мгновенно. поетому у тебя не успевает читаться сообщение!!!делай многопоточное приложение!!! ксати интересно что ти придумал!!! можеш на мило отвечать быстрей получится


kosmach   (2002-08-08 11:40:00) [5]


> MAYOR ©


Не могу я на разных формах делать, у меня требование такое, чтобы одно приложение могло бы быть как сервером, так и клиентом, вот я и пырхаюсь. Правда я тут уже надумал, как мне и без OnClientWrite"а замутиться, но если вдруг у кого-то что-то дельное будет по этому поводу, пожалуйста напишите.


MAYOR   (2002-08-08 09:56:00) [6]

а ты зачем все ето на одной форме сделал???сделай в разных приложениях!!!у тебя 1 приложение-1 поток!!!


kosmach   (2002-08-08 06:45:00) [7]


> ACR ©

Очень смешно ...блин... мне работать надо, а у меня затык в самом начале пути.


ACR   (2002-08-07 19:08:00) [8]

а ты и паверил... гы гы гы


Наверх

Титульная страница Поиск, карта сайта Написать письмо