TCP ftp服务器模型 《超经典》

网络协议FTP、TCP 网络协议FTP、TCP (仅作为个人笔记,如有雷同,请联系删除。。)   1、FTP:文件传输协议。   由两个部分组成:FTP服务器 + FTP客户端。   FTP服务器用来存储文件,用户可以在FTP客户端通过FTP协议访问位于服务器上的资源。   使用端口:默认使用tcp端口中的20、21端口。     20端口:用于传输数据,     21端口:用于传输控制信息。       2、TCP协议:   TCP报文:TCP首部 + 数据部分 TCP首部:默认长度20字节,加上选项部分,最长可达60字节   阅读详情
//header.h
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>
#include <sys/types.h>       
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <errno.h>
#include <dirent.h>

#define BUFFERSIZE 1024

typedef struct sockaddr SA;


//服务器端
#include "header.h"

void ProcessList(int connfd);
void ProcessGet(int connfd, char buf[]);
void ProcessPut(int connfd, char buf[]);

void ProcessList(int connfd)
{
	char buf[BUFFERSIZE];
	DIR *mydir;
	struct dirent *myitem;

	mydir = opendir(".");
	while ((myitem = readdir(mydir)) != NULL)
	{
		if ((strcmp(myitem->d_name, ".") == 0)
        || (strcmp(myitem->d_name, "..") == 0))
		  continue;
		strcpy(buf, myitem->d_name);
		send(connfd, buf, BUFFERSIZE, 0);
	}
	closedir(mydir);

	return;
}


void ProcessGet(int connfd, char buf[])
{
	int fd, nbyte;

	if ((fd = open(buf+1, O_RDONLY)) < 0)
	{
		fprintf(stderr, "fail to open %s : %s\n", buf+1, strerror(errno));
		buf[0] = 'N';
		send(connfd, buf, BUFFERSIZE, 0);
		return;
	}

	buf[0] = 'Y';
	send(connfd, buf, BUFFERSIZE, 0);
	while ((nbyte = read(fd, buf, BUFFERSIZE)) > 0)
	{
		send(connfd, buf, nbyte, 0);
	}
	close(fd);

	return;
}


void ProcessPut(int connfd, char buf[])
{
	int fd, nbyte;

	if ((fd = open(buf+1, O_WRONLY|O_CREAT|O_TRUNC, 0666)) < 0)
	{
		printf("fail to create %s on server\n", buf+1);
		return;
	}

	while ((nbyte = recv(connfd, buf, BUFFERSIZE, 0)) > 0)
	{
		write(fd, buf, nbyte);
	}
	close(fd);

	return;
}


int main(int argc, char *argv[])
{
	int listenfd, connfd;
	char buf[BUFFERSIZE];
	struct sockaddr_in server_addr;

	if ((listenfd = socket(PF_INET, SOCK_STREAM, 0)) < 0)
	{
		fprintf(stderr, "fail to socket : %s\n", strerror(errno));
		exit(-1);
	}
#ifdef _DEBUG_
	printf("socket is %d\n", listenfd);
#endif

	memset(&server_addr, 0, sizeof(server_addr));
	server_addr.sin_family = PF_INET;
	server_addr.sin_port = htons(8888);
	server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
	if (bind(listenfd, (SA *)&server_addr, sizeof(server_addr)) < 0)
	{
		perror("fail to bind");
		exit(-1);
	}

	listen(listenfd, 5);

	while ( 1 )
	{
		if ((connfd = accept(listenfd, NULL, NULL)) < 0)//等待客户端连接
		{
			perror("fail to accept");
			break;
		}
		recv(connfd, buf, BUFFERSIZE, 0);    //第一步收到客户端的业务请求
		switch (buf[0])
		{
			case 'L' :
				ProcessList(connfd);
				break;
			case 'G' :
				ProcessGet(connfd, buf);
				break;
			case 'P' :
				ProcessPut(connfd, buf);
				break;
		}
		close(connfd);
	}

   return 0;
}

//客户端
#include "header.h"

void PrintHelp();
void ProcessList(struct sockaddr_in server_addr);
void ProcessGet(struct sockaddr_in server_addr, char command[]);
void ProcessPut(struct sockaddr_in server_addr, char command[]);

void PrintHelp()
{
	printf("help : display help info\n");
	printf("list : get file list of server\n");
	printf("get  : get <file>\n");
	printf("put  : put <file>\n");
	printf("quit : quit the client\n");

	return;
}


void ProcessList(struct sockaddr_in server_addr)
{
 	int sockfd, nbyte;
	char buf[BUFFERSIZE]; //设置成局部变量可以互不影响

	if ((sockfd = socket(PF_INET, SOCK_STREAM, 0)) < 0)
	{
	 	printf("fail to list\n");
		return;
	}

	if (connect(sockfd, (SA *)&server_addr, sizeof(server_addr)) < 0)
	{
		printf("fail to connect server\n");
		goto ERROR_1;
	}

	strcpy(buf, "L");       //第一步要告诉服务器客户端需要干嘛
	send(sockfd, buf, BUFFERSIZE, 0);
	while ((nbyte = recv(sockfd, buf, BUFFERSIZE, 0)) != 0) //0放送方式 通常为0
	{
		printf("%s\n", buf);
	}

ERROR_1:
	close(sockfd);

	return;
}


void ProcessGet(struct sockaddr_in server_addr, char command[])
{
	int sockfd, nbyte, fd;
	char buf[BUFFERSIZE];

	if ((sockfd = socket(PF_INET, SOCK_STREAM, 0)) < 0)
	{
		printf("fail to get\n");
		return;
	}

	if (connect(sockfd, (SA *)&server_addr, sizeof(server_addr)) < 0)
	{
		printf("fail to connect server\n");
		goto ERROR_2;

	}

	sprintf(buf, "G%s", command+4);
	send(sockfd, buf, BUFFERSIZE, 0);
	recv(sockfd, buf, BUFFERSIZE, 0);
	if (buf[0] == 'N') // no such file
	{
		printf("No such file on server\n");
		goto ERROR_2;
	}

	if ((fd = open(command+4, O_WRONLY|O_CREAT|O_TRUNC, 0666)) < 0)
	{
		printf("fail to create local file %s\n", command+4);
		goto ERROR_2;
	}

	while ((nbyte = recv(sockfd, buf, BUFFERSIZE, 0)) > 0)
	{
		write(fd, buf, nbyte);
	}
	close(fd);

ERROR_2:
	close(sockfd);

	return;
}


void ProcessPut(struct sockaddr_in server_addr, char command[])
{
	int sockfd, fd, nbyte;
	char buf[BUFFERSIZE];

	if ((sockfd = socket(PF_INET, SOCK_STREAM, 0)) < 0)
	{
		printf("fail to get\n");
		return;
	}

	if (connect(sockfd, (SA *)&server_addr, sizeof(server_addr)) < 0)
	{
		printf("fail to connect server\n");
		goto ERROR_3;

	}

	if ((fd = open(command+4, O_RDONLY)) < 0)
	{
		printf("fail to open %s\n", command+4);
		goto ERROR_3;
	}
	sprintf(buf, "P%s", command+4);
	send(sockfd, buf, BUFFERSIZE, 0);

	while ((nbyte = read(fd, buf, BUFFERSIZE)) > 0)
	{
		send(sockfd, buf, nbyte, 0);
	}
	close(fd);

ERROR_3:
	close(sockfd);

	return;
}


int main(int argc, char *argv[])
{
	int sockfd, fd, nbyte;
	char command[32];
	struct sockaddr_in server_addr;

	if (argc < 3)
	{
		printf("Usage : %s <server_ip> : <port>\n", argv[0]);
		exit(-1);
	}

	// XXX:step 1  int socket(int domain, int type, int protocol);
	if ((sockfd = socket(PF_INET, SOCK_STREAM, 0)) < 0)
	{
		fprintf(stderr, "fail to socket : %s\n", strerror(errno));
		exit(-1);
	}
#ifdef _DEBUG_
	printf("socket is %d\n", sockfd);
#endif

	// XXX:step 2  int connect(int sockfd, const struct sockaddr *serv_addr, socklen_t addrlen);
	memset(&server_addr, 0, sizeof(server_addr));
	server_addr.sin_family = PF_INET;
	server_addr.sin_port = htons(atoi(argv[2]));
	server_addr.sin_addr.s_addr = inet_addr(argv[1]);
	//server_addr.sin_addr.s_addr = htonl(INADDR_ANY);

	while ( 1 )
	{
		printf("<client> ");
		fgets(command, 32, stdin);
		command[strlen(command)-1] = '\0';      // overwrite the '\n'需要减一
		if (strcmp(command, "help") == 0)
		{
		   PrintHelp();
		}
		else if (strcmp(command, "list") == 0)
		{
			ProcessList(server_addr);
		}
		else if (strncmp(command, "get ", 4) == 0)
		{
			ProcessGet(server_addr, command);
		}
		else if (strncmp(command, "put ", 4) == 0)
		{
			ProcessPut(server_addr, command);
		}
		else if (strcmp(command, "quit") == 0)
		{
			printf("Bye\n");
			break;
		}
		else
		{
			printf("wrong command, 'help' for command list\n");
		}
	}

   return 0;
}


基于 TCP 协议的简易 FTP 客户端 - 服务器系统 这是一个基于FTP双连接模型的简单实现,包含客户端和服务器模块,支持核心FTP功能。系统采用分层设计,包括公共工具层(common)、客户端层(ftclient)和服务器层(ftserve)。客户端实现用户交互、命令发送和数据接收;服务器处理连接、认证和命令执行。关键技术包括:FTP协议规范的双连接模型、网络字节序转换、子进程并发处理、基于文件的认证机制。整体架构清晰,实现了FTP的核心功能,适合教学和简单应用场景。 阅读详情

相关推荐

FTP协议模型及工作流程

介绍FTP协议模型及工作流程,主动模式(PORT)连接建立过程,被动模式(PASV)连接建立过程

计算机网络 简单FTP客户端软件的实现

简单FTP客户端软件的实现。 文件传送协议FTP(File Transfer Protocol)是TCP/IP体系的一个重要协议,它采用Internet标准文件传输协议FTP的用户界面,向用户提供了一组用来管理计算机之间文件传输的应用程序。FTP是基于客户—服务器(C/S)模型而设计的,在客户端和FTP建立两个TCP连接。

Mi-ronin的博客 4160

ftp服务器c源码

纯c写的ftp服务器源码,可以方便的移植到stm32等单片机上面

文件传输协议--FTP

一.FTP模型 FTP client在客户端提供了一个user interface,这是用户使用FTP系统进行文件操作的接口。在user interface下,用户可以使用user command进行文件操作。user command和Linux command非常像。在后续会有介绍。 Client PI全名为Client Protocol Interpreter,作用是进行user command和FTP command的转化(两者的区别可以看作是源代码和机械码、ASCII形式的域名和二进制形式的

weixin_46345928的博客 1002

网络课程设计文件传输协议的简单实现FTP(包含客服端服务器端程序C#和实验报告)

文件传送协议是一种最基本的应用层协议按照客户/服务器的模式进行工作,提供交互式的访问,是INTERNET使用最广泛的协议之一。文件传输协议的简单设计与实现建立在计算机网络实验环境TCP/IP 网络体系结构之上,使用socket 编程接口编写两个程序,分别为客户程序(client)和服务器程序(server)

FtpNio服务器模型

java nio实现ftp上传下载功能的功能,目前只实现了upload和download已经ls功能。

FTP文件传输协议

FTP工作在TCP/IP模型的应用层,基于的传输协议是TCP,FTP客户端和服务器之间的连接是可靠的,面向连接的,为数据的传输提供了可靠的保证。 FTP的主要特征: 1.控制连接是建立在客户协议解释器和服务器协议解释器之间用于交换命令与应答的通信链路。 2.数据连接是传输数据的全双工连接。传输数据可以发生在服务器数据传输过程DTP和客户DTP之间,也可以发生在两个服务器的DTP之间。 文件类型: 1.ASCII码文件类型(默认选择),以NVT ASCII码形式通过数据连接传输; 2.EBCDIC文件类型。该

Silence_001的博客 1008

LTspice仿真报错Timestep too small?5种实测有效的解决方法(附详细参数配置)

本文针对LTspice仿真中常见的“Timestep too small”报错,提供了5种经过实测有效的解决方案。从理解错误根源入手,详细介绍了调整求解器、仿真参数、优化精度容差、设置初始条件、为理想元件添加寄生参数以及使用高级指令等具体方法,并附有详细的参数配置步骤,帮助工程师快速定位并解决仿真收敛问题,提升电路设计效率。

weixin_29213655的博客 279

FTP两种工作模式介绍

http://blog.chinaunix.net/uid-372384-id-2413918.html http://my.oschina.net/binny/blog/17469 1.主动FTP模式 最初的FTP规范中使用的就是传统的主动模式的FTP。在这种模式下,客户端从一个临时端口(大于1024的端口号)连接到FTP服务器的命令控制端口(端口21),当客户端准备好传输数据时,

qq100440110的专栏 3万+

避坑指南:C#调用CodeSoft打印标签时常见的5个错误及解决方法

本文总结了C#调用CodeSoft打印标签时常见的5个核心错误及解决方案,涵盖环境配置、模板加载、变量赋值、打印机切换和资源管理。重点解析了如何避免COM对象创建失败、模板路径错误、变量名不匹配、打印机切换异常及内存泄漏等问题,帮助开发者实现稳定高效的标签打印集成。

weixin_29215815的博客 223

【IIC通信】Chap.1(I2C)IIC通信原理、IIC读写时序详解

IIC通信以两根连线SDA、SCL实现了完善的全双工同步数据传送, 可以方便地构成多机系统和外围器件扩展系统。

Jie_MSD的博客 2万+

网工日记:FTP工作模式

【代码】网工日记:FTP工作模式。

2402_86034383的博客 582

手把手教你用Simulink搭建交流异步电机矢量控制模型(附完整仿真文件)

本文提供了一份详细的Simulink仿真指南,手把手教你从零开始搭建交流异步电机矢量控制模型。内容涵盖主电路搭建、坐标变换实现、双闭环PI调节器设计、转子磁链观测器调试等核心步骤,并附有完整的仿真文件,帮助读者跨越理论到实践的鸿沟,掌握高性能电机控制系统的建模与仿真技能。

pz890123的博客 665

ftp服务器默认使用tcp协议的几号端口,ftp服务器默认的tcp端口号

ftp服务器默认的tcp端口号 内容精选换一换OBSBrowser+是一款用于访问和管理对象存储服务的图形化工具,支持通过配置内网DNS服务器地址的方式,使在华为云上的Windows ECS通过内网直接访问OBS,下面将介绍具体其操作流程和操作步骤。登录华为云,在页面右上角单击“控制台”,进入“管理控制台”页面。在打开的控制台首页,选择计算弹性云服务器。选择待登录的云服务器,登录弹FTP/SFT...

weixin_33375360的博客 6019

Buck电路中自举电容串联小电阻的作用

在Buck电路中,自举电容(Cboot)驱动高边MOSFET时,因寄生电感和电容会形成LC谐振回路,导致SW节点高频振铃,引发EMI问题。串联小电阻(Rboot)可引入阻尼效应,抑制振铃、改善波形和EMI性能,但会略微增加开关损耗。设计时建议预留可调电阻位(2Ω~20Ω),根据实测结果平衡效率与系统稳定性,提升电源可靠性。这一措施是优化开关电源EMC的常见实践。

硬核科技 624

FlexSim:FlexSim软件介绍与安装

在开始安装FlexSim之前,首先需要从FlexSim官方网站下载安装包。FlexSim提供不同版本的软件,包括教育版、专业版等,确保选择适合您需求的版本。下载页面通常会列出系统要求,包括操作系统、处理器、内存和硬盘空间,确保您的计算机满足这些要求。访问FlexSim官方网站。导航至下载页面。选择适合您需求的FlexSim版本。点击下载按钮,开始下载安装包。在开始构建模型之前,首先需要明确模型的目标。模型目标是指导模型设计和分析的核心,它定义了你希望通过模型解决的问题或探索的系统行为。

kkchenjj的博客 5802

FTP服务器是什么意思?FTP服务器怎么搭建?

FTP服务器是什么意思? FTP服务器(File Transfer Protocol Server)是在互联网上提供文件存储和访问服务的计算机,它们依照FTP协议提供服务,FTP是File Transfer Protocol(文件传输协议),顾名思义,就是专门用来传输文件的协议,简单地说,支持FTP协议的服务器就是FTP服务器 FTP是用来在两台计算机之间传输文件,是Internet中应用非常广泛的服务之一,它可根据实际需要设置各用户的使用权限,同时还具有跨平台的特性,即在UNIX、Linux和Wi

PAINzw的博客 1万+

Avalonia+ReactiveUI跨平台路由:从零到舞者,你的UI也能跨界起舞?

至此,你已掌握了Avalonia+ReactiveUI的跨平台路由精髓!你的应用现在能够优雅地在各个界面间穿梭,就像是在不同星球间跳跃的宇宙飞船。无论是初探跨平台开发的新手,还是经验丰富的老船长,这段旅程都能让你的UI编排技能更上一层楼。现在,是时候让世界见证你的跨平台魔术了!💫记住,每一次实践都是向着完美编舞迈进的一步,勇敢地在你的项目中尝试吧!如果在航行中遇到风暴,别忘了回来看看这篇指南,或者在评论区抛出你的救生圈,我们一起解决!🌊。

java专栏 1534

TCP、HTTP、FTP

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档。

qq_65920848的博客 890

C++ int转四字节数组

字节转换

我不是码农的博客~~~ 972

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

计算机网络——FTP网络服务器

目录 一、实验目的与要求 二、实验内容与方法 三、实验步骤与过程 一、实验目的与要求 学习安装、使用FTP服务器软件和FTP客户端软件,掌握基本的FTP传输数据的控制方式,能对FTP协议数据包抓取并进行分析。 实验环境: 使用Windows操作系统;Internet连接 FTP服务器软件 Xlight FTP客户端软件 FlashFXP 抓包软件Wireshark。 二、实验内容与方法 FTP服务器软件和客户端软件的安装和使用、掌握FTP传输控制方式、抓取FTP协议...

上山打老虎的博客 1万+

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

FTP服务器的原理

在我们平时上网的过程中,一般都是使用FTP的客户端对商家提供的服务器进行访问(上传、下载文件),例如我们微软的SkyDrive网盘,115网盘等。 FTP介绍 FTP文件传输协议(File Transfer Protocol),用于Internet上的控制文件的双向传输,是一个应用程序。工作在TCP/IP协议族的应用层,其传输层协议是TCP协议,目的在于提高文件传输的共享性和可靠性,是基于...

ZWE7616175的博客 1万+

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

ftp用的是tcp还是udp_TCP/IP模型

有了上面的解释,对于TCP/IP模型理解就不是很难了,下图作为OSI的“进阶”模型对比就很有说服力了。8‑2 TCP/IP模型和OSI参考模型对比OSI参考模型为什么被弃用呢?主要是它的分层过于细致,以至于使用网络的体系结构变得臃肿复杂,这和TCP/IP协议对比,也就一目了然了。还是以发送邮件为例,下面图示的结果一目了然。下面具体的介绍一些关于TCP/IP概念:TCP/IP是一个协议族,...

weixin_39916379的博客 2340

ftp服务器响应很慢,有果必有因:FTP传输速率慢和TCP窗口、网络时延的因果案例...

本文要点:对于TCP协议来说,通信双方一次只能传输TCP窗口大小的数据,然后等待接收方确认,等到确认完毕后才能传输下一段窗口大小的数据。因此TCP协议的传输速率,取决于TCP传输窗口的大小和网络转发性能(带宽和时延)。一、组网二、问题描述网络中的服务器均使用千兆网线接入交换机,网络两端的服务器之间的FTP正常传输速率可达100MB/s以上。用户在网络中新增两台S9500E IRF2堆叠设备作为新核...

weixin_39540271的博客 8014

Linux学习应用篇——搭建FTP服务器(超全面+详细!)

本文总结了如何在Linux系统上搭建FTP服务器,以及使用Windows系统和LInux系统作为客户端进行匿名用户连接和本地用户连接的过程;内容包括FTP概述、FTP的配置文件和常见配置方式、FTP服务器连接实验、常见报错原因和解决方法以及常用FTP命令和FTP应答码分析。发布于此供大家交流学习!

lonelypasserby的博客 5352
上一篇: 并发服务器 典型模型
下一篇: 广播,组播的实现
MrBugYang
博客等级 码龄18年 21粉丝 35原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值