Re: winsock, TransmitFile

From
Andrew Ryazanov ()
To
Dmitry Kalinin ()
Date
2001-10-22T21:50:04Z
Area
SU.WINDOWS.NT.PROG
From: "Andrew Ryazanov" <rash@land.ru>

Dmitry Kalinin <Dmitry.Kalinin@p43.f5.n5009.z2.fidonet.org> wrote in
article <1003767122@p43.f5.n5009.z2.ftn>...
> Привет All!
> 
>     TransmitFile не работает под Win98, хотя под NT2000/4.0 работает без
> проблем. Как это исправить? Все это выполняется в потоке (Thread).
>     { Открытие файла для отправки }
Никак. Написно же Requires Windows Sockets 1.1 or later. A
Microsoft-specific extension. Not supported on Windows 95.
Я в свое время обнаружив этот факт, просто написал эквивалент этой функции,
вот он:
(s - это сконнекченный TCP сокет, f - хендл файла)
function TransmitFile(s:TSocket;f:HFILE):BOOLEAN;
var i:DWord;
buf:array[1..1024] of byte;
readed,trail,fsize:DWord;
begin
 Result:=true;
 SetFilePointer(f,0,NIL,FILE_BEGIN);
 fsize:=GetFileSize(f,NIL);
 for i:=1 to trunc(fsize/Sizeof(buf)) do
  begin
    ZeroMemory(@buf,sizeof(buf));
    ReadFile(f,buf,sizeof(buf),readed,NIL);
    if winsock.send(s,buf,sizeof(buf),0)=SOCKET_ERROR then
     begin
       result:=false;
       exit;
     end;
  end;
 {И хвост}
 if (trunc(fsize/Sizeof(buf))*sizeof(buf))<fsize then
  begin
   trail:=fsize-(trunc(fsize/Sizeof(buf))*sizeof(buf));
   ZeroMemory(@buf,sizeof(buf));
   ReadFile(f,buf,trail,readed,NIL);
   if winsock.send(s,buf,trail,0)=SOCKET_ERROR then
     begin
       result:=false;
       exit;
     end;
 end;
end;


--- ifmail v.2.15dev5
 * Origin: Demos online service (2:5020/400)