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

Вниз

Проблема с передачей файла через Сокеты....   Найти похожие ветки 

 
SeNtiMeL   (2003-02-19 03:26) [0]

В общем проблема передачи файла через TServerSocket клиенту TClient Socket...
ServerSocket отправляет данные полностью (по крайней мере программа выводит полную отправку). Но клиент не может нормально принять эти данные, он не дополучает некоторые пакеты.
Тестирую программу на одном компьютере с IP LocalHost....
Можно отправлять файл через SendStream, но тогда не могу подсчитать кол-во отправленных данных....
Ниже привожу код программы, может есть ошибка.

Отправка сервером:
procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
ms : TMemoryStream;
Buf : Pchar;
copy : Boolean;
lsize : integer;
begin
// Получено подверждение пересылки
if Socket.ReceiveText = "OK" then
begin
ms:= TMemoryStream.Create;
ms.LoadFromFile("f:\test.mp3");
ms.Position:= 0;
Socket.SendText(IntToStr(ms.Size)); // Отправляем размер файла.
copy:=True;


While Copy = true do
begin
Application.ProcessMessages;

lsize:=Min(ms.Size-ms.Position,1024);
GetMem(Buf,Lsize);
if lsize <> 0 then
begin
ms.Read(Buf^,lsize);
Application.ProcessMessages;
ServerSocket1.Socket.Connections[0].SendBuf(buf^,lsize);

Label1.Caption:="Отправлено: "+IntToStr(ms.Position)+" из " + IntToStr(ms.Size);
end
else Copy := False;
FreeMem(Buf);
end;
ms.Free;
end;
end;

Получение клиентом:
procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
var s, sl, tmp: string;
s2 : Pchar;
x,x1 : Real;
y,lsize : Integer;

begin
s:=Socket.ReceiveText;

if fl = 1 then
begin
if not Reciving then
begin
sl:=Copy(s,1,Length(s));
DataSize:= StrToInt(sl);
Data:= TMemoryStream.Create;
Delete(s, 1, Length(sl));
Reciving:= true;
end;
try
Data.Write(s[1], length(s));
x:=Data.Size * 100 div DataSize;
x1:=Int(x);
tmp:=FloatToStr(x1);
Form2.ProgressBar1.Position:=StrToInt(tmp);
Form2.Label3.Caption:="Получено "+ IntToStr(Data.Size)+ " из " + IntToStr(DataSize);

if Data.Size = DataSize then
begin
Data.Position:= 0;
Data.SaveToFile("c:\test.mp3");
Data.Free;
Reciving:= false;
Socket.Close;
Form2.Button1.Enabled:=True;
Form2.Label3.Caption:="Файл получен ";
end;
except
Data.Free;
end;

end;


 
Digitman   (2003-02-19 09:42) [1]

1. нет анализа результатов выполнения методов SendText, SendBuf
2. нет обработки события OnClientWrite


 
SeNtiMeL   (2003-02-19 21:12) [2]

Если не сложно, то опиши поподробней об этом...


 
Fredericco   (2003-02-19 21:45) [3]

Наша бесседа с Digitman"ом, в завершении которой все подробно описано.
http://delphi.mastak.ru/cgi-bin/forum.pl?look=1&id=1042188128&n=4


 
SeNtiMeL   (2003-02-19 22:08) [4]

Спасибо, но я уже сам разобрался :)

В посылке данных нужно было добавить проверку на очередь отправки, если она полная то попробовать еще раз....
Вот часть кода

ms.Read(Buf^,lsize);
point1: // метка для новой попытки
Application.ProcessMessages;
if ServerSocket1.Socket.Connections[0].SendBuf(buf^,lsize) = -1 then goto point1; // если очередь полная, то идем к метке и пробуем еще раз...


 
mrcat   (2003-02-20 00:25) [5]

SendText returns the number of bytes sent. Note that this may be less than the length of the string S if the socket is nonblocking.

что делать будете, в случае, если буфер "частично" полон?
Ваше условие не выполнится:
if ServerSocket1.Socket.Connections[0].SendBuf(buf^,lsize) = -1 then goto point1;


 
SeNtiMeL   (2003-02-22 00:28) [6]

хм.... 8К буфер наполняется мнгновенно...
И я использую не SENDTEXT а SENDBUF это разные вещи....


 
Digitman   (2003-02-22 13:30) [7]


> SeNtiMeL


Чем же они "разные" ? ты хоть в исходники заглядывал ? Все, что делает SendText - прямой вызов SendBuf


 
SeNtiMeL   (2003-02-23 00:15) [8]

А гдеж взять исходники то.... Их не наблюдается в поставки дельфи...


 
mrcat   (2003-02-23 00:39) [9]

>>хм.... 8К буфер наполняется мнгновенно...

"мгновенно" ничего не бывает.
И гарантии, что данные, которые ты туда "направил", полностью передадуться - тоже нет.

Читай: Note that this may be less than the length of the string S if the socket is nonblocking.


>>И я использую не SENDTEXT а SENDBUF это разные вещи.... function TCustomWinSocket.SendText(const s: string): Integer;
begin
Result := SendBuf(Pointer(S)^, Length(S));
end;




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

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

Наверх




Память: 0.47 MB
Время: 0.009 c
7-44474
turonix
2003-02-16 22:13
2003.04.14
Управление кнопкой


1-44168
Слава
2003-04-03 16:34
2003.04.14
Math


3-44043
jen_bond
2003-03-26 10:55
2003.04.14
EMF


1-44107
msgipss
2003-04-02 20:13
2003.04.14
Можно ли ??? Работать с объектом ListBox из другого приложения


1-44119
snake1977
2003-04-03 09:24
2003.04.14
Компиляция





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