在学习网络结构的知识点之后,我们可以做的小项目有很多,这里我分享一个自己实现的一个网络小项目----实现ftp协议(文件传输协议)。简单的实现从服务器中读取存在的文件名,从服务器中下载文件到当前目录,从自己的客户端实现文件上传到服务器。
1、服务器serv.c
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <pthread.h>
#include <arpa/inet.h>
#include <string.h>
#include <dirent.h>
#include <stdlib.h>
#include "commen.h"
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
struct pthread_serv_msg{
pthread_t tid;
int cli_socket;
};
void *serv_for_client(void *args)
{
int ret;
struct pthread_serv_msg *pmsg=args;
int socket = pmsg->cli_socket;
struct ftp_msg serv_msg;
while(1){
memset(&serv_msg,0,sizeof(serv_msg));
ret = recv(socket,&serv_msg,sizeof(serv_msg),0);
if(ret < 0)
{
perror("recv err");
close(socket); free(pmsg);return NULL;
}else if(ret == 0)
{
close(socket); free(pmsg);return NULL;
}
//printf("serv got serv_msg:%s\n",rxbuf);
switch(serv_msg.cmd){
case 1: //list 获取当前目录下的内容 readdir()
{
DIR *dir = opendir("./");
if(dir==NULL)
{
perror("file opendir err");
return NULL;
}
int i=0,j=0;
while(1)
{
struct dirent *rent = readdir(dir);
if(rent==NULL)
{
//for(int n=0;n<i;n++)
//{
//printf("%s\n",serv_msg.response[n]);
//}
serv_msg.len=i;
break;
}
if(strcmp(rent->d_name,".")==0 || strcmp(rent->d_name,"..")==0)
{
continue;
}
//printf("%6s :%d\n",rent->d_name,rent->d_type);
strcpy(serv_msg.response[i++