![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как отправить/принять через WinSock свыше 1gb? [D6]
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]а в чем сложности, милейший? ))))