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

Вниз

Socket ы   Найти похожие ветки 

 
Alex90210 ©   (2002-08-02 13:46) [0]

Мистика в следующем: есть два приложения один клиент и один сервер
они соединяются не блокирующим соединением (NonBlocking). Клиент передает текст методом SendText сервер по событию OnClienRead считывает текст методом ReciveText. Короче все как в деме "Chat". До поры до времени все нормально, но рано или позно все поростает. Клиент продолжает передавать сообщения, а сервер виснет (не принимает). Подскажите чего ждет сервер и как сдвинуть его с мертвой точки. Заранее благодарен.


 
Digitman ©   (2002-08-02 13:54) [1]

Где код ? Клиента и сервера ?


 
Alex90210 ©   (2002-08-02 14:08) [2]

Код сервера:
procedure TForm1.StartClick(Sender: TObject);
begin
ServerSocket1.Port:=101;
ServerSocket1.Open();
end;

procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
buf: string;
l: integer;
begin
Memo1.Lines.Insert(0,Socket.ReceiveText);
end;

Код которым клиент отправляет текст:
procedure Thread1.Execute;
var
begin
while StopFlag do
begin
CS.Socket.SendText("message"+IntToStr(Counter));
sleep(300);
end;
end;


 
Digitman ©   (2002-08-02 14:26) [3]

1. Где обработка события OnWrite ?

2.
>> sleep(300);
а это зачем ? откуда взялась цифирь "300" ?



 
Alex90210 ©   (2002-08-02 14:41) [4]

А зачем обрабатывать OnWrite? Цыфирь 300 моделирует работу содержательной части, а приведенный код - это тест пример. Надо добиться устойчивой передачи сообщения раз в 300 m.


 
Digitman ©   (2002-08-02 14:49) [5]

>Alex90210

Не будет у тебя никогда устойчивой передачи, если ты игногируешь событие OnWrite() (готовность буфера передатчика). Это - асинхронный режим !

Точного периода готовности передатчика ты тоже не определишь и не вычислишь . Ни спомощью sleep() ни спомощью иной "цифири". Передатчик в асинхронном режиме работает сам по себе, его работа зависит от множества факторов, и ему глубоко "начхать" на твои задержки. А вот о факте своей готовности (когда передатчик успешно "выплюнет" в сеть весь буфер, что ты со скоростью 1 раз в 300 ms наращиваешь, считая, что буфер бездонный и сеть работает мгновенно), передатчик и сообщит тебе событием OnWrite()


 
Digitman ©   (2002-08-02 14:54) [6]

а вот сюда, в хэлп :

SendText returns 0 if the string was successfully written. It returns a nonzero value if the writing must be postponed. When SendText returns a nonzero value, it must be called again later to write the value over the connection.

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


 
Alex90210 ©   (2002-08-02 14:57) [7]

Извиняюсь за свою темность, просто работую с этим первый раз. Так как мне таки передать сообщение чтоб все было нормально.


 
Digitman ©   (2002-08-02 15:04) [8]

Цитата из хэлпа в Digitman © (02.08.02 14:54) тебе ни о чем не говорит ?


 
Alex90210 ©   (2002-08-02 15:13) [9]

Ну вот вроде понял. Ща попробую. Спасибо за помощь, впредь буду серьезно относиться к задачам сетевого взаимодействия.


 
Digitman ©   (2002-08-02 15:18) [10]

Сомневаюсь, что - понял. Вот как ты поступишь, если SendText() вернет не ноль ? Как это увязать с событием OnWrite(). Вот поразмысли над этим ...
Готов помочь только при серьезном и детальном исследовании тобой всего этого механизма...



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

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

Наверх




Память: 0.49 MB
Время: 0.016 c
1-7900
Гость324
2002-09-23 14:01
2002.10.03
Вопрос по описанию массива...


14-8161
Undert
2002-09-09 00:13
2002.10.03
Для Питербуржцев охрененное предложение!!!


3-7856
KIR
2002-09-12 08:43
2002.10.03
2 запроса в один DBGrid


3-7776
Engel
2002-09-14 16:19
2002.10.03
Как лучше осуществлять нумерацию записей в сетевой базе?


1-7901
maxuscz
2002-09-22 21:36
2002.10.03
Ищу програмистов