Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2002.06.06;
Скачать: [xml.tar.bz2];

Вниз

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

 
DikobraZ   (2002-03-25 19:13) [0]

Когда посылаются данные с помощью сокетов за одно действие они склеиваются. Т.е. два сообщения объединяются в одну строку.
Как от этого избавится????


 
panov   (2002-03-25 19:29) [1]

вставлять разделители


 
DikobraZ   (2002-03-26 08:26) [2]

Это какие?? #10?


 
panov   (2002-03-26 08:37) [3]

Например, #13#10


 
Digitman   (2002-03-26 08:43) [4]

Даже при таком подходе ReceiveText все равно будет работать не так, как ожидается.


 
panov   (2002-03-26 09:56) [5]

>Digitman © (26.03.02 08:43)
А как ожидается?-)
Приходит строка, разбираем ее на подстроки, и все.
Если завершающих символов нет (разделитель), то строка сохраняется во временном буфере, ждем, пока не закончится передача строки полностью.

Или это будет выглядеть по-другому?


 
Digitman   (2002-03-26 10:21) [6]

пусть передатчик выполнил последовательно 2 вызова :


SendText("123");
SendText("456");


в момент возбуждения на приемнике события OnRead вх.поток будет содержать :

$61 $62 $63 $00 $64 $65 $66 $00 (8 байт)

в процессе обработки OnRead при вызове приемником метода str:= ReceiveText()

1. из буфера гнезда будет выбран весь вх.поток, доступный на данный момент, т.е. все 8 байт.

2. в переменную str будет записана строка до первого обнаруженного в потоке терминирующего символа $00, все остальное будет отброшено. Т.о., str примет значение "456", а строка, переданная вызовом SendText("456") попросту пропадет бесследно, сколько бы ни было последующих вызовов ReceiveText.

Такова в реальности логика работы ReceiveText() у компонентов, реализующих функциональность гнезд, работающих в режиме SOCK_STREAM


 
Digitman   (2002-03-26 10:23) [7]

Ошибка :

верно будет "Т.о., str примет значение "123""


 
yaJohn   (2002-03-26 12:34) [8]

2 Digitman
Т.о. можно сделать вывод, что SendText & ReceiveText работают в логике PCHAR, а не String?

2 DikobraZ
Это не баг, это фича, причем описанная в документации. Вас же не удивляет, что когда вы последовательно 2 раза пишете в файл, прочитать можно все за 1 раз.


 
DikobraZ   (2002-03-26 12:45) [9]

Я знаю, что так и должно быть. Просто мне это мешает и нужно от этого избавиться. :)


 
Digitman   (2002-03-26 13:02) [10]

>DikobraZ
Для гнездовой работы со строками проще всего воспользоваться UDP-протоколом (SOCK_DGRAM) вместо SOCK_STREAM

>yaJohn
Дело не в этом. Дело в том, что в теле ReceiveText() происходит неявный вызов WinsockAPI-ф-ции recv(), одним из параметров которой требуется передать размер "порции" данных, которые нужно прочитать из приемного буфера гнезда (а любой буфер гнезда, будь он передающий или приемный - это, своего рода, очередь поточного ввода/вывода данных). Так вот размер очер. строки в этой очереди заранее неизвестен, а потому считывается вся текущая очередь и далее сканируется символ за символом, начиная с "головы", до обнаружения символа-терминатора. Все, что до терминатора, записывается в результат работы ReceiveText(), все, что после - игнорируется и отбрасывается.



 
panov   (2002-03-26 14:18) [11]

>DikobraZ
Воспользуйся SendBuf и ReceiveBuf. В них будет работать, как надо.


 
Wizard_Ex   (2002-03-26 16:56) [12]

Как вариант в той же строке передавай размер:
например послал: S:="Hi!"
передается ASendText:=Length(S)+"#"+S
Потом просто используя Pos Delete Copy получаешь длину строки и собственно саму строку, а если маленько доделать, то и разбивку остатка строки точно также (если к этой S еще одно сообщение прицепилось)



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

Форум: "Сети";
Текущий архив: 2002.06.06;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.007 c
1-17934
cardinal
2002-05-27 18:20
2002.06.06
Компоненты Delphi


3-17816
Oleg_er
2002-05-15 07:36
2002.06.06
Скорость в Select e


1-17906
Kozerog
2002-05-27 12:24
2002.06.06
Не уживаются два компонента


14-18146
Suntechnic
2002-05-03 18:48
2002.06.06
Вот прислали намедни...


14-18107
mimino
2002-04-29 12:35
2002.06.06
КАКавтоматически загружать свою программу ?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский