www.pudn.com > Ftpwork > FtpSocket.cpp


#include "FtpSocket.h"
#include 
#include "String.h"

#define BLOCKSIZE  1024



BOOL FtpSocket::Send(void* buf, size_t len, int isBlock, int flag=0)	
{
	size_t sentlen=0;
	sentlen = send(socketid, buf,len,flag);
	
	if( sentlen != len)
		return FALSE;	
	
	if(isBlock == RETURN)
		return TRUE;
	else
	{	
		recv(socketid, ackbuf,1024,0);	
		if(ackbuf[0]=='a')
			return TRUE;			
		else
			return FALSE;			
	}
	
}

int 	FtpSocket::Recv(char* buf, size_t len, int isBlock, int flag=0)
{
	int 	recvnum=0;		
	recvnum=recv(socketid, buf ,len, flag);
	
	if(isBlock==BLOCK)
	{
		send(socketid,ack,strlen(ack),0);
	}	
	return recvnum;

}

//##ModelId=3DB5036E01CF
FtpSocket::FtpSocket(){
	if((socketid = socket( AF_INET, SOCK_STREAM, 0))==NULL)
	{
		perror("socket error!");		
	}
	ack[0]='a';
	ack[1]='\0';
	
}

//##ModelId=3DB5036E01D0
FtpSocket::FtpSocket(int newsocket){
	socketid = newsocket;
	ack[0]='a';
	ack[1]='\0';
}

//##ModelId=3DB5036E0229
FtpSocket FtpSocket::Accept()
{
	socklen_t len;
	int news= accept(socketid, &remoteaddr, &len);
	if(news >0)
	{
		return FtpSocket(news);
	}	
}


//##ModelId=3DB5036E0234
BOOL FtpSocket::Connect(struct sockaddr* remoteaddr)
{
	if(connect(socketid, remoteaddr,
				sizeof(struct sockaddr))==-1)
	{
		return FALSE;

	}	
	return TRUE;
}

//##ModelId=3DB5036E01E3
BOOL FtpSocket::Bind(struct sockaddr* localaddr)
{
	if( bind(socketid, localaddr,sizeof(struct sockaddr))<0)
		return FALSE;
		
	return TRUE;
}

//##ModelId=3DB5036E01ED
void FtpSocket::Listen(int maxpending)
{
	listen(socketid,maxpending);
}

//##ModelId=3DB5036E0233
void FtpSocket::Close()
{
	close(socketid);
}



//##ModelId=3DB5036E0201
BOOL FtpSocket::SendData(void* buf, size_t len, int isBlock, int flag=0)
{

	char temp[11];
	sprintf(temp, "%d",len);	
	if(Send(temp,11,BLOCK)== FALSE)
		return FALSE;
	
	int addition =1;
	if( (len % BLOCKSIZE )==0)
		addition =0;
	long loopnum = (long)(len / BLOCKSIZE)+addition;
	char  * sendbuf;
	
	sendbuf = (char*) buf;	

	for(long i = 0; i < loopnum -1; i++)
	{
		sendbuf = (char*)buf + i * BLOCKSIZE ;		
		if(Send( sendbuf, BLOCKSIZE, BLOCK) == FALSE)
			return FALSE;
	}		
	size_t offset = (loopnum -1) * BLOCKSIZE;
	sendbuf = (char*) buf + offset;	
	return	Send( sendbuf , len - offset , BLOCK);	
}

//##ModelId=3DB5036E0247
int FtpSocket::RecvData(char* buf, size_t len, int isBlock,int flag=0)
{
	char numstr[11];
	long length=0;
	long recvnum=0;
	int  counter =0;
	
	//char buffer[1100];
	
	if(Recv(numstr,11,BLOCK)==FALSE)
		return -1;
	
	String temp(numstr);
	length = temp.toLong();	
	recvnum= Recv(buf,1100,BLOCK);
	while( recvnum < length)
	{
		counter ++;
		recvnum+= Recv(buf + counter * BLOCKSIZE,1100,BLOCK);
	}
	return recvnum;
}
//##ModelId=3DB5036E01D9
FtpSocket::~FtpSocket(){
	Close();
}


//##ModelId=3DB50C980042
BOOL FtpSocket::Open()
{

}