Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Сети > передача файла с использованием Socket


Автор: FuntikPIG 5.11.2010, 21:48
Пишу программу для передачи файлов по сети на VS 2008 с использованием сокетов.
При тестировании на одном компе все нормально, но при передачи по сети происходит потеря данных
Отправку осуществляю с использованием функции send, прием recv. 

Автор: Sartorius 5.11.2010, 21:50
На вскидку - что то с таймингом. Код стесняешься показать?  smile 

Автор: FuntikPIG 5.11.2010, 22:07
да пробовал ставить Sleep различный чет ниче не вышло дельного, а код собстно вот он

вот прием
Код

dr2=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
int ii=bind(dr,(SOCKADDR*)&addrFdr2, sizeof(addrFdr2));
int rr=listen(dr,SOMAXCONN);
int eqr=sizeof(addrFdr2);  
sF2=accept( dr2,(SOCKADDR*)&addrFdr,(int FAR *)&eqr);
   iResult = recv(sF2,recvbuf,sizeR+256,0);*/
dr2=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
int ier=1;
Sleep(5000);
ier=connect(dr2,(SOCKADDR*)&addrFdr2,sizeof(addrFdr2));
char* ruf=new char[1024];
ZeroMemory(ruf,1024);
int nomer_p=0;
//=====================================================
for( nomer_p=0;nomer_p<=(sizeR+256)/1024;nomer_p++)
{
       iResult = recv(dr2,ruf,1024,0);
        if ( iResult > 0 )
        { 
             for(int k=0;k<1024;k++)
             {if(1024*nomer_p+k>sizeR+256){break;}
                 recvbuf[1024*nomer_p+k]=ruf[k];}
             ZeroMemory(ruf,1024);
                     }
 }
   

closesocket(dr2);


вот отправка
Код

for(nomer=0;nomer<=(size+256)/1024;nomer++)
{
    for(int kk=0;kk<1024;kk++)
    { if(nomer*1024+kk>size+256){break;}
            RUF[kk]=BUF[nomer*1024+kk];
    }
    
    Sleep(1);
    send(sF2,RUF,1024,0);ZeroMemory(RUF,1024);}



Автор: FuntikPIG 6.11.2010, 20:37
сделал проверку на количество отправляемых и принимаемых байтов...чтобы в случае приема меньшего количества передача повторялась...но по прежнему происходит потеря
 
ПЕРЕДАЧА
Код

int nomer=0;bool flajok=false;char *proverkaFLAG=new char [1];proverkaFLAG[0]='f';
for(nomer=0;nomer<(size+256+dprov)/60000;nomer++)
{
    for(int kk=0;kk<60000;kk++)
    { 
            RUF[kk]=BUF[nomer*60000+kk];
    }
        
    
    do{Sleep(5);
        send(sF2,RUF,60000,0);
        int rrr=recv(sF2,proverkaFLAG,1,0);
        }
    while(proverkaFLAG[0]=='f');
proverkaFLAG[0]='f';
    ZeroMemory(RUF,60000);
}


 ПРИЕМ

Код

int nomer_p=0;char *flagpr1=new char[1];flagpr1[0]='f';char *flagpr2=new char[1];flagpr2[0]='t';bool fg=true;
//=====================================================
for( nomer_p=0;nomer_p<(sizeR+256+dp)/60000;nomer_p++)
{
      fg=true;
     do
     { if(fg==false)
          {Sleep(1);send(dr2,flagpr1,1,0);}
           iResult = recv(dr2,ruf,60000,0);
        fg=false;}
        while((iResult<60000)&&(iResult>0));
       if ( iResult > 0 )
        {   
        for(int k=0;k<60000;k++)
             { recvbuf[60000*nomer_p+k]=ruf[k];}
         ZeroMemory(ruf,60000);
         Sleep(1);
        send(dr2,flagpr2,1,0);         
                     }
 }
   

closesocket(dr2);


Автор: FuntikPIG 6.11.2010, 21:48
проблему с потерей решил...уменьшив размер отправляемого буфера...вопрос другой теперь...какой максимальны буфер можно кинуть через сокет не опасаясь потери данных???

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)