socket 实现的 ftp 上传有关问题
socket 实现的 ftp 上传问题
代码如下:
CString filename;
CFileFind finder;
int filelength; // 保存文件长度
BOOL bWorking = finder.FindFile( "*.jpg ");
CString str;
GetDlgItemText(IDC_EDIT1,str);
SOCKADDR_IN clisa1;
clisa1.sin_addr.S_un.S_addr = inet_addr( "192.168.1.66 ");
clisa1.sin_family = AF_INET;
clisa1.sin_port = htons(atoi(str));
connect(svrSock,(SOCKADDR*)&clisa1,sizeof(SOCKADDR));
while(bWorking)
{
// 循环取得需传送的文件名
bWorking=finder.FindNextFile();
filename=finder.GetFileName();
// 取得该文件的大小
filelength = finder.GetLength();
// //通过命令通道发送 size 命令判断服务器上是否存在该文件,如果存在取得文件大小
send(cliSock, "size " + filename + "\r\n ",strlen( "size ") + filename.GetLength() + strlen( "\r\n "),0);
char buffer1[100];
memset(buffer1,0,100);
recv(cliSock,buffer1,100,0);
CString sizestr = buffer1;
CString returncode = sizestr.Left(3);
char tempstr1[10];
memset(tempstr1,0,10);
int nCount;
CString nRest;
// 判断是否已经存在该文件
if(returncode == "213 ")
{
strcpy(tempstr1,sizestr.Mid(4));
nCount = filelength - atoi(tempstr1);
nRest = tempstr1;
}
else if(returncode == "550 ")
{
nCount = filelength;
nRest = "0 ";
}
// 需要续传
if(nCount > 0)
{
int cyclenum;
if(nCount%32768 != 0)
{
cyclenum = nCount/32768 + 1;
}
else if(nCount%32768 == 0)
{
cyclenum = nCount/32768;
}
CFile fileR(filename,CFile::modeRead|CFile::typeBinary);
char *buffer = new char[32768+1];
for(int i = 0; i < cyclenum; i++)
{
memset(buffer, 0x00, (32768+1)*sizeof(BYTE));
//通过命令通道发送命令
send(cliSock, "rest " + nRest + "\r\n ",strlen( "rest ") + nRest.GetLength() + strlen( "\r\n "),0);
memset(buffer1,0,100);
recv(cliSock,buffer1,100,0);
AfxMessageBox(buffer1);
//通过命令通道发送命令
send(cliSock, "appe " + filename + "\r\n ",strlen( "appe ") + filename.GetLength() + strlen( "\r\n "),0);
memset(buffer1,0,100);
recv(cliSock,buffer1,100,0);
AfxMessageBox(buffer1);
fileR.Seek(atoi(nRest),CFile::begin);
fileR.Read(buffer,32768);
int err = send(svrSock,buffer,32768+1,0); //通过数据通道发送数据
char tempstr[10];
代码如下:
CString filename;
CFileFind finder;
int filelength; // 保存文件长度
BOOL bWorking = finder.FindFile( "*.jpg ");
CString str;
GetDlgItemText(IDC_EDIT1,str);
SOCKADDR_IN clisa1;
clisa1.sin_addr.S_un.S_addr = inet_addr( "192.168.1.66 ");
clisa1.sin_family = AF_INET;
clisa1.sin_port = htons(atoi(str));
connect(svrSock,(SOCKADDR*)&clisa1,sizeof(SOCKADDR));
while(bWorking)
{
// 循环取得需传送的文件名
bWorking=finder.FindNextFile();
filename=finder.GetFileName();
// 取得该文件的大小
filelength = finder.GetLength();
// //通过命令通道发送 size 命令判断服务器上是否存在该文件,如果存在取得文件大小
send(cliSock, "size " + filename + "\r\n ",strlen( "size ") + filename.GetLength() + strlen( "\r\n "),0);
char buffer1[100];
memset(buffer1,0,100);
recv(cliSock,buffer1,100,0);
CString sizestr = buffer1;
CString returncode = sizestr.Left(3);
char tempstr1[10];
memset(tempstr1,0,10);
int nCount;
CString nRest;
// 判断是否已经存在该文件
if(returncode == "213 ")
{
strcpy(tempstr1,sizestr.Mid(4));
nCount = filelength - atoi(tempstr1);
nRest = tempstr1;
}
else if(returncode == "550 ")
{
nCount = filelength;
nRest = "0 ";
}
// 需要续传
if(nCount > 0)
{
int cyclenum;
if(nCount%32768 != 0)
{
cyclenum = nCount/32768 + 1;
}
else if(nCount%32768 == 0)
{
cyclenum = nCount/32768;
}
CFile fileR(filename,CFile::modeRead|CFile::typeBinary);
char *buffer = new char[32768+1];
for(int i = 0; i < cyclenum; i++)
{
memset(buffer, 0x00, (32768+1)*sizeof(BYTE));
//通过命令通道发送命令
send(cliSock, "rest " + nRest + "\r\n ",strlen( "rest ") + nRest.GetLength() + strlen( "\r\n "),0);
memset(buffer1,0,100);
recv(cliSock,buffer1,100,0);
AfxMessageBox(buffer1);
//通过命令通道发送命令
send(cliSock, "appe " + filename + "\r\n ",strlen( "appe ") + filename.GetLength() + strlen( "\r\n "),0);
memset(buffer1,0,100);
recv(cliSock,buffer1,100,0);
AfxMessageBox(buffer1);
fileR.Seek(atoi(nRest),CFile::begin);
fileR.Read(buffer,32768);
int err = send(svrSock,buffer,32768+1,0); //通过数据通道发送数据
char tempstr[10];