Модераторы: feodorv
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> передача файла с использованием Socket, происходит потеря данных 
V
    Опции темы
FuntikPIG
Дата 5.11.2010, 21:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 5.11.2010

Репутация: нет
Всего: нет



Пишу программу для передачи файлов по сети на VS 2008 с использованием сокетов.
При тестировании на одном компе все нормально, но при передачи по сети происходит потеря данных
Отправку осуществляю с использованием функции send, прием recv. 
PM MAIL ICQ   Вверх
Sartorius
Дата 5.11.2010, 21:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1568
Регистрация: 18.7.2006
Где: Ivory tower

Репутация: нет
Всего: 37



На вскидку - что то с таймингом. Код стесняешься показать?  smile 
PM MAIL ICQ   Вверх
FuntikPIG
Дата 5.11.2010, 22:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 5.11.2010

Репутация: нет
Всего: нет



да пробовал ставить 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);}




Это сообщение отредактировал(а) Олег2005 - 6.11.2010, 21:23
PM MAIL ICQ   Вверх
FuntikPIG
Дата 6.11.2010, 20:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 5.11.2010

Репутация: нет
Всего: нет



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

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);


PM MAIL ICQ   Вверх
FuntikPIG
Дата 6.11.2010, 21:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 5.11.2010

Репутация: нет
Всего: нет



проблему с потерей решил...уменьшив размер отправляемого буфера...вопрос другой теперь...какой максимальны буфер можно кинуть через сокет не опасаясь потери данных???
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0511 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.