向先函
是个专业的程序开发者,学习能力较强,对技术有强烈好感;有较好的团队管理、组织和协调配合能力;有相关需求分析、与客户进行需求调研经验,具有较强的分析能力,能够配合部门经理完成项目工作量化、模块划分、任务分配,能承担功能模块的需求设计与分析、编码实现以及相关配套文档,以及对目标系统进行优化配置。
- 技术能力:
- 工作态度:
- 工作成果:
项目意向
高级软件工程师 文档工程师 软件工程师 网络工程师 互联网软件开发工程师
900元
全程集中
北京
工作经验:
擅长技能:
C++
平台工作经历
其他工作经历
公司名称
北京东方汇通教育科技有限公司
在职时间
2010-05-01 ~ 2019-01-01
职位名称
软件工程师
薪水
0/月
项目描述
软件/互联网开发/系统集成
个人职责
工作性质: 全职 职位级别: 中级职位(两年以上工作经验) 职责和业绩: 功能描述: 利用socket实现客户端与服务器之间的严密通信。
存在问题:
利用socket基本原理,解决如何建立通信间的联系?网络协议存在多种,如何建立一种通用机制以支持多种协议?操作系统支持的网络协议众多,网间进程通信如何解决多重协议的识别问题?带外数据如何处理?为保证数据的正确性,如何在网络协议中须指定网络字节顺序?如何更好地利用进程通信提供的相应机制(或IPC)(如UNIX中的管道(Pipes)、命名管道(named pipe)和软中断信号(Signals),Message Queues (消息队列),UNIX system V的消息(message)、共享存储区(Shared Memory),Sockets(套接字)和信号量(Semaphores)等)来保证正确通信?
大体方案:
服务器: 1. 打开一通信通道并告知本地主机,它愿意在某一公认地址上(周知口,如FTP为21)接收客户请求。2. 等待客户请求到达该端口。3. 接收到重复服务请求,处理该请求并发送应答信号。接收到并发服务请求,要激活一新进程来处理这个客户请求(如UNIX系统中用fork、exec)。新进程处理此客户请求,并不需要对其它请求作出应答。服务完成后,关闭此新进程与客户的通信链路,并终止。 4. 返回第二步,等待另一客户请求。5.关闭服务器。客户端: 1. 打开一通信通道,并连接到服务器所在主机的特定端口。2. 向服务器发服务请求报文,等待并接收应答;继续提出请求...... 3. 请求结束后关闭通信通道并终止。部分细节: 服务器实现是newsockid(新建进程)与客户的套接字建立相关,子进程启动后,关闭继承下来的主服务器的initsockid,并利用新的newsockid与客户通信;主服务器的initsockid可继续等待新的客户连接请求。以解决并发问题。其中采用select(输入/输出多路复用) 技术来检测一个或多个套接字的状态(读、写或错误),通过请求给定状态的套接字集合由一个fd_set结构指示,在返回时,此结构被更新,以反映那些满足特定条件的套接字的子集,同时,select()调用返回满足条件的套接字的数目等等。同时对部分函数的封装如: InitSocketsStruct: 初始化socket结构,获取服务端口号,客户程序使用。 InitPassiveSock: 初始化socket结构,获取服务端口号,建立主套接字。服务器程序使用。 QuerySocketsMsg: 查询套接字消息。SendPacket: 发送数据和RecvPacket: 接收数据等;头文件封装: SocketsMsg(套接字消息结构)包括: AcceptNum(是否接到外带数据) ReadNum(/外带等待读取连接数) ReadQueue[32](待读外来数据队列)WriteNum,WriteQueue[32]; 可以发送数据的连接数和队列 ExceptNum ExceptQueue[32](例外的连接数和队列)等。Sockets(套接字结构) : DaemonSock(主套接字)SockNum Sockets[64];(数据套接字数目和数组)fd_set readfds, writefds, exceptfds(要被检测的可读、可写、例外的套接字集合)Port(端口号)等。
学习总结:
网络通信要考虑问题挺多,并发服务器可以改善客户程序的响应速度,但它增加了系统调度的开销;重复服务器正好与其相反,要根据应用的实际情况来定。在OSI的中,通信子网(网络层及其以下各层),只提供点到点通信,没有程序或进程的概念;而传输层实现的是“端到端”通信,引进网间进程通信概念,同时也要解决差错控制,流量控制,数据排序(报文排序),连接管理等问题,为此提供不同的服务方式。Unix通过三级寻址(网络ID,主机ID和进程ID)和三路握手技术进行通信。检查差错的方法一般是采用检验“检查和(Checksum)”的方法,而保证传送无差错的方法是双方采用确认应答技术。在字节流服务中,为保证传输正确或采用有流控制的协议时,都要进行缓存。但对某些特殊的需求,如交互式应用程序,又会要求取消这种缓存。
使用技能
无
公司名称
北京创联天工科技有限公司
在职时间
2010-01-01 ~ 2010-05-01
职位名称
全职
薪水
0/月
项目描述
互联网产品/运营管理
个人职责
工作描述:
通过阅读相关文档(PLC/COM/OPC/XMT系列等中英文文档)和客户沟通完成各类驱动和天工组态监控工程(“北京机电巨成科技有限公司”的监控系统开发)。
南京朝阳仪表驱动开发和“阿尔泰嵌入式主板ARM8019”驱动开发(北京阿尔泰科技发展有限公司) :
根据“南京朝阳仪表产品驱动格式”和“阿尔泰嵌入式主板“文档开发的各类仪表驱动包括: XMT4000、 XMT3000、XMT3001, XMT4001 XMD2000等系列驱动程序和阿尔泰板块。开发过程是通过vc的“MFC AppWizard[dll]”建立驱动 然后插入新类(“CCmdTarget”),根据设备寄存器名称、地址范围,类型建立寄存器文件IDevAccess.H文件和Register.h 再修改寄存器文件,最后根据情况修改主WPD80Access.cpp文件。其中最主要的函数有六个,包括: ValidateDevAddr函数,接收并检测设备地址定义的是否正确 ;InitialComm函数,通讯口初始化(波特率、校验位、数据位、停止位、) ;CompileItem函数,接收并验证在天工中定义的寄存器名和寄存器地址是否正确;FormatCommand函数: ,形成命令祯,并将数据存到buf数组中,CommitCommand函数: ,发送FormatCommand函数中形成的命令祯并接收数据到buf数组中 AccessDevice函数,分解CommitCommand函数中接收到的数据,并将数据传给天工,最后根据指令格式编码。指令格式例如XMT3001, XMT4001: 读: 地址代号 + 52H(82)+要读参数的代号+0+0+CRC校验码。
写: 地址代号+43H(67)+要写参数的代号+写入数低字节+写入数高字节 +CRC校验码。写指令的CRC校验码: 要写的参数代号*256+67+要写的参数值+ADDR注: 每2各8位数据代表一个16位整形数,低字节在前,高字节在后等。
监控系统(北京机电巨成科技有限公司)开发:
大体实现功能: 根据文档开发驱动;使用组态开发监控工程,包括单电池报警,单电池曲线,电池组报警,电池组曲线,实时数据列表,历史数据列表,实时数据图表显示,历史数据图表显示,实时数据棒图,历史数据棒图,系统设置,自动历史记录曲线,数据导出等功能。组态实现: 改系统内置画面制作系统、实时数据库(变量词典)、报警系统、历史记录系统、配方系统、报表系统、ODBC系统、安全管理系统、程序语言、设备管理器等。天工组态开发版支持广泛的硬件设备(如各种PLC、板卡、智能仪表、智能模块、变频器等),还支持网络功能,能够重复使用。按照“点数”分为不同的规格,满足不同客户的需要。(点数是指用户所开发的工程中,在“变量词典”里定义的变量数。天工组态通过“点数”的大小来衡量用户工程的规模。)开发功能包括,数据的可读性和可写性,实时监测的报警系统,实时曲线和历史曲线(实时曲线可对数据进行实时监测),历史曲线可对数据进行历史监测,曲线有前翻、后翻、放大、缩小及打印等功能)强大的ODBC功能,报表功能等等。
OPC链接的配置(通过文档对WINDOWS XP进行电脑间链接) :
大体内容: 安装OPCServer核心组件和OPC数据访问组件;配置系统通用DCOM设置“默认身份验证级别”配置“COM 安全”选项卡;配置“访问权限”和“启动和激活权限”同时要注意相关设置如Windows安全设置(客户端的不用配置,主要设置Windows 防火墙)用户访问设置(来宾用户(客户端的不用配置)确保COM,DCOM和DHCP处于打开状态,还要开启“远程协助”和“远程桌面”(客户端的配置一样)
工作总结:
串行通信使用VC++6.0开发: ActiveX控件、Win API、MFC32位应用程序、事件驱动、非阻塞通信、多线程.;串行端口的本质功能是作为CPU和串行设备间的编码转换器,当数据从 CPU经过串行端口发送出去时,字节数据转换为串行的位,在接收数据时,串行的位被转换为字节数据。
使用技能
无
公司名称
各类实战系统(无公司)
在职时间
2009-03-01 ~ 2010-01-01
职位名称
广西英泰
薪水
0/月
项目描述
销售管理
个人职责
工作性质: 全职 职位级别: 初级职位(两年以下工作经验) 职责和业绩: 2009/3―2010/1
系统环境: windows (IDE)
开发工具: CodeBlock
项目描述: 小型企业工资管理系统
对各个员工的各种情况(名字、 年龄、性别、职位、工资状况)进行输入,可以输出,可以对于员工数据进行修改和查询;对于员工的各种情况系统还可以进行统计排名.。
设计方案: 创建了一个employee类.然后派生出四个类: manager、technician、salesman、sales manager.在派生类中定义了三个构造函数,分别是: 数据输入函数(Input),表格输出函数(Print),排序函数(Pay). 其次,在总体结构上,建立以各根菜单,用于选择各种功能. 选项1.Input(数据输入) : 定义了各个岗位的人员的类,并把每个类的人员的属性设为类中的保护成员,其中技术工的工作时间和每小时的所得为私有成员,而销售员的销售额、经理的工资和销售经理的所辖部门的销售额和其底薪设为公有成员,再依次录入。 选项2.Total(数据统计) : 根据所有类的工资算法在其所属类中定义一个函数void pay()来根据各个职位的具体情况来计算工资,并且算出的工资经过冒泡法排序. 选项3.Output(数据显示) : 通过do-while循环以及制表格和setw的使用将输入的数据和统计并排序的数据以表格的形式打印出来,销售额合计一栏宽度要大些。 选项4.Save(数据保存) : 通过函数save()来将输入的数据和统计并排序的数据进行保存. 选项5.Eixt(退出) : 利用exit来完成退出系统功能。
项目描述: 应收账目管理系统中跟踪公司借贷客户的欠款数目程序
用顺序访问文件形式实现多数商业机构的数据存储。例如,公司里可能要有工资表文件、应收账目文
件(列出客户的欠款)、应付账目文件(列出欠供应商的金额)、存货文件(列出经商的货物)和其他多种类型的文件。程序能够获取每一个客户的账号、客户名和对客户的结算额。
设计方案: 一. 创建: 一个客户的数据就构成了该客户的记录。账号在应用程序中用作记录关键字,文件按账号顺序建立和维护。范例程序假定用户是按账号顺序键人记录的(为了让用户按任意顺序键入记录,完善的应收账目管理系统应该具备排序能力)。然后把键入的记录保存并写入文件。ifstream inClientFile( "clients.dat", ios: : in ); 生成ifstream对象inClientFile,并将其与打开以便输入的文件clients.dat相关联。括号中的参数传入ifstream构造函数,打开文件并建立与文件的通信线路。 二. 输出: 打开ifstream类对象默认为进行输入,打开ifstream类对象默认为进行输入,因此下列语句: ifstream inClientFile( "Clients.dat" ); 可以打开clients.dat以便输入。和ofstream对象一样,ifstream对象也可以生成而不打开特定文件,然后再将对象与文件相连接。 程序用!inClientFile条件确定文件是否打开成功,然后再从文件中读取数据。下列语句: while inClientFile >> account >> name >> balance 三. 读取: 从文件中读取一组值(即记录)。第一次执行完该条语句后,account的值为100,name的值为"John",balance的值为24.98。每次执行程序中的该条语句时,函数都读取文件中的另一条记录,并把新的值赋给account、name和balance。记录用函数outputLine显示,该函数用参数化流操纵算子将数据格式化之后再显示。到达文件末尾时,while结构中的输入序列返回0(通常返回inClientFile流),ifstream析构函数将文件关闭,程序终止。
项目描述: (借贷查询管理系统)
使用随机访问文件形式使用借贷处理程序所需的技术实现维护银行的账目信息事务处理. 程序建立一个能够存储100个定长记录的借贷处理系统。每一条记录由账号(用作记录关键字)、姓、名和借贷金额组成。程序要能够更新、插入和删除一条记录以及能够以格式化文本形式列出所有的记录。
设计方案: 在总体结构上,实现程序以下选项功能: 选项1.调用函数textFile把所有的格式化的账号存储在文本文件print.txt中(以后可能要打印这个文件)。数textFile取一个fstream对象作为参数,用于从eredit.dat文件输入数据。函数textFile用istream成员函数read顺序文件访问方法从credit.dat输入数据。使用函数outputLine将数据输出到print.txt文件。同时textFile用istream成员函数seek保证文件位置指针在文件开头。选择了选项1后,文件accounts.txt中包含内容。选项2.调用函数updateRecord更新账号。该函数只更新已存在的记录,所以函数首先检查用户指定的记录是否为空。用istream成员函数read把记录读到结构client中,然后把成员clientaccountNumber与0比较。如果client.accountNumber为0,说明该条记录中不包含信息,因此打印出说明该记录为空的消息,然后再显示出选项菜单。如果记录中包含信息,函数utxlateR~rd用函数outputLine在屏上显示记录,并输入事务金额、计算新的结算结果以及把记录重写到文件中。选项2的典型输出如下所示。Enter account to update (1 - 100) : 37 37 Barker Doug 0.00 Enter charge (+) or payment (-) : +87.99 选项3.调用函数newRecord把新的账号添加到文件中。如果用户键人了一个已有的账号,函数newReeord显示出说明该账号已存在的消息,并再次显示出选项菜单。函数添加新记录的过程: 数据写到文件“credit dm”中。ostream的函数seekp和write用来将数据存储在文件中指定的位置。程序先用函数seekp把“put”文件位置指针指向文件中指定的位置,然后用write函数写入数据。 选项3的典型输出如下所示: Enter new account number(1 - 100) : 22 Enter lastname, firstname, balance Johnston Sarah 247.45 选项4.调用函数deleteRecord删除文件中的一条记录。提示用户输入账号,只能删除已存在的记录,如果该账号的记录为空,函数显示出账号不存在的错误消息。如果存在该账号,通过将空记录(blankClient)复制到文件中重新初始化该记录。删除记录时会显示一个消息。
系统总结:
对第一个系统,对各个部分功能进行测试后,各部分功能都很好.但是程序上缺点在于不能按照个人的意愿,只能按照固定的人数对数据进行输入,既不能多也不能少.很麻烦.一但格式输入的不正确会立即进入死循环。对第二个系统,虽然本程序非常简单,综合性非常强,由于当时对使用C++设计程序的能力还不是很熟练,所以在起初设计时非常吃力。在整个程序中,我通过使用while循环,switch语句,冒泡排序法,表格设计中的setw()以及类的定义及使用来完成程序设计,使我提高了对C++中语句的使用能力和组合能力,进一步加强了我对使用C++编程的能力。第三个系统,此程序中还有一些不足和错误,目前情况我从很多放面来修改以前的这个程序的不足!例如: 可以用STL算法的copy输出代替常规输出,可以改文件流成为字节流形式会更好些,没有使用太多算法和模本技术等等.
使用技能
无
教育经历
院校名称
广西机电职业技术学院
毕业时间
所学专业
网络技术(程序设计)
最高学历
大专
