1sever.c
// 服务器代码
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <dirent.h>
#include <fcntl.h>
#define N 256//文件名和命令名最长为256字节
void commd_ls(int);
void commd_get(int, char *);
void commd_put(int, char *);
int main(int arg, char *argv[])
{
int ser_sockfd,cli_sockfd;
struct sockaddr_in ser_addr,cli_addr;
int ser_len, cli_len;
char commd [N];
bzero(commd,N);//将commd所指向的字符串的前N个字节置为0,包括'\0'
if((ser_sockfd=socket(AF_INET, SOCK_STREAM, 0) ) < 0)
{
printf("Sokcet Error!\n");
return -1;
}
bzero(&ser_addr,sizeof(ser_addr));
ser_addr.sin_family = AF_INET;
ser_addr.sin_addr.s_addr = htonl(INADDR_ANY);//本地ip地址
ser_addr.sin_port = htons (8989);//转换成网络字节
ser_len = sizeof(ser_addr);
//将ip地址与套接字绑定
if((bind(ser_sockfd, (struct sockaddr *)&ser_addr, ser_len)) < 0)
{
printf("Bind Error!\n");
return -1;
}
//服务器端监听
if(listen(ser_sockfd, 5) < 0)
{
printf("Linsten Error!\n");
return -1;
}
bzero(&cli_addr, sizeof(cli_addr));
ser_len = sizeof(cli_addr);
while(1)
{
printf("server>");
//服务器端接受来自客户端的连接,返回一个套接字,此套接字为新建的一个,并将客户端的地址等信息存入cli_addr中
//原来的套接字仍处于监听中
if((cli_sockfd=accept(ser_sockfd, (struct sockaddr *)&cli_addr, &cli_len)) < 0)
{
printf("Accept Error!\n");
exit(1);
}
//由套接字接收数据时,套接字把接收的数据放在套接字缓冲区,再由用户程序把它们复制到用户缓冲区,然后由read函数读取
//write函数同理
if(read(cli_sockfd, commd, N) < 0) //read函数从cli_sockfd中读取N个字节数据放入commd中
{
printf("Read Error!\n");
exit(1);
}
printf("recvd [ %s ]\n",commd);
if(strncmp(commd,"ls",2) == 0)
{
commd_ls(cli_sockfd);
}else if(strncmp(commd,"get", 3) == 0 )
{
commd_get(cli_sockfd, commd+4);
}else if(strncmp(commd, "put", 3) == 0)
{
commd_put(cli_sockfd, commd+4);
}
else if(strncmp(commd, "rename", 6) == 0)
{
commd_rename(cli_sockfd, commd);
}
else
{
printf("Error!Command Error!\n");
}
}
return 0;
}
/*
** 实现文件的重命名
*/
void commd_rename(int sockfd, char *commd)
{
char oldName[N], newName[N];
char response[N];
// 从commd中提取旧文件名和新文件名,命令格式是"rename oldName newName"
sscanf(commd+7, "%s %s", oldName, newName);
printf("Rename From: [ %s ] To: [ %s ]\n", oldName, newName);
// 试图重命名文件