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

Вниз

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

 
pavl1k1   (2002-06-04 14:17) [0]

Мне необходимо передавать файлы по сокетам от клиента к серверу и наоборот. Написал програмулину а она неправильно работает.
При передачи данных в сокет, данные автоматически разбиваются на порции по 8 байт, однако если большой файл и последняя порция меньше 8 байт то при приёме данные дополняются ерундой. Как мне быть!!
Пример проги:
// Запись данных в сокет
procedure SendFileInSocket(Socket:TCustomWinSocket;filename:string);
var bufsize:integer;
buffer:pchar;
str:TFileStream;
begin
str:=TFileStream.Create(filename,fmOpenRead);
bufsize:=str.Size;
GetMem(buffer,bufsize);
str.ReadBuffer(buffer^,bufsize);
Socket.SendBuf(buffer^,bufsize);
FreeMem(buffer);
str.Free;
end;
// Приём данных из сокета
procedure GetFileFromSocket(Socket:TCustomWinSocket;filename:string);
var bufsize:integer;
buffer:pchar;
str:TFileStream;
begin
bufsize:=Socket.ReceiveLength;
GetMem(buffer,bufsize);
Socket.ReceiveBuf(buffer^,bufsize);
try
str:=TFileStream.Create(filename,fmOpenWrite);
except
str:=TFileStream.Create(filename,fmCreate);
end;
str.Seek(0,soFromEnd);
str.WriteBuffer(buffer^,bufsize);
FreeMem(buffer);
str.Free;
end;

procedure TForm1.Send_To_ClientClick(Sender: TObject);
begin
Form1.OpenDialog1.Execute;
SendFileInSocket(Form1.ServerSocket1.Socket.Connections[0],Form1.OpenDialog1.FileName);
end;

procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
begin
GetFileFromSocket(Form1.ServerSocket1.Socket.Connections[0],"recser");
end;

procedure TForm1.Send_To_ServerClick(Sender: TObject);
begin
Form1.OpenDialog1.Execute;
SendFileInSocket(Form1.ClientSocket1.Socket,Form1.OpenDialog1.FileName);
end;

procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
begin
GetFileFromSocket(Form1.ClientSocket1.Socket,"reccl");
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Form1.ServerSocket1.ServerType:=stNonBlocking;
Form1.ServerSocket1.Port:=1301;
Form1.ServerSocket1.Open;
Form1.ClientSocket1.ClientType:=ctNonBlocking;
Form1.ClientSocket1.Host:="localhost";
Form1.ClientSocket1.Port:=1301;
Form1.ClientSocket1.Open;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Form1.ClientSocket1.Close;
Form1.ServerSocket1.Close;
end;


 
Song   (2002-06-04 14:49) [1]

В FAQ хороший пример.


 
Digitman   (2002-06-04 15:29) [2]

Socket.ReceiveLength() возвращает размер ожидаемых данных
Socket.ReceiveBuf() возвращает размер реально принятых данных



 
pavl1k1   (2002-06-04 17:16) [3]

Я конечно понимаю, что утомил длинным кодом, но что делают Socket.ReceiveLength() и Socket.ReceiveBuf() я знаю и FAQ смотрел - на него и опирался!!! Может в коде чтото не то, а может это из-за Win2k?


 
Digitman   (2002-06-04 18:45) [4]

Да не опирался ты на него вовсе !

вот цитата из твоего кода :

bufsize:=Socket.ReceiveLength; // вот ты получил ожидаемый размер
GetMem(buffer,bufsize); // вот - запросил под него буфер
Socket.ReceiveBuf(buffer^,bufsize); // вот - пытаешься прочитать все , что, якобы доступно на сей момент ... а сколько реально прочитано-то ? почему не спрашиваешь у ReceiveBuf(), сколько она реально прочитала ? почему не анализируешь результат
ReceiveBuf() ?

str.WriteBuffer(buffer^,bufsize); // а вот ты пишешь в файл реально прочитанные данные в начале буфера + "мусор" в конце буфера ! потому как bufsize = одидаемому размеру, реально же прочитанный может быть и меньше !



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

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

Наверх




Память: 0.45 MB
Время: 0.006 c
6-60770
Sin
2002-06-04 13:55
2002.08.19
Собственны проси сервер


4-60919
_toltec
2002-06-12 04:10
2002.08.19
Как зная хендл окна убить его?


1-60581
maxim2
2002-08-08 08:25
2002.08.19
Не могу додуматься как сделать?


14-60830
Dimich1978
2002-07-24 10:58
2002.08.19
Вопрос по прпограмме


14-60828
dimonf
2002-07-24 11:19
2002.08.19
Народ, подскажите, как найти работу (шабашку) удаленно по инету?





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