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

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

Как отправить/принять через WinSock свыше 1gb? [D6]


Страницы:   1 2

NikNet ©   (2005-08-14 17:06:00) 

У кого есть готовый код?


NikNet   (2005-08-15 03:15:00) [21]

В  общем, у меня между сервером и клиентом передача идет таким образом:

SERVER:

    Case NumCmd of
       0010 :  //  Вывести сообщение от администратора
        Begin
          MessageBox(hWnd,’Администратор запретил использовать эти ф-ций!’);
          SendSock(ConSock,Coompress(’0010Ok’));
        End;
    end;


CLIENT:
    Data   := Uncompress(RecvData);       //Uncompress(RecvData)  =  0010Ok
    NumCmd := StrToInt(copy(Data,1,4));  
    Param  := Copy(Data,5,Length(Data)-4);
     Case NumCmd of
         0010:
           Begin
                IF Param =’Ok’ Then
               ShowMessage(‘Сообщение было отправлено’);
           End;
     end;
    Caption:=IntToStr(NumCmd)+'-'+IntToStr(Length(Param));


NikNet   (2005-08-15 02:01:00) [22]

Alexander Panov ©   (15.08.05 01:41) [13]
Точно так же, как и меньше мегабайта.


а как? покажите пример?
Между WinSock - SERVER и ClientSocket1 - Client?
Плизззз кому не составит труда...


Alexander Panov   (2005-08-15 01:41:00) [23]

NikNet ©   (15.08.05 0:33) [12]

Точно так же, как и меньше мегабайта.


NikNet   (2005-08-15 00:33:00) [24]

Люди хлтя бы покажите вобще как эти данные(свыше 1mb) передавать?


NikNet   (2005-08-15 00:19:00) [25]

#9
Передаётся огромный зашифрованый/сжатый блок
который оптимизированый!!! ЕСТЬ СИМВОЛЫ КОТОРЫЕ
Сокеты передают очень быстро!!!  

Вот этот блок и надо по кусочкам передать
через WinSock!

#10
А на клиенте есть кучу наворотов!!!


забыл [кто-то зарегил мой ник]   (2005-08-14 20:46:00) [26]

А почему не реализовал клиент и сервер единообразно?


забыл [кто-то зарегил мой ник]   (2005-08-14 19:44:00) [27]

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


NikNet   (2005-08-14 19:24:00) [28]

Да вот не могу  отправить свыше одного гига  карочи надо сделать две
процедуры и  ф-ций  которые бы  принимали,/отправляли данные
и все это  для  WinSock!

Client использует TClientSocket
А Сервер на чистом API(WinSock)

Сервер должен передать данные (НЕ ФАЙЛ) размером 1gb
А Клиент должен принять их и выводить на экран или файл.

В общем, оптимизацию я предусмотрел! Так  есть один алгоритм
быстрой передачи  данных…   Как с этим поконьчу скину.

Вот, в общем, то проблема как  это реализовать.


atruhin   (2005-08-14 19:03:00) [29]

За такой код поубивавбы! Сотри его и не вздумай смотреть! В чем проблема то? Какая разница отправить 100 байт или 100 гб? При правильно написаном алгоритме ни какой. Чтобы помочь с кодом, скажи хоть что используешь, кмпоненты, winsock ...


NikNet   (2005-08-14 18:03:00) [30]

Кстати данные сжымаются так что всякие оконцовки не пройдут  :(


NikNet   (2005-08-14 18:02:00) [31]

Вот вобщем нашол но не фига непонил 8(

function wait_n_receive(ConServer:TSocket):string;
 var
   str,res:shortstring;
   tmp:cardinal;
   bsiz:Cardinal;
label z;
begin
 str:='';
 res:='';
 tmp:=gettickcount;
 repeat
 z: bsiz:=recv(conserver,str[1],255,0);
   if bsiz=-1 then
   begin
      bsiz:=wsagetlasterror;
      if bsiz=WSAEWOULDBLOCK then
      begin
       res:='e!'#13;
       break;
       continue;
      end else  break;
end;
   setlength(str,bsiz);
   res:=res+str;
   if not connected then break;
   if tmp+40000 <= gettickcount then break;
   if res='' then goto z;
 until res[length(res)]=#13;
 setlength(res,length(res)-1);
 result:=res;
end;
(*
function wait_n_recvbuf(var b; siz:integer):integer;
var s:integer;
   tmp:cardinal;
begin
 s:=0;
 tmp:=gettickcount;
 repeat
   bsiz:=recv(conserver,pointer(longint(@b)+s)^,siz,0);
   if bsiz=-1 then begin
     bsiz:=wsagetlasterror;
     if bsiz<>WSAEWOULDBLOCK then break;
     continue;
   end;
   if not connected then begin result:=0; exit; end;
   if tmp+60000<=gettickcount then break;
   s:=s+bsiz;
 until s=siz;
 result:=s;
end;

procedure sendfile(conserver:TSocket; fn:string);
var f:file;
   buf:array[0..65535]of char;
   fs,cnt:longint;
   numread:integer;
   s:string;
begin
 AssignFile(f,fn);
 {$I-}
 Reset(f,1);
 {$I+}
 if ioresult<>0 then
 begin
 //senderror;
 exit;
 end;
 fs:=filesize(f);
 s:='sending?'+IntToStr(fs)+#13;
 send(ConServer,s[1],length(s),0);
 begin closefile(f); exit; end;
 Begin
   closefile(f);
   exit;
 end;
 cnt:=0;
{  setwindowtext(mainwin,'Repeat Start');}
 repeat
   blockread(f,buf,8192,numread);
   send(conserver,buf,numread,0);
   cnt:=cnt+numread;
   if wait_n_receive(conserver) <> 'n!' then
   begin closefile(f); exit; end;
 until cnt>=fs;
 closefile(f);
end;


NikNet   (2005-08-14 17:41:00) [32]

Да мне бы типа SendLong и  RecvLong!

Просто я много  всякой ерунды наделал в проге
а все заново лень даи ещё вдруг что-то не так
сделаешь и все потом думаю  что там не так :(

А код примерно у меня такой
     0003 : Beep(Param);
     0006 : ChatEnd(Param);
     0007 : ChatID(Param);
     ...

и лист кода весит около 28kb вот и не охото все менять...


panov   (2005-08-14 17:31:00) [33]

http://www.delphimaster.ru/cgi-bin/forum.pl?n=4&search=WinSock


tesseract   (2005-08-14 17:15:00) [34]

нареж кусками поменьше да и посылай


забыл [кто-то зарегил мой ник]   (2005-08-14 17:10:00) [35]

а в чем сложности, милейший? ))))


Страницы:   1 2

Наверх

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