这两天在学习Linux网络编程,老师留了个小作业,就是做一个基于TCP协议的文件服务器。具体要求如下:
编写TCP文件服务器和客户端。
客户端功能:
支持如下指令:
help:显示客户端所有命令和说明。
list:先是服务器端可下载文件列表。
get filename:下载文件。
put filenme:上传文件。
quit:退出。
服务器端功能(单进程):
解析客户端指令并提供相应服务。
以下是代码:
ftp_server.c
/*
* ftp_server.c
*
* Copyright 2015 wnavy <whjwnavy@163.com>
*
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/stat.h>
#include <fcntl.h>
#include "network.h"
#define INET_NUM 8888//端口号
#define IP_ADDRESS "192.168.1.111"//IP地址
#ifndef BUFF_LEN
#define BUFF_LEN 1028
#endif
#ifndef CMD_HELP
#define CMD_HELP 11//帮助
#define CMD_LIST 22//列出所有文件
#define CMD_GET 33//下载文件
#define CMD_PUT 44//上传文件
#define CMD_QUIT 55//退出
#define CMD_ERROR -1//错误
#endif
int main(void)
{
int sockfd;//网络套接字
//初始化网络连接
sockfd = network_init(NET_SERVER, IP_ADDRESS, INET_NUM);
if(sockfd == -1)
{
perror("Network init error!");
exit(EXIT_FAILURE);
}
printf("LISTEN-ing...\n");
char RCV_BUFF[BUFF_LEN];//接收缓存
char SEND_BUFF[BUFF_LEN];//发送缓存
int cmd_result;//命令解析结果
int connectfd;//建立连接后用于通信的套接字文件
int readlen;//读取到的字节数
while(1)
{
if((connectfd = accept(sockfd, NULL, NULL)) == -1)//出错
{
perror("Connect error!\n");
break;
}
printf("Connect success!\n");
while(1)
{
//接收命令
readlen = read(connectfd, RCV_BUFF, sizeof(RCV_BUFF));
if(readlen <0)//接收出错
{
perror("Read error!\n");
break;
}
else
{
if(readlen == 0)//客户端关闭文件描述符后就会断开连接
{
printf("Welcome to use again!\nQUIT...\n");
break;
}
else
{
//printf("RECV:%s\n",RCV_BUFF);
cmd_result = ftp_cmd_analyse(RCV_BUFF);//解析命令
switch(cmd_result)
{
case CMD_ERROR:
printf("CMD_ERROR!\n");
break;
case CMD_LIST:
printf("List file:%s\n",RCV_BUFF+5);
if(ftp_putlist(connectfd, RCV_BUFF+5) == -1)
{
printf("List files error!\n");
}
else
{
printf("List files success!\n");
}
break;
case CMD_GET://客户端从服务器下载文件
printf("Put files:%s\n", RCV_BUFF+4);
if(ftp_putfile(connectfd, RCV_BUFF+4) == -1)
{
printf("Put files error!\n");
}
else
{
printf("Put files success!\n");
}
break;
case CMD_PUT://客户端上传文件到服务器
printf("Get files:%s\n", RCV_BUFF+4);
if(ftp_getfile(connectfd, RCV_BUFF+4) == -1)
{
printf("Get files error!\n");
}
else
{
printf("Get files success!\n");
}
break;
default:
break;
}
}
}
}
close(connectfd);//客户端退出,断开连接
}
close(sockfd);
return 0;
}
ftp_client.c
/*
* ftp_client.c
*
* Copyright 2015 wnavy <whjwnavy@163.com>
*
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/stat.h>
#include <fcntl.h>
#include "network.h"
#