ftp 多线程下载的设计与实现

多线程FTP(1)——多线程网络通信简单实现 多线程FTP(1)——多线程网络通信简单实现 之前写了一个FTP项目,但实际上我们写的FTP项目只满足单线程——这就像是打电话一样,当一个客户端和服务端连接,其他客户端就会因为服务端占线而无法连接,必须等之前连接的客户端“挂断”才能连接通信。 就像演示的一样, 当一个客户端完成连接(比如说登录,和查看当前目录时) 另一个客户端无法完成和服务端的通信,比如说登录; 而只有在前一个客户端断开连接,服务端才会去处理后一个客户端的信息(即完成登录) 很显然,一次只满足一个用户登录并不满足我们需求,我们想要的肯 阅读详情
ftp 多线程下载的设计与实现
 

                                  
                                      国防科技大学微软俱乐部
 


FTP 协议简介

  FILE TRANSFER PROTOCOL(FTP)意为文件传输协议,用于管理计算机之间的文件传送。FTP 通常指文件传输服务。

   FTP 是 Internet 上使用非常广泛的一种通讯协议。它是由支持 Internet 文件传输的各种规则所组成的集合,这些规则使 Internet 用户可以把文件从一个主机拷贝到另一个主机上,因而为用户提供了极大的方便和收益。FTP 和其它 Internet 服务一样,也是采用客户机/服务器方式。使用方法很简单,启动FTP 客户端程序先与远程主机建立连接,然后向远程主机发出传输命令,远程主机在收到命令后就给予响应,并执行正确的命令。FTP 有一个根本的限制,那就是,如果用户未被某一FTP 主机授权,就不能访问该主机,实际上是用户不能远程登录(Remote Login)进入该主机。也就是说,如果用户在某个主机上没有注册获得授权,没有用户名和口令,就不能与该主机进行文件的传输。而 Anonymous FTP(匿名 FTP)则取消了这种限制。FTP 协议与操作系统无关,任何操作系统上的程序只要符合 FTP 协议,均可以互相传送数据。

  FTP 应用在 TCP/IP 网络体系结构中位于应用层,所使用的 FTP 协议在网络协议栈中位于 TCP 层之上,属于一种应用层协议,

•  FTP 应用

   FTP 应用采用 C/S 体系结构。客户端程序实现一个命令行或图形界面,将用户命令翻译成 FTP 命令,并发送给服务器端程序。服务器端程序响应 FTP 命令,并将操作成功与否的信息以 FTP 响应形式返回给客户端程序。双方遵守 FTP 协议,完成文件传输服务。

  常用的客户端程序有:具有图形界面的 CuteFTP、FlashGet 等软件;命令行界面的 ftp命令(windows 自带)。使用较多的服务器端程序主要有 Serv-U FTP Server、vsftpd 等。

•  FTP 常用命令

FTP 常用命令如表 1 所示:

命令

说明

USER

用户名

PASS

密码

SEST

指定文件偏移量

RETR

获取文件

STOR

上传文件

LIST

获取当前目录文件列表

TYPE

设置传输数据格式(二进制格式,字符个市)

PORT

要求服务器主动连接客户端监听端口

PASV

要求客户端监听端口并接受客户端连接请求

CWD

改变服务器当前目录

QUIT

退出

•  FTP 响应

FTP 协议规定, FTP 响应以三位数字开始,之后是具体响应信息。FTP 响应第一位数字的意义如下:

•  1:肯定预备应答,可以开始数据传输

•  2:肯定完成应答,操作成功完成

•  3:肯定中介应答,等待后续命令

•  4:操作失败,但可以稍后再试

•  5:操作失败,且不要重试

  例如,如果向已建立连接的 FTP 服务器发送命令:“SIZE test.txt”,如果当前目录存在 test.txt 文件,则服务器可能会返回“213 122220”,表示操作成功完成,test.txt 文件的大小是 122220 bytes。

