Главная страница
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.044 c
14-1103451382
tazik
2004-12-19 13:16
2005.01.09
На каком сайте можно достать нормальную графику для программы


1-1103710048
Руслана
2004-12-22 13:07
2005.01.09
Подскажите как грамотно решить следующую задачу


1-1103841614
Тимофей
2004-12-24 01:40
2005.01.09
Нет иконки HELP!!!


1-1103811959
Adoon
2004-12-23 17:25
2005.01.09
Как определить версию Excel (97 или 2000) и язык


4-1100691761
fester
2004-11-17 14:42
2005.01.09
Процесс запуска EXE-файла