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;
}