Форум: "Сети";
Текущий архив: 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.036 c