Форум: "Сети";
Текущий архив: 2008.07.27;
Скачать: [xml.tar.bz2];
Внизвозникает ошибка: Asynchronous socket error 10053 Найти похожие ветки
← →
Sergl © (2007-09-27 22:36) [0]Хочу отправить файл через сокет:
на сервере:
procedure Tserver_glav_form.Button1Click(Sender: TObject);
var asd:Tmemorystream;
begin
asd := TMemoryStream.Create;
asd.LoadFromFile("c:\1.txt");
asd.Position:=0;
if (serversocket1.Socket.Connections[0].Connected) then begin
if serversocket1.Socket.Connections[0].SendStream(asd) then showmessage("ушло") else showmessage("не ушло");
end else showmessage("false");
asd.free;//здесь возникает ошибка Access violation
end;
на клиенте:
procedure Tclientglav_form.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
var asd:tmemorystream;
len:integer;
buf:pointer;
begin
Len:=Socket.ReceiveLength;;
GetMem(Buf, Len+1);
asd:=TMemoryStream.Create;
asd.Position:=0;
ClientSocket1.Socket.ReceiveBuf(Buf, Len);
asd.WriteBuffer(buf, Len);
asd.Position:=0;
asd.SaveToFile(PChar("c:\000.txt"));
asd.Free;
FreeMem(Buf);//Здесь возникает ошибка Access violation
clientsocket1.Socket.Close;
end;
Объясните, пожалуйста, как исправить ошибки?
PS. тестирую на одном компе. В итоге файл сохраняет:)
← →
Сергей М. © (2007-09-28 08:44) [1]
> asd.free;//здесь возникает ошибка Access violation
Справку-то читал по SendStream ?
> FreeMem(Buf);//Здесь возникает ошибка Access violation
Потому что содержимое переменной Buf ты испоганил в этой строчке:
> ClientSocket1.Socket.ReceiveBuf(Buf, Len);
← →
Sergl © (2007-09-28 09:25) [2]С первой access violation все ясно, а со второй нет...
> Потому что содержимое переменной Buf ты испоганил в этой
> строчке:> ClientSocket1.Socket.ReceiveBuf(Buf, Len);
Чем и когда я испоганил Buf...не понимаю...?
← →
Сергей М. © (2007-09-28 10:00) [3]
> Чем и когда я испоганил Buf.
Испоганил ты эту переменную вызовам метода ReceiveBuf, не разыменовав переменную указательного типа Buf.
← →
Sergl © (2007-09-28 10:01) [4]
> Сергей М. © (28.09.07 08:44) [1]
> > asd.free;//здесь возникает ошибка Access violationСправку-
> то читал по SendStream ?> FreeMem(Buf);//Здесь возникает
> ошибка Access violationПотому что содержимое переменной
> Buf ты испоганил в этой строчке:> ClientSocket1.Socket.ReceiveBuf(Buf,
> Len);
Спасибо! Нужно было писать
ClientSocket1.Socket.ReceiveBuf(Buf^, Len);
asd.WriteBuffer(buf^, Len);
Теперь возникла вот такая проблема: если посылаю файл больше 8192byte`а
то прога тоже ругается:"Asynchronous socket error 10053" Я так полагаю нужно где-то настроить размер передаваемых вайлов? А вот где я не знаю.
← →
Сергей М. © (2007-09-28 10:05) [5]
> ругается:"Asynchronous socket error 10053"
SendStream не может вызвать такой ошибки.
← →
Сергей М. © (2007-09-28 10:12) [6]
> SendStream не может вызвать такой ошибки.
Пардон, ошибка возникает из-за того, что обработав на клиентской стороне одно-единственное событие OnRead ты тут же закрываешь соединение.
← →
Sergl © (2007-09-28 10:27) [7]
> Сергей М. © (28.09.07 10:12) [6]
> > SendStream не может вызвать такой ошибки.Пардон, ошибка
> возникает из-за того, что обработав на клиентской стороне
> одно-единственное событие OnRead ты тут же закрываешь соединение.
>
Спасибо еще раз! Все... вопросов, пока, больше не имею.
ЗЫ.Блин... два дня убил на это.... однакож цель оправдывает средства:)
← →
Сергей М. © (2007-09-28 10:37) [8]
> Блин... два дня убил на это
И еще минимум столько же убьешь)
Грабли-то, судя по коду, продолжают иметь место быть)
Обрати самое серьезное внимание на то, что метод ReceiveBuf является функциональным, а не процедурным.
Страницы: 1 вся ветка
Форум: "Сети";
Текущий архив: 2008.07.27;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.007 c