Russian Qt Forum
Ноябрь 22, 2024, 22:54 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Проблемы с сокетом вопрос по recv  (Прочитано 3817 раз)
koldun90
Крякер
****
Offline Offline

Сообщений: 345


Просмотр профиля
« : Октябрь 15, 2015, 15:31 »

здравствуйте делаю клиент сервер


код сервера
Код
C++ (Qt)
//ÓÅÒ×ÅÒ ÎÁ ÐÏÔÏËÁÈ
#include <QCoreApplication>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <iostream>
#include <fcntl.h>
#include <pthread.h>
#include <QFile>
#include <QTime>
int i=0;
 
using namespace std;
 
//ÆÕÎËÃÉÑ ÏÂÒÁÂÏÔËÉ ÐÏÔÏËÁ ÐÏÄÁÅÍ ÆÁÊÌÏ×ÙÊ ÄÅÓËÒÉÐÔÏÒ Ó×ÑÚÁÎÎÙÊ Ó ËÌÉÅÎÔÏÍ
void* potokfunc(void* ps)  //ÎÁÞÁÌÏ ÐÏÔÏËÁ ÆÕÎËÃÉÑ
{  // ÐÏÓÌÅ ÔÏÇÏ ËÁË ËÌÉÅÎÔ ÓÏÅÄÉÎÉÌÓÑ
   i=i+1;
   int rez;
   int sc = *(int*)ps;
   sched_yield();
   char buf3[2048];
   char buf2[1000];
   memset(buf2,0,sizeof(buf2)); //ÏÞÉÝÁÅÍ ÂÕÆÅÒ
   memset(buf3,0,sizeof(buf3)); //ÏÞÉÝÁÅÍ ÂÕÆÅÒ
 
   sprintf(buf2,"%d",i);
   //cout<<"îïíåò ðáðëé="<<buf2<<endl;
   //ïôðòá÷ìñåí îïíåò ðáðëé
 
 
   sleep(2);
   rez=send(sc,buf2,strlen(buf2),0);
   if (rez>0)
   {
       printf("ÎÏÍÅÒ ÐÁÐËÉ ÕÓÐÅÛÎÏ ÏÔÐÒÁ×ÌÅÎ\n");
   }
   else
   {
       close(sc);
       return 0;
   }
 
 
   memset(buf2,0,sizeof(buf2)); //ÏÞÉÝÁÅÍ ÂÕÆÅÒ ÄÁÎÎÙÈ
   //ïôðòá÷ìñåí òáúíåò ðáðëé
   QFile e("/qqq");
   long int razmer=e.size();
   sprintf(buf2,"%d",razmer);
   //cout<<"òáúíåò ðáðëé="<<razmer<<endl;
   sleep(2);
   int rz=send(sc,buf2,strlen(buf2),0);  //ÒÁÚÍÅÒ ÆÁÊÌÁ
   if (rz>0) //
   {
       printf("ðÅÒÅÄÁÎ ÒÁÚÍÅÒ ÆÁÊÌÁ \n");
   }
   else
   {
       close(sc);
       return 0;
   }
 
   memset(buf2,0,sizeof(buf2)); //ÏÞÉÓÔÉÌÉ
   //ïôðòá÷ìñåí éíñ æáêìá
   sleep(2);
   sprintf(buf2,"%s","qqq");
 
   //cout<<"éíñ æáêìá="<<buf2<<endl;
   rz=send(sc,buf2,sizeof(buf2),0);  //ÉÍÑ ÆÁÊÌÁ
   if (rz>0)
   {
       printf("ÐÅÒÅÄÁÎÏ ÉÍÑ ÆÁÊÌÁ\n");
   }
   else
   {
       close(sc);
       return 0;
   }
 
   char *jj=QString("/qqq").toLocal8Bit().data();
   sprintf(buf2,"%s",jj);
   FILE *f=fopen(buf2,"rb");  // ÏÔËÒÙ×ÁÅÍ ÆÁÊÌ ÎÁ ÐÏÂÁÊÔÎÏÅ ÞÔÅÎÉÅ
   if (f!=NULL)
   {
       while (1)
       {
           memset(buf3,0,sizeof(buf3));  //ÂÕÆÅÒÉ ÄÌÑ ÐÒÉÅÍÁ ÄÁÎÎÙÈ
           int rez=fread(buf3,1,sizeof(buf3),f);
           if (rez>0)  // ÅÓÌÉ ÍÙ ÓÞÉÔÁÌÉ ÉÚ ÆÁÊÌÁ × ÂÕÆÅÒ
           {
                //cout<<"OTPRAVLYAEM= "<<buf3<<endl;
               rz=send(sc,buf3,rez,0);
               if (rz>0)  //ÏÔÐÒÁ×ÌÅÎÏ
               {
                   //cout<<"otpravleno= \n"<<rz<<endl;
                   razmer=razmer-rz;
                   printf("ÐÅÒÅÄÁÎÏ= %d ÂÁÊÔ\n",rz);
               }
               if (razmer==0)
               {
                   printf("×ÅÓØ ÆÁÊÌ ÏÔÐÒÁ×ÌÅÎ\n");
                   break;
               }
           }
       }
       fclose(f);
   }
   else
   {
       memset(buf3,0,sizeof(2048));  //ÂÕÆÅÒÉ ÄÌÑ ÐÒÉÅÍÁ ÄÁÎÎÙÈ
       printf("ÆÁÊÌ ÎÅ ÏÔËÒÙÔ ÄÌÑ ÞÔÅÎÉÑ \n");
   }
 
   return NULL;
}
 
 
int main(int argc, char *argv[])
{
   if (QFile("/1000ARM").exists())
   {
       system("rm -r /1000ARM");
   }
   QFile h("/logserver");
   h.remove();
   if (h.open(QIODevice::WriteOnly)==true)
   {
       h.close();
   }
 
   system("mkdir /1000ARM");
   char buf[100];
   memset(buf,0,sizeof(buf));
   struct sockaddr_in addr;
   struct sockaddr_in client;
   addr.sin_addr.s_addr=inet_addr("127.0.0.1");
   addr.sin_port=htons(6643);
   addr.sin_family=AF_INET;
 
   int fd=socket(AF_INET,SOCK_STREAM,0);   // ÓÏÚÄÁÅÍ ÓÏËÅÔ
   if (fd<0)
   {
       printf("ïÛÉÂËÁ ÓÏÚÄÁÎÉÑ ÄÅÓËÒÉÐÔÏÒÁ\n");
       return 0;
   }
   //fcntl(fd,F_SETFL,O_NONBLOCK);
   int rez=bind(fd,(sockaddr *) &addr,sizeof(addr));  //ÐÒÉ×ÑÚÙ×ÁÅÍ ÓÏËÅÔ Ë ËÏÎËÒÅÔÎÏÍÕ ÁÄÒÅÓÕ
   if (rez!=0)
   {
       printf("ïÛÉÂËÁ ÐÒÉ×ÑÚËÉ ÁÄÒÅÓÁ É ÐÏÒÔÁ Ë ÓÏËÅÔÕ\n");
       return 0;
   }
   rez=listen(fd,1000);  //ÄÁÅÍ ÐÒÁ×Ï ÓÏËÅÔÕ ÐÒÉÎÉÍÁÔØ ÓÏÅÄÉÎÅÎÉÑ
   if (rez!=0)
   {
       printf("ïÛÉÂËÁ ÐÒÉÎÑÔÉÑ ÓÏÅÄÉÎÅÎÉÊ");
       return 0;
   }
   printf("ÓÅÒ×ÅÒ ÚÁÐÕÝÅÎ ÖÄÕ ÐÏÄËÌÀÞÅÎÉÑ\n");
 
 
   int fda;
   int truefda;
   QTime t;
   t.start();
   //QFile h("/logserver");
   if (h.open(QIODevice::Append)==true)
   {
       h.write("îáþáìï òáâïôù=0");
       h.close();
   }
   while(1)
   {
       while(1)
       {
           int len=sizeof(addr);
           fda=accept(fd,(sockaddr *) &addr,(socklen_t *) &len);
           //fda=accept(fd,NULL,NULL);
           if (fda<0)
           {
               continue;  // ÅÓÌÉ ÎÅÔ ÐÏÄËÌÀÞÅÎÉÑ
           }
           else //ÅÓÔØ ÐÏÄËÌÀÞÅÎÉÅ
           {
               truefda=fda;
               break;
           }
       }
 
       printf("ÐÒÏÉÚÏÛÌÏ ÐÏÄËÌÀÞÅÎÉÅ ÓÏÚÄÁÀ ÐÏÔÏË\n");
       pthread_t tid;  //ÓÏÚÄÁÌÉ ÏÂßÅËÔ ÐÏÔÏËÁ
       int jj=pthread_create(&tid, NULL, &potokfunc, &truefda);    //ÐÅÒÅÄÁÅÍ Ó×ÑÚÎÙÊ ÆÁÊÌÏ×ÙÊ ÄÅÓËÒÉÐÔÏÒ
       int vr=t.elapsed();
       if (h.open(QIODevice::Append)==true)
       {
           h.write(QString::number(vr).toLocal8Bit());
           h.write("\n");
           h.close();
       }
       if (jj!=0)
       {
 
           printf("ÐÏÔÏË ÎÅ ÓÏÚÄÁÎ\n");
       }
       sched_yield();
 
   }
 
 
   return 0;
}

