功能描述:基于套接字实现对服务器内文件的远程访问,并具备简易文件的传输功能,
开发及硬件组成:Linux,pc 机,arm 开发板
项目具体介绍:项目采用多进程的方式,可同时为多个客户端进行服务,服务端可通过获取客户端的指令,服务端根据客户端相应的指令执行相关命令;其指令功能如下:
1.展示服务端文件内有哪些文件 LS
2.展示服务器当前目录所在位置 PWD
3.可进入服务端相关文件夹访问 CD
4.获取服务端上的文件 GET
5.上传文件到服务端 PUT
6.查看本地文件 ls
7.查看本地文件所在目录 pwd
服务端:
服务端代码
#include "server.h"
/*****************服务端***************/
void sig_handler(int signum)
{
if(signum == SIGCHLD)
waitpid(-2,NULL,WNOHANG);
}
int main(int argc,char *argv[])
{
void msg_handler(int fd,MSG msg);
signal(SIGCHLD,&sig_handler);
/************服务端套接字的初始化***********/
int s_fd = -1;int b_reuse = 1;
int newfd = -1;
struct sockaddr_in sin;
struct sockaddr_in cin;
if((s_fd = socket(AF_INET,SOCK_STREAM,0)) < 0)
{
perror("socket");
exit(-1);
}
setsockopt(s_fd,SOL_SOCKET,SO_REUSEADDR,&b_reuse,sizeof(int));//允许地址快速重用
bzero(&sin,sizeof(sin));
sin.sin_family = AF_INET;
sin.sin_port = htons(SERVER_PORT);
sin.sin_addr.s_addr = htonl(INADDR_ANY);
if(bind(s_fd,(struct sockaddr *)&sin,sizeof(sin)) < 0)
{
perror("bind");
exit(-1);
}
if(listen(s_fd,BACKLOG) < 0)
{
perror("listen");
exit(-1);
}
printf("server is starting...\n");
socklen_t len = sizeof(cin);
while(1)
{
if((newfd = accept(s_fd,(struct sockaddr *)&cin,&len)) < 0)
{
perror("accept");
continue;
}
printf("client:ip:port < %s:%d> connecting...\n",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port));
int n_read = -1;
MSG msg;
/******************连接的客户端*****************/
if(fork() == 0)
{
while(1)
{
do
{
bzero(&msg,sizeof(msg));
n_read = read(newfd,&msg,sizeof(msg));
}while(n_read < 0 && errno == EINTR);
if(n_read < 0)
{
perror("read");
continue;
}
if(!n_read)
{
printf("client fd: %d quit\n",newfd);
break;
}
msg_handler(newfd,msg);//指令分析
}
close(newfd);
exit(-1);
}
}
return 0;
}
/**************命令转换 方便处理 ********/
int cmd_analysis(MSG msg)
{
if(strstr(</