Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

возникает ошибка: Asynchronous socket error 10053 [D7, WinXP]


Sergl ©   (2007-09-27 22:36:00) 

Хочу отправить файл через сокет:

на сервере:

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 10:37:00) [1]


> Блин... два дня убил на это


И еще минимум столько же убьешь)

Грабли-то, судя по коду, продолжают иметь место быть)

Обрати самое серьезное внимание на то, что метод ReceiveBuf является функциональным, а не процедурным.


Sergl   (2007-09-28 10:27:00) [2]


> Сергей М. ©   (28.09.07 10:12) [6]
> > SendStream не может вызвать такой ошибки.Пардон, ошибка
> возникает из-за того, что обработав на клиентской стороне
> одно-единственное событие OnRead ты тут же закрываешь соединение.
>

Спасибо еще раз! Все... вопросов, пока, больше не имею.

ЗЫ.Блин... два дня убил на это.... однакож цель оправдывает средства:)


Сергей М.   (2007-09-28 10:12:00) [3]


> SendStream не может вызвать такой ошибки.


Пардон, ошибка возникает из-за того, что обработав на клиентской стороне одно-единственное событие OnRead ты тут же закрываешь соединение.


Сергей М.   (2007-09-28 10:05:00) [4]


> ругается:"Asynchronous socket error 10053"


SendStream не может вызвать такой ошибки.


Sergl   (2007-09-28 10:01:00) [5]


> Сергей М. ©   (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:00:00) [6]


> Чем и когда я испоганил Buf.


Испоганил ты эту переменную вызовам метода ReceiveBuf, не разыменовав переменную указательного типа Buf.


Sergl   (2007-09-28 09:25:00) [7]

С первой access violation все ясно, а со второй нет...

> Потому что содержимое переменной Buf ты испоганил в этой
> строчке:> ClientSocket1.Socket.ReceiveBuf(Buf, Len);

Чем и когда я испоганил Buf...не понимаю...?


Сергей М.   (2007-09-28 08:44:00) [8]


> asd.free;//здесь возникает ошибка Access violation


Справку-то читал по SendStream ?


> FreeMem(Buf);//Здесь возникает ошибка Access violation


Потому что содержимое переменной Buf ты испоганил в этой строчке:


> ClientSocket1.Socket.ReceiveBuf(Buf, Len);


Наверх

Титульная страница Поиск, карта сайта Написать письмо