FTP编程问题

cslxj 2009-04-25 11:12:53
下面有一个完整的FTP程序,本人想使其在客户端输入文件名时,不需要输入路径(只输入文件名称)。请问该如何修改下面的代码,谢谢!

服务器端代码:
#include "WinSock.h"
#include "windows.h"
#include "stdio.h"
#pragma comment(lib,"wsock32.lib")

#define RECV_PORT 2000
#define SEND_PORT 3000
#define MAX_FILESIZE 32*1024

SOCKET sock, sock1;
sockaddr_in ServerAddr;
sockaddr_in ClientAddr;

struct Filedata
{
char ffname[30];
char ffdata[MAX_FILESIZE];
int len;
} DataPacket;

int Addrlen;

DWORD StartSock()
{
WSADATA WSAData;
if(WSAStartup(MAKEWORD(2,2),&WSAData)!=0)
{
printf("sock init fail!\n");
return (-1);
}
return(1);
}

DWORD CreateSocket()
{
sock=socket(AF_INET,SOCK_STREAM,0);
if(sock==SOCKET_ERROR)
{
printf("sock create fail!");
WSACleanup();
return(-1);
}
ServerAddr.sin_family = AF_INET;
ServerAddr.sin_addr.s_addr = htonl(INADDR_ANY);
ServerAddr.sin_port = htons(RECV_PORT);
if(bind(sock,(struct sockaddr*)&ServerAddr,sizeof(struct sockaddr_in))==SOCKET_ERROR)
{
printf("sock bind error code!");
return(-1);
}
return(1);
}

DWORD WriteFile(char * fname,char * fdata,int flen)
{
int i;
FILE * fp;
fp = fopen(fname,"w");
if(fp==NULL)
printf("cannot open this file\n");
i=0;
for( i=0; i<flen; i++)
fputc(fdata[i],fp);
fclose(fp);
return(1);
}

DWORD ConnectProcess()
{
Addrlen = sizeof(sockaddr_in);
if(listen(sock,5)<0)
{
printf("Listen error");
return(-1);
}
printf("Listening....\n");
for(;;)
{
sock1=accept( sock, (struct sockaddr FAR*)&ClientAddr, &Addrlen);
for(;;)
{
memset( DataPacket.ffname, 0, 30);
memset( DataPacket.ffdata, 0, MAX_FILESIZE);
DataPacket.len = 0;
if(recv(sock1, (char*)&DataPacket, sizeof(DataPacket),0)<=0)
break;
printf("Has received file:%s,length is %d",DataPacket.ffname,DataPacket.len);
WriteFile(DataPacket.ffname,DataPacket.ffdata,DataPacket.len);
printf("\n");
}
}
}

int main()
{
if(StartSock() == -1)
return(-1);
if(CreateSocket() == -1)
return(-1);
if(ConnectProcess() == -1)
return(-1);
return(1);
}

客户端代码:
#include "WinSock.h"
#include "windows.h"
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#pragma comment(lib,"wsock32.lib")

#define RECV_PORT 2000
#define SEND_PORT 3000
#define MAX_FILESIZE 32*1024

SOCKET sock;
sockaddr_in ServerAddr;

struct Filedata
{
char ffname[30];
char ffdata[MAX_FILESIZE];
int len;
} DataPacket;

DWORD StartSock()
{
WSADATA WSAData;
if(WSAStartup(MAKEWORD(2,2),&WSAData)!=0)
{
printf("sock init fail!\n");
return (-1);
}
ServerAddr.sin_family = AF_INET;
ServerAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
ServerAddr.sin_port = htons(RECV_PORT);
return(1);
}

DWORD CreateSocket()
{
sock = socket(AF_INET,SOCK_STREAM,0);
if(sock == SOCKET_ERROR)
{
printf("sock create fail!");
WSACleanup();
return(-1);
}
return(1);
}

void CallServer()
{
CreateSocket();
while(connect(sock,(struct sockaddr*)&ServerAddr,sizeof(ServerAddr))==SOCKET_ERROR)
printf("Connect...\n");
}

DWORD GetFile(char * fname)
{
int i;
FILE *fp;
int Filesize;
int count,
total=0;
char buffer[100];
char Senddata[MAX_FILESIZE];

fp=fopen(fname,"r");
if(fp==NULL)
{
printf("cannot open this file\n");
return(0);
}

i = 0;
Filesize = 0;
memset( Senddata, 0, MAX_FILESIZE);
while(!feof(fp))
{
count = fread(buffer,sizeof(char),100,fp);
if(ferror(fp))
{
printf("read file error");
break;
}
Filesize += count;
if(Filesize>MAX_FILESIZE)
{
printf("your file is too big\n");
fclose(fp);
return(0);
}
memcpy(&Senddata[i],buffer,count);
i+=count;
}

fclose(fp);
Senddata[i] = '\0';
strcpy( DataPacket.ffname, fname);
memcpy( DataPacket.ffdata, Senddata, Filesize);
DataPacket.len = Filesize;
printf("%s %d\n",DataPacket.ffname,DataPacket.len);
return(1);
}

DWORD TCPSendPacket(struct Filedata Packet)
{
int length;
length = send( sock, (char *)&Packet, sizeof(DataPacket), 0);
if(length<=0)
{
printf("send Filedata error\n");
closesocket(sock);
WSACleanup();
return(-1);
}
return(1);
}

int main()
{
char sendfilename[30];
StartSock();
CallServer();
printf("connect ok!\n");
while(1)
{
printf("Input your filename to send:\n");
scanf("%s",sendfilename);
if(strcmp(sendfilename,"exit")==0)
break;
if(GetFile(sendfilename)==0)
continue;
TCPSendPacket(DataPacket);
}
closesocket(sock);
return 0;
}
...全文
102 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
yyp78 2009-05-03
  • 打赏
  • 举报
回复
那里有开源代码呀?
cslxj 2009-04-27
  • 打赏
  • 举报
回复
如果我们不按接收到的地址存储,而是在服务器端自设路径存储接收到的文件,在服务器端应该怎么改呢
cnzdgs 2009-04-25
  • 打赏
  • 举报
回复
直接输入文件名就是使用当前路径,如果要使用其它路径,可以自己通过字符串处理,将路径和文件名连在一起。
顺便提一下,FTP是一个协议的名称,你的这段代码只是传输文件,并没有使用FTP协议。
wutaihua 2009-04-25
  • 打赏
  • 举报
回复
你这个不知道支不支持多用户的。但是针对每一个用户都有其单独的默认当前路径。只有当用户发出跳转的指令的时候,才会将当前路径改变。你可以看看成品的开源客户端,都是有一个默认的路径的,这属于用户的条目信息。

ftp服务器在创建的时候,需要写默认路径的,这个假设为 c:\source

假设申请了一个用户A。其在申请的时候,就需要指定其访问的权限根目录,根据其访问权限的设置,最高权限可以访问c:\source。如果针对不同的用户,有不同的路径,也可以让其只访问自文件夹, c:\source\UserA;

用户在登陆的交互过程中,首先登陆成功后,就会返回用户的目录(假设A为普通权限,获得了c:\source\UserA),这时候,用户输入了一个文件名NAMEA 。其实际的路径应该为c:\source\UserA\nameA(路径的拼装是由代码来完成的)
blackcat242 2009-04-25
  • 打赏
  • 举报
回复
什么意思?什么叫只输入文件名?
blackcat242 2009-04-25
  • 打赏
  • 举报
回复
要传输一个文件,肯定要一个文件全路径,只输入文件名也只能获取当前的路径下面的文件。

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