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

Вниз

отправка строки через сокеты в цикле   Найти похожие ветки 

 
max_max   (2007-03-29 12:54) [0]

Добрый день!
Пишу клиент-серверное приложение.
Есть цикл:

for i:=0 to 10 do ServerSocket1.Socket.Connections[0].SendText(StringList1.Strings[i]);

Посдкажите, пожалуйста, почему строки (Strings[i]) отправляются одним потоком а не разными, тоесть каждая строка при каждом повторе цикла.


 
Сергей М. ©   (2007-03-29 12:58) [1]

Потому что TCP - поточный протокол.


 
max_max   (2007-03-29 13:01) [2]


> Потому что TCP - поточный протокол.


Дело в том, что если сделать так:

for i:=0 to 10 do
begin
ServerSocket1.Socket.Connections[0].SendText(StringList1.Strings[i]);
sleep(100);
end;

то все будет Ок, только производительность упадет. Может есть какой-то другой выход?


 
Сергей М. ©   (2007-03-29 13:06) [3]


> Может есть какой-то другой выход?


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


 
Rouse_ ©   (2007-03-29 13:07) [4]

Другой подход состоит в отключении алгоритма Нэгла флагом TCP_NODELAY, но это тоже может привести к уменьшению производительности из-за возросшего кол-ва пакетов в сети.


 
Сергей М. ©   (2007-03-29 13:17) [5]


> Rouse_ ©   (29.03.07 13:07) [4]



> Другой подход состоит в отключении алгоритма Нэгла


От этого же "поточность" ТСР никак не изменится )


 
max_max   (2007-03-29 13:19) [6]


> Перед каждой посылаемой строкой посылать ее длину.Соответственно
> на принимающей стороне для каждой ожидаемой строки принимать
> сначала длину, и только затем собственно строку заранее
> уже известной длины.


Имеется ввиду:

for i:=0 to 10 do
begin
ServerSocket1.Socket.Connections[0].SendText(
 IntToStr(Length(StringList1.Strings[i]));
ServerSocket1.Socket.Connections[0].SendText(StringList1.Strings[i]);
end;

Если да, то предположим есть список:
первая строка
     вторая строка
     ...


В этом случае клиент примет строку: 13первая строка13вторая строка, тоесть прийдется писать отдельную функцию для разбора этой строки. Это конечно не сложно, но а если количество символов и строка отправятся в отдельных потоках? Возможно ли это?


 
Сергей М. ©   (2007-03-29 14:14) [7]


> Это конечно не сложно


Ну раз не сложно, то дерзай ! Какие проблемы-то ?


> сли количество символов и строка отправятся в отдельных
> потоках?


Какие нафих "потоки". Ты под SuperOS передаешь чего-то там при посредничестве TCP, я под PuperOS принимаю это самое "чего-то там" при посредничестве того же самого TCP, и мы знать не знаем о каких-то там "потоках" друг у друга, тем не менее ты успешно передал, а я успешно принял.

Дальше шевели репой сам).. То бишь - делай выводы)



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

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

Наверх




Память: 0.48 MB
Время: 0.024 c
3-1184933534
max1991
2007-07-20 16:12
2007.12.02
Определение выделенной строки в DBGrid


2-1194454617
ari_9
2007-11-07 19:56
2007.12.02
FIBPlus: сохраняю Stream в Blob-поле, получаю AV


15-1194104709
tarasoff
2007-11-03 18:45
2007.12.02
BPwin ERWin


15-1193680169
SQL555
2007-10-29 20:49
2007.12.02
Проблема с процедурой SQL


2-1194334863
Kolan
2007-11-06 10:41
2007.12.02
Как правильно делать диалоги?