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

matlab内读取文件目录时斜杠和反斜杠的使用

@matlab内读取文件目录时斜杠和反斜杠的使用TOC matlab内读取文件目录时,斜杠和反斜杠的使用 最近被斜杠和反斜杠弄晕了,于是总结了一下,在此和大家分享一下。 代码 clear; clc; close all; I1= imread('..\zs1.jpg'); %和代码文件夹同目录的图片 (纯反斜杠) I2= imread('../zs2/zs2.j...

weixin_44456694的博客 6571

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万+

Orange:一个基于 Python 的数据挖掘和机器学习平台

Orange是一个开源的数据挖掘和机器学习平台,采用可视化编程方式,用户可通过拖拽组件构建数据分析工作流。它支持交互式数据探索、多种机器学习算法,并允许Python脚本扩展。Orange特别适合教育和研究,提供直观的界面和丰富的可视化工具。最新版本为3.39.0,支持Windows、macOS和Linux系统。作为GPL许可的免费工具,它既能满足初学者需求,又能通过Python集成实现高级功能。

likuoelie的博客 1433

用RFSoC ZU47DR搭建软件无线电原型:从零配置Vivado到生成第一个射频信号

本文详细介绍了如何使用Xilinx RFSoC ZU47DR开发板搭建软件无线电原型系统,从Vivado环境配置到生成首个射频信号的全流程。通过整合ARM处理器、FPGA逻辑和高速ADC/DAC,该平台为通信算法验证提供了高效解决方案,特别适合SDR开发者和通信工程师快速实现原型设计。

weixin_26763955的博客 588

网工日记:FTP工作模式

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

2402_86034383的博客 582

2025使用VM虚拟机安装配置Macos苹果系统下Flutter开发环境保姆级教程--下篇

我们可以看到,目前配置基本完成了,现在有两个错,一个是Chrome没安装,这个自己安装就可以了,如果不需要WEB测试也不影响开发,另一个是Simulator还没安装,这个主要是安装的时间太长了,也就是上面的这一步。这里要注意,这个下载安装会比较慢,有的载会特别卡造成安装失败,最好的办法是挂一个VPN,保证安装完成,不过这个可以在以后单独进行安装。至此,基本的安装完毕,好多人会以为Xcode就OK了,其实还没有,我们还缺少命令行工具包,这个在安装完Flutter以后进行设置。

weixin_48803304的博客 1411

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

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

weixin_33375360的博客 6019

C++学习(四六六)Multiple parse contexts are available for this file

Note: Multiple parse contexts are available for this file. Choose the preferred one from the editor menu 参考: "Multiple parse contexts" in Qt creator | Qt ForumHi Do you use sessions? https://bugreports.qt.io/browse/QTCREATORBUG-18521 Anyway, its not.

hankern的专栏 4609

Halcon 3D视觉实战:5步将线激光高度数据转为可分析的深度图与点云

本文详细介绍了如何利用Halcon平台将线激光高度数据转换为深度图与点云的5步实战方法。通过具体代码示例和工业检测案例(如锂电池胶水测量),帮助工程师高效处理3D视觉数据,实现从原始数据到三维可视化的完整技术链路。

weixin_29039773的博客 361

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

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

PAINzw的博客 1万+

华为OD机考双机位A卷 - 开心消消乐(Java & Python& JS & C/C++ & GO )

华为OD机考双机位A卷 - 开心消消乐(OD上机考试双机位A卷)。提供在线OJ刷题。Java、C++、Python、GO语言、C语言、JavaScript题解,并提供完整思路讲解。

算法大师! 1266

TCP、HTTP、FTP

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

qq_65920848的博客 890

QT Android开发之Android端usb调试模式设置与问题解决

QT Android开发之Android端usb调试模式设置与问题解决 一.QT android开发android端usb调试模式设置 QT android开发环境搭建完成后,android设备需要打开usb调试模式才能正常连接,下面以小米ipad为例进行设置(其他手机和ipad设置方法类似) 二.小米ipad打开usb调试模式 1.设置----我的设备-----全部参数信息-----OS版本---点击这里6次以上就进入开发者模式。

热土程序园,利他愉己~ 1127

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

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

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

上山打老虎的博客 1万+

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

FTP服务器的原理

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

ZWE7616175的博客 1万+

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

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、付费专栏及课程。

余额充值