здравствуйте делаю клиент сервер
код сервера
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 байт но не принимает само содержимое
Выложил бы архив с проектом, я б посмотрел. А так, лень копировать и думать :D