•  FTP 下载文件流程

  FTP 服务端和客户端之间存在两中连接:一中用于传输 FTP 命令(命令必须由客户端主动发起),连接始终存在;另一中用于向客户端传输数据,每当要传输文件或目录文件列表信息时则建立一个数据连接,数据传输完毕立即断开。

  数据连接有两种建立方式: PORT 和 PASV。PORT 方式下,客户端监听某端口,服务器主动发起数据连接。PASV 方式下,服务器监听某端口,客户端主动发起数据连接。客户端可分别向服务器发送 PORT 或 PASV 命令指定连接模式。

  下载文件之前首先需要登陆,登陆的状态图如图 4 所示。方框表示状态,箭头表示状态变换。箭头上的字符表示客户端向服务器发送的命令或服务器相客户端返回的信息。B 表示开始状态,W 表示等待状态,E 表示出错,S 表示登陆成功。

   登陆成功后,发送 TYPE 设定数据传输格式(字符格式还是二进制方式),然后发送PORT 或 PASV 选择数据传输方式。得到成功响应或,根据返回信息与服务器建立数据连接。如果前面发送的命令均得到成功响应,则开始发送下列请求,告诉服务器准备数据。首 先发送 REST 命令(如有需要),指定开始下载的偏移量;然后发送 REST 命令指定要下载的文件。

  如果前面发送的命令均得到成功响应,则表示服务器数据准备完毕。下面需要做的是与服务建立数据连接,开始接受数据,并将接收到的数据保存在本地文件中,直到接收完毕后断开数据连接,下载完毕。

  FTP 协议本身并没有提供多线程下载的命令,但为实现多线程下载提供了可能。因为REST 命令可以指定偏移量,所以我们可以同时建立多个线程分别从不同部分开始下载,然后将下载的部分重组即可实现多线程下载。在第四部分中将详细介绍。



  本次主要任务为在读懂所提供的 FTP 客户端源代码(netkit-ftp)的基础上,添加多线程下载命令。因此,在实现多线程下载功能之前首先需要了解源代码的结构。

  源代码由标准 C 实现,可以从 ftp://ftp.uk.linux.org/pub/linux/Networking/netkit 上下载。它的注释较为详尽,层次清晰,可读性强。程序中将界面逻辑和业务逻辑分开处理,程序。

源代码共包括 11 个文件,分别是:main.c、glob.c、glob.h、cmds.c、cmds.h、cmdtab.c、ftp.c、ftp_var.h、domacro.c、pathnames.c、ruserpass.c。

   其中 glob.c、glob.h、ftp_var.h、cmdtab.c、domacro.c、pathnames.c、ruserpass.c 主要定义一些宏全局变量和全局函数。其中 cmdtab.c 定义了程序支持的所有命令及其相应函数。main.c 实现了程序的主循环,循环等待直到发现用户输入一条命令,然后将命令传递到由 cmds.c、cmds.h 实现的命令行参数处理模块。命令行参数处理模块进行参数性合法性检查,得到合法的参数后将用户请求发送到 ftp.c 实现的用户命令处理模块,最终执行用户请求。(执行过程中大多需要与 FTP 服务器进行连接)。



  多线程下载的思路是建立多个线程,同时连接到服务器,分别从文件的不同位置开始下载,然后将各自接收到的数据合并到同一个文件中。

•  需要解决的问题

需要解决的问题和相应的解决方案为:

•  各线程如何共享数据?线程最大的优点是可以方便的共享夫线程的数据,因此各线程可以通过全局变量共享数据。

•  各线程如何保持互斥 ?可通过线程锁来实现对共享变量的互斥访问。访问前加锁,访问完毕解锁。

•  怎样获得文件的大小 ?可以通过向服务器发送“SIZE”命令取得文件的大小。

•  如何将文件平均分给各个进程 ?首先将文件划分为等大小的。

•  各进程如何从指定的位置下载 ? 可以通过向服务器发送“REST”命令指定开始下载的偏移量。

•  如何将不同部分数据合并到同一文件 ?不同线程可打开同一本地文件,通过移动文件指针可实现保存文件的不同部分。

•  增加的全局变量和函数

在原来程序基础上添加的全局变量主要有:

loginuser:记录登陆的用户名

password:记录登陆用户使用的密码

downloadfile 记录要下载的文件名

localfile 记录保存的文件名

FileSize 记录文件的大小

宏 MAXTHREADNUM 定义最大允许的线程数

宏 BLOCKSIZE 定义线程下载数据的基本单位,即文件划分得块大小线程锁 lock 用于线程直线互斥访问共享变量

自定义结构 thread_data 的数组变量 threaddata,记录每个线程的数据。

结构 thread_data 定义为

struct thread_data {

pthread_t id;

/* the ID of the thread */

int number;

/* the number of the thread */

int hasbegin;

/* indicate the thread has started or not */

int fd;

/* the file description */

long start;

/* the offset of its part */

long end;

/* the end of its thread */

int errornum;

/* record the thread's error number */

};

增加的函数主要有:

void mtget(int argc, char *argv[]),主要实现参数合法性检查。

mtrecvfile(const int threadnum, char * local, char * remote ),实现多线程下载功能。

long threadfunction(char * argv),线程运行的函数,完成下载文件某部分的功能。

int ConnectFtp(char* host,int iport),连接服务器

int sendCommand( int sock, char * cmdstr),向服务器发送命令

•  实现步骤

•  在 ftp_var.h 中增加前面提到的全局变量。

•  在 cmdtab.c 中:增加变量 const char mtreceivehelp[] ="receive file byseveral threads";在全局变量 cmdtab 的初始化中增加一行: {"mtget",mtreceivehelp, 1, 1, 1, mtget, NULL, NULL }

•  在 cmds.c 中定义函数 mtget,对参数进行合法性检验。

•  在 ftp.c 中定义函数 mtrecvfile,实现多线程下载。主要工作包括:初始化记录各线程状态的变量,检验是否有建立本地文件的权限,获得下载文件的大小,并将任务合理分 配到各个线程中(将分配区间记录在变量 threaddata中),建立一定数目的线程完成下载任务。

•  在 ftp.c 中添加函数 threadfunction,添加完成下载的代码。任务分配算法。假设文件大小为 18KB,线程数为 5,BLOCKSIZE=2048,则分配过程为,首先文件按块大小分为 9 个基本单位,再将 5 个单位平均分配给 5 个线程,即每个线程完成两个基本单位(4KB,最后一个线程例外)。标号为 i 的线程的下载流程为:首先循环等待 threaddata[i-1].start 被置为一,然后继续。这样就保证了线程按顺序启动。下载任务。检查 threaddata[i].start 是否为 1,若为 1 则退出,表示其它线程正在完成本线程的任务;否则继续。通过访问全局变量获得 FTP 服务器 IP 地址和端口号,以及登陆的用户名和密码,登陆服务器。发送命令 TYPE,将数据传送方式设为二进制模式,选择被动模式,并获得服务器的数据端口,发送 REST 指定本进程开始下载的偏移量。打开本地文件,将文件指针移动到相应偏移量。与建立服务器建立数据通道,开始接收数据。下载文本线程数据后,遍历每个进程, 寻找未开始的下载的部分,尝试下载该部分。需要注意的部分:每次向服务器发送请求后,都要检查返回值,判断服务器状态是否正确,否则重试发送。访问敏感的 共享数据时,必须使用互斥锁,否则在本程序中可能会出现同一部分被下载两次的情况。

•  编译与调试

  为简化编译过程,重新编写了 MakeFile 文件,增加了-g 的编译选项,从而可使用 gdb调试目标代码;增加了使用多线程库-lpthread 的连接选项,内容如下:

EXEC = ftp

CC=cc

INCLUDES=-I

CFLAGS=-g

LIBS=-lpthread

OBJS = cmds.o cmdtab.o domacro.o ftp.o glob.o main.o ruserpass.o

all: $(EXEC)

%.o:%.c

$(CC) $(CFLAGS) -c $<

$(EXEC): $(OBJS)

$(CC) $(CFLAGS) $(LIBS) -o $@ $(OBJS) $(LDLIBS)

romfs:

$(ROMFSINST) /bin/$(EXEC)

clean:

-rm -f $(EXEC) *.gdb *.elf *.o

  调试工具选择了命令行调试工具 gdb。GDB 主要帮忙你完成下面四个方面的功能:

1、启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。

2、可让被调试的程序在指定的调置的断点处停住。(断点可以是条件表达式)

3、当程序被停住时,可以检查此时你的程序中所发生的事。

4、动态的改变你程序的执行环境。

•  进一步的改进

   按照前面设计的多线程实现方式,很容易实现增加断点下载的功能。因为在下载过程中,每个线程均有变量记录当前状态,当发现丢失与服务器的连接或被用户终 止时,将每个线程的状态保存在文件中,当再次下载是,首先从文件中载入断点,启动每个进程从断点出开始下载,直到下载完毕。

[参考文献]

•  《 UNIX Network Programming Volume1 3rd.Ed.The Sockets Networking API》Writer:W. Richard Stevens, Bill Fenner, Andrew M. RudoffPublisher:Addison Wesley

•  RFC959:FILE TRANSFER PROTOCOL(FTP)

•  《 Linux 内核分析与实例应用》代玲莉,欧阳劲 编著 国防工业出版社

多线程下载工具 Linuxdown 源代码 孔阳 上海交大

嵌入式linux基于netkit-ftp-0.17的ftp客户端移植 这两天客户需要一个在arm linux下面运行的ftp客户端,我发现我们产品上面没有所以就移植一个。在编译客户端的时候参考了网上的一些方法,并对其进行整理补充。首先在网上下载ftp客户端源文件netkit-ftp-0.17或者下载我已经下载已经加入我整理后的netkit-ftp-0.17源文件http://download.csdn.net/detail/zhitouniao/9570727。 阅读详情

相关推荐

FTP服务器和客户端

《计算机通信网络》课程项目 终期报告 题 目: FTP协议实现 组 号: 第7组 任课教师: 王瑞 FT 2019年03月01日 FTP协议实现 一.项目介绍 文件传输协议(File Transfer Protocol, FTP)是重要的应用层协议,用于Internet上控制文件的双向传输。FTP允许用户连接一台远程计算机...

qq_41960300的博客 4043

io多路复用的原理和实现_【网络】多线程和IO多路复用服务器的实现与比较

1 场景对于通信模型来说,有服务器-客户端,也有点对点或者广播等方式。对于网络来说,常用的模型是服务器-客户端,客户端主动发起请求,服务端接收请求并给予响应(request-response)。根据请求/响应的应用场景不一样,服务器有不一样的名称。获取Web页面的,称之为web服务器,使用的是http协议;获取文件的,称之为FTP服务器,使用ftp协议;或许自定义应用协议,定制一个专用服务器。不论...

weixin_39904522的博客 469

课程设计:用wininet接口写的FTP Client

题目1  FTP客户端 编写一个简单的FTP客户机程序,要求能够向FTP服务器发送命令,并接收FTP服务器返回的响应与数据。程序设计的具体要求如下: 1)要求实现的程序为图形化界面(如图下所示),可以输入FTP服务的相关信息(包括IP地址、用户名与密码),输出交互过程中的FTP命令与响应信息,以及从FTP服务器的根目录获得的文件(或目录)列表。 2)要求遵循RFC959的相关FTP协议规

1922

多线程实现文件上传和下载(Liunx网络编程)

客户端依次建立socket、connect,成功连接(connect)后,进入登陆阶段,程序提示登录,输入用户名和密码。如果文件存在,给客户端发送文件长度。// 参数2:要判断的内容,比如判断文件是否存在用F_OK,判断文件是否有读权限用R_OK。(3)为每个客户端分配的线程,在文件上传完毕后,可以往文件表里写入文件名、文件长度等信息。(3)如果文件存在,读取待下载的文件,将文件内容发送给服务器,每次发送1024字节。(2)读取待上传的文件,将文件内容发送给服务器,每次发送1024字节。

x_xinghua的博客 2061

Java多线程下载工具源码解析与实现

Java的多线程编程是基于Java虚拟机(JVM)提供的线程模型来实现的,它允许开发者在同一个进程中运行多个线程,以实现程序的并行处理。一个线程可以被看作是一个独立的执行路径,它有自己的调用栈、程序计数器和线程状态。通过创建多个线程,可以让程序的不同部分同时运行,从而提高程序的整体效率。Java中实现多线程的一种常用方法是继承Thread类或实现Runnable接口。Thread类提供了运行线程的底层支持,而Runnable接口是多线程编程中更为推荐的方式,因为它允许类复用线程执行代码。

weixin_35761094的博客 893

Java FTP客户端设计与实现:从基础到高级特性

Java提供了丰富的网络API,包括和类,用于实现基于TCP的网络通信。Socket类代表了一个客户端的连接,它允许我们发送和接收数据;类则用于在服务器端监听特定端口的连接请求。对于FTP客户端来说,其核心任务是通过Socket连接到FTP服务器,并发送相应的FTP命令来实现文件的上传与下载。Java网络API的应用使得这一过程变得简洁和高效。开发者不需要关心底层网络协议的细节,而是通过高层次的API来实现复杂的网络操作。// 示例代码:简单的TCP客户端Socket连接。

weixin_36019375的博客 1018

用Java实现FTP批量大文件上传下载(二)

2 上传下载 文件的上传可以分成多线程及单线程,在单线程情况下比较简单,而在多线程的情况下,要处理的事情要多点,同时也要小心很多。下面是net.sf.jftp.net.FtpConnection的上传handleUpload方法。已经考虑了单线程及多线程两种不同的类型。

ycb1689的专栏 5675

C# FTP客户端开发完整指南

文件传输协议(FTP)是互联网上使用最为广泛的文件传输标准之一,它允许网络用户在客户端和服务器之间传输文件。在C#中实现一个基础的FTP客户端,开发者需要熟悉.NET框架中的相关类库。在本章中,我们深入探讨了C# FTP客户端在代码质量和安全性方面的实践。我们学习了如何提升代码的可读性和维护性,如何通过良好的错误处理机制来构建健壮的程序,以及如何利用FTPS/SFTP提高应用程序的安全性。这些知识点对于任何希望构建稳定且安全的FTP客户端的开发者都是至关重要的。本文还有配套的精品资源,点击获取。

weixin_42181686的博客 1192

FTP多任务下载实现类

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Threadin...

bandu2576的博客 195

netkit-ftp-0.17嵌入式ftp客户端源码(加入了编译修改)

在netkit-ftp-0.17基础上加入了补丁文件netkit-ftp-0.17-cross.patch,并对glob.c及makefile文件进行修改

C# FTP下载 实例源码(网络操作)

C# FTP下载 实例源码(网络操作)

用java实现ftp的多线程下载

1:字节流结构:每次发送12+1024个字节其中,前七个字节字节表示命令第七到第十二个字节表示后面1024字节中的有效字节的长度例如一帧中前12个字节的内容为"UPFILEN00012"表示要上传文件名,文件名的长度是12。那么程序就在后面的1024个字节中去12个字节,在把它转换为字符串,作为要上传的文件名。2:命令结构Server端:DISCONN:断开连接LSFILES:发送当前目录文件列表

duanxd的专栏 8377

Windows 10错误代码解析与系统故障排除指南

操作系统错误代码是系统运行状态的直接反馈,Windows系统通过特定编码机制将故障信息转化为可识别的错误代码。从技术原理看,这些代码通常对应特定的异常处理流程,包括内存管理、驱动兼容性、文件系统等核心模块。理解错误代码对于系统维护具有重要价值,能快速定位问题根源,提高故障排除效率。在实际应用场景中,蓝屏错误(如0x0000007B)、系统升级失败(如0x80070002)和启动故障是最常见的三类问题。通过分析dump文件、使用WinDbg工具和系统内置诊断功能,可以有效解决大部分系统异常。特别是对于蓝屏错误

weixin_30516429的博客 299

Windows下FTP开发

 http://www.ietf.org/rfc.html959àFTP Protocol可以得到各种FTP命令,真正的原生态命令。 http://www.mscenter.edu.cn/zhuanti/dianziqikan/14/childpage/23.htm推荐这篇文章,《ftp 多线程下载的设计与实现》 但是,下面的链接有完整的Code。 写详细设

281

无人机芯片模块技术要点分析

恶劣环境下信号稳定性:无人机在恶劣环境下工作时,遥感系统采集的信号往往很不稳定,视频信号处理芯片需要具备强抗干扰能力,能辨别脉冲脉宽为50ns以上、幅度为0V~4.5V的输入信号。这种架构能兼顾强大的运算能力和灵活的接口控制。芯片小型化:麻省理工学院的研究人员已设计出仅20平方毫米的微型芯片,可处理无人机飞行所需的惯性数据和相机图像,为微型无人机的发展奠定了基础。光子集成芯片(PIC) :研究显示,与电子芯片相比,光子计算芯片在延迟、计算容量和能效上都有数量级的提升,有望解决当前无人机系统的计算瓶颈。

YUNZHUO666的博客 1404

JMeter脚本录制-快速上手篇

有的项目应用场景下,压测时,需要考虑带宽因素,压测不只是压测接口,静态资源也要一起压测。一般来说,静态资源比较多,如果一个个手工去写请求,是比较繁琐的,此时,可以使用Jmeter的脚本录制功能。 步骤1,创建脚本录制模版。 JMeter菜单:文件>模版,下拉选择到Recording,点击“Create”按钮; 填写录制参数: hostToRecord:填写要录制的主机域名,例如,我们这里填入:www.baidu.com schemeToRecord:填写要录制的模式,例如,htt...

软件测试大叔 5734

python上传文件到ftp服务器_FTP 文件上传下载(Python实现)

