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

Вниз

Буфер неопределенной заранее длины через Сокет   Найти похожие ветки 

 
Кодер ©   (2004-10-22 14:38) [0]

Привет, я передаю буфер через WinSocketStream следующим образом:

 
var
...
Buffer: array [0..100] of Char;
i: byte;

begin
 ClientSocket1.Open;
 try
   Stream:= TWinSocketStream.Create(ClientSocket1.Socket, 10000);
   try
     FillChar(Buffer, SizeOf(Buffer), 0);
     for i:=1 to length(edQuery.Text) do
       Buffer[i-1]:= edQuery.Text[i];
     Stream.Write(Buffer, SizeOf(Buffer));
...


и принимаю на сервере:


var
...
 Buffer: array [0..100] of Char;

begin
 try
   while not Terminated and ClientSocket.Connected do
     begin
       try
         Stream:= TWinSocketStream.Create(ClientSocket, 10000);
         try
           FillChar(Buffer, SizeOf(Buffer), 0);
           if Stream.WaitForData(10000)
             then
               begin
                 Stream.Read(Buffer, SizeOf(Buffer));
...

во всем этом мне не нравится то, что в программе уже заложена максимальная длина передаваемого и принимаего буфера, как можно передавать и принимать буфер каждый раз разного размера, в зависимости от размера передаваемего/принимаего запроса через WinSocketStream в данном случае. Я слышал, что можно как-то поиграться с Buffer: PChar, передавая буфер длины какой мне нужно, а на другой стороне прежде чем, считывать буфер из потока, сначало определяется длина этого буфера.


 
Reindeer Moss Eater ©   (2004-10-22 14:41) [1]

Есть и другой путь:
Мыслепередача между принимающим и передающим процессорами через мировой эфир.


 
Reindeer Moss Eater ©   (2004-10-22 14:42) [2]

А если без шуток, то естественно, надо сообщать длину принимающей стороне.
Либо принимать соглашение о признаке конца.


 
Кодер ©   (2004-10-22 17:40) [3]

Но ест же свойство Size у WinSocketStream, описание которого гласит о том, что это свойство содержит значение количества байт в потоке, которые "пришли" от клиента.


 
Verg ©   (2004-10-22 22:11) [4]

При передаче я тоже не понял, для чего ты так тщательно переписываешь одну область памяти в другую. Чем она лучше "оригинала"?
 stsize := length(edQuery.Text);
 i := 0;
 while (stsize - i) > 0 do
 begin
   res := Stream.Write(pchar(edQuery.Text)[i], stsize - i);
   if res > 0 then
     inc(i, res)
   else
     //Произошла ошибка (res < 0) или разрыв соединения (res = 0);
 end;
 

А при приеме.... О каком "заранее известном" размере буфера ты говоришь? TCP - это ж протокол поточной (stream), а не блочной передачи. Какая разница, по большому счету, буферами какого размера ты будешь "вычерпывать" поток принимаемых данных? Ты главное правильно это делай, а то я смотрю тебе совершенно "фиалетово" что вернула Stream.Read, а это есть ключевой момент, между прочим.
А размер твоего "ковшика" TCP интересует меньше всего...



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

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

Наверх





Память: 0.45 MB
Время: 0.028 c
14-1103541931
Игорь Шевченко
2004-12-20 14:25
2005.01.09
В продолжение темы о дебилизации: читать наизусть


1-1103696513
ceval
2004-12-22 09:21
2005.01.09
Подскажите пажалуста компонентн для работы с архивами


3-1102476143
dolphin
2004-12-08 06:22
2005.01.09
filter глюкует в инспекторе пашет а програмно нет


4-1100872941
Змей
2004-11-19 17:02
2005.01.09
не прямоугольная форма


14-1103354543
ms
2004-12-18 10:22
2005.01.09
Неужели я так плохо знаю C++, или как это можно объяснить?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский