基于套接字的实现简易文件传输的功能

本文介绍了一个基于套接字的文件传输系统,该系统允许在Linux环境下通过多进程方式为多个客户端提供服务,包括文件列表展示、路径切换、文件上传下载等功能。服务端接受客户端指令执行相应操作,如LS(列出文件)、CD(切换目录)、GET(下载文件)、PUT(上传文件)等。
摘要由CSDN通过智能技术生成

功能描述:基于套接字实现对服务器内文件的远程访问,并具备简易文件的传输功能,
开发及硬件组成: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(</
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值