Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

проблема передачи файлов через сокеты не могу передать больше 8кб

13K
29 сентября 2005 года
Cameron
2 / / 28.09.2005
Вот программа передачи файлов через сокеты но она передаёт не больше 8 кб помогите сделать так что бы передавать любой обьём.
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ScktComp, StdCtrls, jpeg, ExtCtrls;

type
TForm1 = class(TForm)
Image1: TImage;
Image2: TImage;
Button1: TButton;
Button2: TButton;
Button3: TButton;
Memo1: TMemo;
ClientSocket1: TClientSocket;
ServerSocket1: TServerSocket;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure ClientSocket1Connect(Sender: TObject;
Socket: TCustomWinSocket);
procedure ServerSocket1ClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
procedure Button2Click(Sender: TObject);
procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
procedure Button3Click(Sender: TObject);
procedure ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
private
buffer1:^integer;
buffer2:^integer;
Output:TmemoryStream;
InPut:TmemoryStream;
Size:Integer;
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
serversocket1.Port:=1001;
serversocket1.Active:=true;
serversocket1.Open;
memo1.Lines.Add('Ñåðâåð Àêòèâåí');
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
clientsocket1.Port:=1001;
clientsocket1.Address:='192.168.0.2';
clientsocket1.Active:=true;
memo1.Lines.Add('Êëèåíò àêòâåí');
end;

procedure TForm1.ClientSocket1Connect(Sender: TObject;
Socket: TCustomWinSocket);
begin
clientsocket1.Open;
memo1.Lines.Add('Êëèåíò ïîäêëþ÷èëñÿ');
end;

procedure TForm1.ServerSocket1ClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
memo1.Lines.Add('Ñåðâåð: êëèåíò ïîäêëþ÷èëñÿ');
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
clientsocket1.Socket.SendText('send');
memo1.Lines.Add('Çàïðîñ îòïðàâëåí send');
end;



procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
begin
input:=tmemorystream.Create;
input.Position:=0;
size:=socket.ReceiveLength;
getmem(buffer2, size);
socket.ReceiveBuf(buffer2^,size);
input.Write(buffer2^, size);
freemem(buffer2);
begin
input.Position:=0;
memo1.Lines.Add(inttostr(socket.ReceiveLength));
input.SaveToFile('d:\1.jpg');
memo1.Lines.Add('Ôàéë ïðèíÿò');
end;
end;


procedure TForm1.Button3Click(Sender: TObject);
var
i:integer;
begin

begin
Output:=Tmemorystream.Create;
output.Position:=0;
image1.Picture.Graphic.SaveToStream(output);
i:=output.Size;
memo1.Lines.add(inttostr(i));
getmem(buffer1,i);
output.Position:=0;
begin
output.Read(buffer1^,i);
serversocket1.Socket.Connections[0].SendBuf(buffer1^,i);
freemem(buffer1);
end;
memo1.Lines.Add('Ôàéë îòïðàâëåí');
end;
end;

procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
begin
memo1.Lines.Add(socket.ReceiveText);
end;

end.
303
30 сентября 2005 года
makbeth
1.0K / / 25.11.2004
Цитата:
Originally posted by Cameron
Вот программа передачи файлов через сокеты но она передаёт не больше 8 кб помогите сделать так что бы передавать любой обьём.


Сокет передает сколько угодно, просто размер пакета данных, которые можно передать за раз, у него ограничено 8 кб. Обработчик ClientRead в любом случае вызовется столько раз, сколько данных было передано, но не больше 8 кб за один вызов. Для решения этой проблемы можно перед пердачей файла посылать его размер, тогда на принимающей стороне всегда известно, сколько читать из сокета.
Ну или посмотреть в сторону других компонентов (Indy, например)...

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог