基于socket的ftp实现
来源:互联网 发布:qq堂有mac 编辑:程序博客网 时间:2024/06/06 00:36
服务器端的实现:
#include <sys/types.h>
#include <sys/socket.h>
#include<netinet/in.h>//sockaddr_in等结构的定义
#include<netdb.h>//addrinfo等结构的定义
#include <stdio.h>
#include <unistd.h>
#include <dirent.h>
#include <string.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#define TRUE 1
#define LISTEN_PORT 3499
#define dataLen 1024
char currentDirPath[200];
char currentDirName[30];
char help[]="get get a file from server\n\
put upload afile to server\n\
pwd display the current directory of server\n\
dir displaythe files in the current directory of server\n\
cd change thedirectory of server\n\
? display thewhole command which equals 'help'\n\
quit return\n";
char *getDirName(char *dirPathName);
void cmd_pwd(int sock);
void cmd_dir(int sock);
void cmd_cd(int sock,char *dirName);
void cmd_cdback(int sock);
void cmd_help(int sock);
void cmd_get(int sock,char*fileName);
void cmd_put(int sock,char *fileName);
int main(int argc,char *argv[])
{
int sock,sockmsg, length,lengthmsg;
char client_cmd[10] ,cmd_arg[20];
struct sockaddr_inserver;
struct sockaddr_inservermsg;
int datasock,msgsock;
pid_t child;
// intdatasock; //data socket
int rval;
sock=socket(AF_INET,SOCK_STREAM,0);//创建流式套接字
sockmsg=socket(AF_INET,SOCK_STREAM,0);
if(sock<0||sockmsg<0)
{
perror("opening stream socket");
exit(1);
}
server.sin_family=AF_INET;//AF_INET针对internet,另一种形式AF_UNIX只能够用于单一的Unix系统进程通信(主机通信协议)
server.sin_addr.s_addr=INADDR_ANY;//表示可以和任何主机通信
server.sin_port=htons(LISTEN_PORT);//htons将短整形数据转换位网络字节顺序
servermsg.sin_family=AF_INET;
servermsg.sin_addr.s_addr=INADDR_ANY;
servermsg.sin_port=htons(LISTEN_PORT+1);
if (bind(sock,(struct sockaddr*)&server,sizeofserver)<0||bind(sockmsg,(struct sockaddr*)&servermsg,sizeofservermsg)<0)//将本地端口与socket返回的文件描述符绑定在一起
{
perror("binding stream socket");
exit(1);
}
length=sizeof server;
lengthmsg=sizeofservermsg;
if (getsockname(sock,(structsockaddr*)&server,&length)<0||getsockname(sockmsg,(structsockaddr*)&servermsg,&lengthmsg)<0)//用于得套接口的名字
{
perror("getting socket name");
exit(1);
}
printf("Socket port #%d %d\n",ntohs(server.sin_port),ntohs(servermsg.sin_port));
memset(currentDirPath,0,sizeof(currentDirPath));//将currentDirpath置零
getcwd(currentDirPath,sizeof(currentDirPath));//得到当前路径,保存在currentDirPath中
listen(sock,2);//监听,允许最大监听数位2,将绑定的套接字变成监听套接字
listen(sockmsg,2);
do
{
datasock = accept(sock,(structsockaddr*)0,(int*)0);//接受请求
msgsock =accept(sockmsg,(struct sockaddr*)0,(int*)0);
if (datasock ==-1||msgsock==-1)
perror("accept");
else
{
if((child=fork())==-1)//创建子进程
{
printf("Fork Error!\n");
}
//The child process
if(child==0)
{
printf("connection accepted! new clientcomming\n");
loop:
memset(client_cmd,0,sizeof(client_cmd));
rval=0;
rval=read(msgsock,client_cmd,sizeof(client_cmd));//从msgsock中读取数据到client_cmd
if(rval<0)
#include <sys/types.h>
#include <sys/socket.h>
#include<netinet/in.h>//sockaddr_in等结构的定义
#include<netdb.h>//addrinfo等结构的定义
#include <stdio.h>
#include <unistd.h>
#include <dirent.h>
#include <string.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#define TRUE 1
#define LISTEN_PORT 3499
#define dataLen 1024
char currentDirPath[200];
char currentDirName[30];
char help[]="get
put
pwd
dir
cd
?
quit
char *getDirName(char *dirPathName);
void cmd_pwd(int sock);
void cmd_dir(int sock);
void cmd_cd(int sock,char *dirName);
void cmd_cdback(int sock);
void cmd_help(int sock);
void cmd_get(int sock,char*fileName);
void cmd_put(int sock,char *fileName);
int main(int argc,char *argv[])
{
loop: