Главная страница
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.028 c
3-1102661653
moor38
2004-12-10 09:54
2005.01.09
Excel в Paradox 7


9-1094846937
Colt1978
2004-09-11 00:08
2005.01.09
Игровое меню


1-1103738277
Petruchello
2004-12-22 20:57
2005.01.09
Дайте исходник чистильщика...


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


14-1102886151
Piter
2004-12-13 00:15
2005.01.09
Посоветуйте насчет Wi-FI