![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
возникает ошибка: 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);