Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.46 MB
Время: 0.014 c
2-1194614879
Denis__
2007-11-09 16:27
2007.12.02
Цвет рабочего стола


15-1193307568
Валентин
2007-10-25 14:19
2007.12.02
смогу ли я быть программистом


15-1193677212
ProgRAMmer Dimonych
2007-10-29 20:00
2007.12.02
Плз, киньте ссылку на справочник по JavaScript...


4-1179507014
Bacardi
2007-05-18 20:50
2007.12.02
Очередь печати


4-1179813270
новичок2
2007-05-22 09:54
2007.12.02
Вызов ConvertStringSecurityDescriptorToSecurityDescriptor




   Наверх