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

Вниз

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

 
Кодер ©   (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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.026 c
1-1103782306
Denmin
2004-12-23 09:11
2005.01.09
Срочно!!! Горю!!! Не печатается QuickReport в win98!!


1-1103646996
Ландграф Павел
2004-12-21 19:36
2005.01.09
получение "полного пути" - из .. cls получить c: folder cls


14-1103299004
Dert
2004-12-17 18:56
2005.01.09
Движок для чата.


1-1103596570
saNat
2004-12-21 05:36
2005.01.09
Справка в моей форме


9-1095718471
Ктото
2004-09-21 02:14
2005.01.09
Как создавать 3ds объекты с прозрачными/полупрорачными текстурами