FTP 服务器1.功能1.分为服务器和客户端两部分,要求启动服务端可以有多个客户端进行连接操作2.客户端可以选择文件库中的文件进行下载3.客户端可以上传本地文件到文件库2.技术分析1.TCP+多线程2.判断普通文件:os.path.isfile()3.查看文件列表:os.listdir()4.os 模块方法实例:os.path.isfile(’/home/tarena/a.py’)#判断是否为普通...

weixin_39574555的博客 1492

ESP8266 + MQTT :如何实现 LED 灯的远程控制

MQTT 是轻量级的、灵活的物联网消息交换和数据传递协议,致力于为 IoT 开发人员实现灵活性与硬件/网络资源的平衡。 NodeMCU 是一个开源的物联网平台。它使用 Lua 语言编程。该平台基于eLua开源项目,底层使用ESP8266 sdk 0.9.5版本。 在此项目中我们将实现 NodeMCU(ESP8266) 与 EMQ X Cloud 运营和维护的免费公共 MQTT 服务器远程控制 LED 灯,并使用 Arduino IDE 来对 NodeMCU ESP8266 进行编程。 EMQ X Cloud

emqx_broker的博客 3357

开源libcurl 实战: FTP 高级下载功能实现:断点续传、分片下载与批量处理

之前用Qt开发时用Qt4 QFtp,在使用中发现诸多不便,比如等等。因此萌生了用libcurl替代的想法,以下是主要的技术路线和实现细节供参考。

Maryhuan的博客 955

论文阅读4——一种宽频带圆极化微带天线的设计

论文阅读——一种宽频带圆极化微带天线的设计(现在才觉得开始弄懂了一点,懂了一点之后又更糊涂了……)

weixin_64612422的博客 2317

4、分布式发电系统中用于改善电能质量的有源、无源和混合滤波器

本文探讨了分布式发电系统中,尤其是光伏(PV)系统运行过程中引入的电能质量问题,并分析了有源滤波器、无源滤波器及混合滤波器在改善电能质量方面的应用。文章详细介绍了光伏系统的建模、最大功率点跟踪(MPPT)技术,以及谐波、电压波动等技术问题,同时对各类滤波器的拓扑结构和控制方法进行了系统性总结。通过仿真实例比较了不同滤波器在减少谐波方面的效果,为实际工程应用提供了参考依据。

transformer2023的博客 90

基于Java实现的一个FTP服务

本文实现了一个基于Java的FTP与Web服务器系统,支持TCP/UDP协议的文件传输及HTTP网页访问,具备多线程非阻塞处理能力。系统包含FTP服务器、客户端及Web服务器,满足文件查看、上传、下载等需求,注重响应速度、稳定性和可维护性。项目以锻炼网络编程与系统设计能力为目标,采用Eclipse开发环境,遵循良好编码规范,提供完整用例与接口设计。资源可通过优快云链接下载。

毕业作品网站 2591

SAP 固定资产采购简介

SAP 固定资产采购是指企业通过采购流程获取长期使用并记录为固定资产的物品。固定资产是企业为长期使用而购置的资产,如机器设备、办公设备、建筑物、车辆等,通常这些资产的使用期限较长,并且在资产负债表上记录。在SAP系统中,固定资产采购流程通常与物料管理(MM)模块和固定资产管理(FI-AA)模块相结合。这个过程涉及从需求的提出、采购订单的创建,到货物接收、发票校验和资产激活的多个步骤。

我小时候很黑的博客 1731

实现简单的FTP多线程下载和上传

常想在园子里写点什么东西,但每当提笔,便已觉得肤浅,不敢写出来怡笑大方。对于各位战斗在软件第一线的道友们来说,本人只能算得上是一个业余选手,也许连业余也算不上。始终很自卑,觉得跟大家的水平相差太远。一直以来,对计算机都非常有兴趣,中专毕业以后,通过书籍和网上学了些皮毛。说来惭愧,中专三年,玩了三年游戏,严格地说,只能算是初中毕业。当年的愿望是希望能够从事软件相关的工作,无奈,学历低,专业也...

weixin_33755847的博客 501

4D毫米波雷达天线设计

多种天线布局方案介绍、天线设计要点介绍

5735

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

上一篇: 开源软件新时代:55个经典开源Windows工具
下一篇: 项目管理-软件价值估计
lostown
博客等级 码龄21年 6粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值