код клиента

Код
C++ (Qt)
#include <QCoreApplication>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <iostream>
#include <fcntl.h>
#include <QFile>
#include <QDir>
 
 
 
int main(int argc, char *argv[])
{
 
   char buf[100];
   char buf3[2048];
   memset(buf3,0,sizeof(buf3));
   memset(buf,0,sizeof(buf));
   int fd=socket(AF_INET,SOCK_STREAM,0);
   if (fd<0)
   {
       printf("ÏÛÉÂËÁ ÓÏÚÄÁÎÉÑ ÓÏËÅÔÁ \n");
       exit(0);
      // return 0;
   }
   struct sockaddr_in addr;
   addr.sin_addr.s_addr=htonl(INADDR_LOOPBACK);
   addr.sin_port=htons(6643);
   addr.sin_family=AF_INET;
   int rez=connect(fd,(sockaddr *)&addr,sizeof(addr));
   if (rez!=0)
   {
       printf("ÏÛÉÂËÁ ÐÒÉÓÏÅÄÉÎÅÎÉÑ Ë ÓÅÒ×ÅÒÕ \n");
       exit(0);
       //return 0;
   }
   printf("ËÌÉÅÎÔ ÚÁÐÕÝÅÎ \n");
 
 
   QString papka;
   rez=recv(fd,buf,sizeof(buf),0);  // ÐÒÉÎÉÍÁÅÍ ÎÏÍÅÒ ÐÁÐËÉ ÏÔ ÓÅÒ×ÅÒÁ  1ÐÒÉÅÍ
   if (recv>0)  //ÐÒÉÛÅÌ ÎÏÍÅÒ ÐÁÐËÉ
   {
       printf("nomerpapki=%s\n",buf);
       QDir a;
       QString ff=QString("/1000ARM/")+QString(buf);
       papka=QString("/1000ARM/")+QString(buf);
       a.mkdir(ff);
   }
   else
   {
       close(fd);
       exit(0);
       //return 0;
   }
   memset(buf,0,sizeof(buf));
   int razmer;
   //ðòéîéíáåí òáúíåò æáêìá
   rez=recv(fd,buf,sizeof(buf),0); //2ÐÒÉÅÍ
   if (rez>0)
   {
       razmer=QString(buf).toInt();
       printf("RAZMERCHIK=%d\n",razmer);
 
   }
   else
   {
       close(fd);
       exit(0);
       //return 0;
   }
 
 
   memset(buf,0,sizeof(buf));
 
 
   //ðòéîéíáåí éíñ æáêìá
   rez=recv(fd,buf,sizeof(buf),0);  //3 ÐÒÉÅÍ
   if (rez>0)
   {
       printf("imyafaila=%s \n",buf);
   }
   else
   {
       printf("éÍÑ ÆÁÊÌÁ ÎÅ ÐÏÓÔÕÐÉÌÏ");
       close(fd);
       //return 0;
       exit(0);
   }
 
//        rez=recv(fd,(char *) &buf3,sizeof(buf3),0);
//        if (rez>0)
//        {
//            printf("ÐÏÌÕÞÉÌÉ=%s\n",buf3);
 
//        }
 
   memset(buf3,0,sizeof(buf3));
 
   QString gg=papka+QString("/")+QString(buf);
   char *a=gg.toLocal8Bit().data();
   printf("IMYA_FAILA= %s\n",a);
   memset(buf,0,sizeof(buf));
   //ðòéîéíáåí óáí æáêì
   FILE *f=fopen(a,"wb");  // ÓÏÚÄÁÌÉ ÆÁÊÌÉË
   if (f!=NULL)
   {
       while(1)
       {
           int rez=recv(fd,buf3,sizeof(buf3),0);
           if (rez>0)  // ÅÓÌÉ ÄÁÎÎÙÅ ÐÏÌÕÞÉÌÉ
           {
               printf("ÞÔÏ ÐÏÌÕÞÉÌÉ= %s\n",buf3);
               int rz=fwrite(buf3,1,rez,f);  //ÞÉÔÁÅÍ ÄÁÎÎÙÅ × ÂÕÆÅÒ ÓËÏÌØËÏ ÐÒÉÎÑÌÉ
               if (rz>0)  //ÓËÏÌØËÏ ÚÁÐÉÓÁÌÉ
               {
                   printf("ÚÁÐÉÓÁÎÏ ÄÁÎÎÙÈ=%d\n",rz);
                   razmer=razmer-rz;
               }
           }
           if (razmer==0)  //×ÓÅ ÐÒÏÞÉÔÁÌÉ
           {
               printf("×ÅÓØ ÆÁÊÌ ÐÒÉÎÑÔ\n");
               break;
           }
       }
       fclose(f);
   }
   else
   {
       memset(buf3,0,sizeof(buf3));
       printf("ÆÁÊÌ ÎÅ ÍÏÖÅÔ ÂÙÔØ ÓÏÚÄÁÎ \n");
   }
   exit( EXIT_SUCCESS );
   //return 0;
}

