Masz i nie wracaj ;p
#define net_send(socket,buf,buflen) send(socket,buf,buflen,0)
#define net_read(socket,buf,buflen) recv(socket,buf,buflen,0)
Wysyłający:
if(nFileSize<=512)
{
char *cFileBuf=new char[nFileSize];
//file.seekg(0, ios::beg);
file.read(cFileBuf, nFileSize);
int nSend=net_send(nData, cFileBuf, nFileSize);
if(nSend>0){
cout<<"Write succeded. Wrote: "<<nSend<<"bytes"<<endl;
nRet=1;}
else{
cout<<"Write failed"<<endl;
nRet=0;}
delete[]cFileBuf;
}
else
{
int itNumber=(nFileSize/512)+1;
for(int i=0;i<itNumber;i++)
{
file.seekg((i*512),ios::beg);
if(nFileSize-(i*512)>=512)
{
char buf[512];
file.read(buf,512);
net_send(nData,buf,512);
}
else
{
int x=i*512;
int j=0;
char chr[1];
vector<char> vecBuf;
while(x<=nFileSize)
{
file.seekg(x,ios::beg);
file.read(chr,1);
vecBuf.push_back(chr[0]);
++x;
++j;
}
char *buf=new char[j];
for(int i=0;i<j;i++)
{
buf[i]=vecBuf[i];
}
net_send(nData,buf,j);
delete[] buf;
}
}
}
W powyższym kodzie użycie vectora jest niepotrzebne, coś tam pewnie można jeszcze zoptymalizować ale nie chce mi się tego poprawiać.
Odbierający:
int nRec;
ofstream file;
file.open(csFileName, ios::out | ios::binary);
for(;;)
{
char temp[512];
nRec=net_read(nData, temp, 512);
char *cFileBuf=new char[nRec];
if(nRec<0)
{
//for(int i=0;i<1024;i++){cout<<cFileBuf[i];}
DataTranReply(PRINT);
//cout<<"Data read error"<<endl;
delete[]cFileBuf;
//cout<<ftpHandle->DataHandle.nDataSock<<endl;
ftpHandle->DataHandle.nDataSock=0;
return 0;
}
else
{
for(int i=0;i<nRec;i++){cFileBuf[i]=temp[i];}
file.seekp(0,ios::end);
file.write(cFileBuf,nRec);
delete[] cFileBuf;
//cout<<"Get succeded. Got: "<<nRec<<"bytes"<<endl;
}
}