смысл в том что после соединения клиента с сервером
сервер должен передать файл на сторону клиента
1) send-отправляет номер папки
2)send -размер файла
3)send-имя файла
4) дальше в цикле идет передача данных

Проблема в том что на стороне клиента
Код
C++ (Qt)
if (f!=NULL)
   {
       while(1)
       {
           int rez=recv(fd,buf3,sizeof(buf3),0);
почему то не рпиходят данные с содержимым файла
хотя содержимое файла "aaa"
отсылается 3 байта
а этот recv почему то принимает 900 байт но не принимает само содержимое
« Последнее редактирование: Октябрь 15, 2015, 15:38 от koldun90 » Записан
qate
Супер
******
Offline Offline

Сообщений: 1177


Просмотр профиля
« Ответ #1 : Октябрь 16, 2015, 12:59 »

а чем qt сокеты не угодили что сишные взял ?
Записан
koldun90
Крякер
****
Offline Offline

Сообщений: 345


Просмотр профиля
« Ответ #2 : Октябрь 17, 2015, 11:38 »

qt обертка
Записан
Bepec
Гость
« Ответ #3 : Октябрь 17, 2015, 12:13 »

Выложил бы архив с проектом, я б посмотрел. А так, лень копировать и думать Веселый
Записан
qate
Супер
******
Offline Offline

Сообщений: 1177


Просмотр профиля
« Ответ #4 : Октябрь 19, 2015, 09:01 »

qt обертка

обертку писали знающие люди, предусмотрели разные обработки ошибок и т.п. - сам будешь писать тоже самое ?

ой, а QString тоже обертка - чего же не char * ?

Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.168 секунд. Запросов: 23.