socket实现文件上传下载_嵌入式期末报告

上传人:沈*** 文档编号:89449682 上传时间:2022-05-13 格式:DOC 页数:21 大小:76.50KB
返回 下载 相关 举报
socket实现文件上传下载_嵌入式期末报告_第1页
第1页 / 共21页
socket实现文件上传下载_嵌入式期末报告_第2页
第2页 / 共21页
socket实现文件上传下载_嵌入式期末报告_第3页
第3页 / 共21页
点击查看更多>>
资源描述
.第一部分:移植类1一、实验目的;1二、实验内容1三、实验环境1四、实验步骤2五、实验结果与讨论3第二部分:代码类3一、实验目的3二、实验内容与要求4三、主要仪器设备4四、实验内容44.1、实验基本功能44.2主要代码编写:4、实现服务器功能的主要代码编写5、实现客户端功能的主要代码编写14五、实验内容运行结果:215.1客户端和服务端均在虚拟机linux下运行215.2 虚拟机linux运行服务端,开发板运行客户端22六、实验结果与讨论24第一部分:移植类一、实验目的;利用虚拟机,在redhat linux下编译一个能在开发板上成功运行的应用软件二、实验内容在嵌入式Linux中移植一个能播放U盘上的mp3音频文件的应用程序MadPlay。三、实验环境Win7、虚拟机中的redhat linux四、实验步骤首先通过ftp把四个所需安装包拷贝到虚拟机的linux中,然后依次进行如下操作:1、创建工作目录:2、创建如下子目录以存放不同的源文件目录说明: tarball 目录用来存放所有的源代码包 src-x86 目录用来存放X86 版本的所有源代码文件 src-arm 目录用来存放ARM 版本的所有源代码文件 target-x86 目录是X86 版本的安装目录 target-arm 目录是ARM 版本的安装目录设置环境变量:将相关安装包拷贝到工作目录中:3、编译安装zlib-.tar.zip 配置4、然后make-make install即可5、编译安装libid3tag-b注:截图中的第一行代码后面部分为:-I$TARGET_DIR/include6、然后make-make install即可7、编译安装libmad-b 配置8、然后make-make install即可9、编译安装madplay-b 配置10、然后make-make install即可Make install 完成后,会在target-arm/bin目录生成在arm开发板上可以运行的二进制文件madplay,拷贝到user-ftp目录下;打开超级终端,连接到开发板上,在超级终端上通过ftp连接到虚拟机,然后使用get命令获取madplay和mp3文件,退出ftp,运行./madplay music.mp3”即可播放视频。五、实验结果与讨论成功播发音频文件music.mp3,并演示给老师看,但在实验结束后忘记截取了相关图像,因此结果的图像未展现。第二部分:代码类一、实验目的按照教学计划,本课程要求初步掌握嵌入式基本知识,懂得在开发板使用wince和linux基本操作,本实验是利用socket是的开发板与主机通信。二、实验内容与要求Wince/Linux平台与windows主机间使用以太网实现通信,要求在linux/wince/windows上编写一个TCP socket数据包收发程序,实现数据的通信,如实现文件发送。也可以是2个开发板间的网络通信三、主要仪器设备1、已连接网络的计算机。2、安装red hat9的虚拟机。3、装有linux的开发板四、实验内容4.1、实验基本功能在linux下用C语言编写,实现如下功能:服务器端客户端数据的上传、下载4.2主要代码编写:Linux系统下,用文本编辑器编写ftp客户端与服务器端的C语言代码,另外几个包含的头文件。下面是在ftp客户端和服务器功能实现中比较重要的代码。、实现服务器功能的主要代码编写Main主函数定义一些相关的变量等代码:int main int sockfd; int clientfd; uint16_t port; int ret; pid_t pid;struct sockaddr_in server_addr;if printf;return -1; port = atoi; server_addr.sin_family = AF_INET; server_addr.sin_addr.s_addr = INADDR_ANY;server_addr.sin_port = htons;sockfd = socket; if sockfd perror; return -1; ret = bindsockfd,&server_addr,sizeof; ifret perror; return -1; ret = listen; if ret perror; return -1; printf; while clientfd = accept; if clientfd perror; return -1; pid = fork; if pid perror; if /chid process printf; serv_client; return 0; close; 处理服务器的请求int handle_request;void serv_client msg_head_ctrl_t *msg; ssize_t size; uint32_t body_len;uint32_t total_len; int ret;fd_set fs_client; struct timeval timeout;等待服务器请求 while FD_ZERO; FD_SET; timeout.tv_sec = DEFAULT_TIME_OUT; timeout.tv_usec = 0; ret = select; if /time out printf; return ; if continue; 接收服务器的请求信息 size = recv sockfd, &body_len, sizeof, MSG_PEEK; if size printf; return ; if printf; return ; 转换网络字节为本地字节 total_len = ntohl + sizeof; msg = malloc; if printf; return ; memset; size = recv; if printf; return ; msg-body_len = ntohlbody_len; msg-command = ntohlcommand;/ printfbody_len, msg-msg_body;如果服务器出现quit 的时候就推出 if command printf; close; return ; 处理下载请求 ret = handle_request; if return; free; 处理客户端的下载int handle_get int fd; int ret; bool exist; uint32_t body_len; msg_head_ctrl_t *ack_msg; ssize_t read_bytes; ssize_t sent_bytes;检查所需下载的文件所否存在 exist = file_existmsg_body ; printfmsg_body, exist; if printfmsg_body; body_len = msg-body_len; msg-body_len = htonlbody_len; msg-command = htonl; ret = sendsockfd, msg, sizeof + body_len, 0; if sizeof + body_len != ret printf; return SOCK_ERROR; return FAILED; 传送下载数据 while read_bytes = readmsg_body, MAX_READ_BYTES; if 0 /printfbody_len; ack_msg-body_len = htonl; ack_msg-command = htonlcommand; ret = SUCCESSFUL; else if read_bytes = 0; ack_msg-body_len = 0; ack_msg-command = htonl; ret = FAILED; else if /传送完退出 ack_msg-body_len = 0; ack_msg-command = htonl; ret = SUCCESSFUL; sent_bytes = send sockfd, ack_msg, read_bytes + sizeof, 0; if sent_bytes != read_bytes + sizeof ret = SOCK_ERROR; printf; break; if body_len break; close; return ret;处理显示服务端目录内容和打印服务端路径int handle_ls_pwd FILE *file; msg_head_ctrl_t *ack_msg; size_t read_bytes; size_t ret; printfmsg_body; file = popenmsg_body, r; if printfmsg_body; return FAILED; ack_msg = mallocsizeof + MAX_READ_BYTES; if printf; return FAILED; ack_msg-command = htonlcommand ; while read_bytes = freadmsg_body,1, MAX_READ_BYTES, file; if ferror break; ack_msg-body_len = htonl; ret = sendsockfd, ack_msg, read_bytes+sizeof, 0; if read_bytes+sizeof != ret printf; return SOCK_ERROR; if feof printf; break; pclose;处理服务器的请求int handle_request char *cmd; int ret; switchcommand case COMMAND_CD: /处理cd命令 cmd = trim_all_spacemsg_body+2;/skip cd charatcer ret = chdir; if printf%s, |%s|n, strerror, cmd; break; case COMMAND_LS: case COMMAND_PWD: ret = handle_ls_pwd; break; case COMMAND_GET: ret = handle_get; break; case COMMAND_PUT: break; default: ret = FAILED; break; return ret;、实现客户端功能的主要代码编写建立套接字 sockfd = socket; ifsockfd perror; return -1; server.sin_family = AF_INET;port = atoi; server.sin_port = htons;ret = inet_pton; if ret printf; usage; return -1; 链接到服务端 ret = connectsockfd, &server,sizeof; ifret perror; return -1; printf; clinet_process; /客户端进程函数调用处理服务端信息int handle_server_ack int ret; uint32_t body_len; uint32_t total_len; msg_head_ctrl_t *msg;接受服务器端的请求 ret = recv sockfd, &body_len , sizeof, MSG_PEEK; if ret printf; exit; body_len = ntohl; total_len = body_len + sizeof; msg = malloc; if perror; return ; memset; ret = recv; if ret printf; exit; msg-body_len = ntohlbody_len; msg-command = ntohlcommand; if command | command printfmsg_body; else if command save_file_to_diskmsg_body; free;把命令传送到服务端int send_command_to_server ssize_t ret; msg_head_ctrl_t *msg; int body_len; int total_len; body_len = strlen; total_len = body_len + sizeof; msg = malloc; if printf; return FAILED; msg-command = htonl; msg-body_len = htonl; memcpymsg_body, user_input, body_len; ret = send; if ret printf; free; return SOCK_ERROR; free; return SUCCESSFUL;在客户端中下载文件功能int get_file_from_server int ret; int fd=-1; uint32_t len;fd_set fs_client; struct timeval timeout; msg_head_ctrl_t *msg; ret = send_command_to_server; if return ret; msg = mallocsizeof + MAX_READ_BYTES + 1; if printf; return FAILED; 传送下载数据 while FD_ZERO; FD_SET; timeout.tv_sec = DEFAULT_CLIENT_TIME_OUT; timeout.tv_usec = 0;select是处理多用户情况 ret = select; if /time out printf; ret = SOCK_ERROR; break; if continue; memsetmsg, 0, sizeof + MAX_READ_BYTES + 1; ret = recvsockfd, &len, sizeofbody_len, MSG_PEEK; if ret printf; ret = SOCK_ERROR; goto Exit; len = ntohl; ret = recvsockfd, msg, sizeof + len, MSG_WAITALL; if sizeof + len != ret printf; ret = SOCK_ERROR; goto Exit; msg-body_len = ntohlbody_len; msg-command = ntohlcommand; if command printf; ret = FAILED; goto Exit; if fd = open; if printfcreate file %s failed! %sn, user_input, strerror; ret = FAILED; goto Exit; /save to file ret = writemsg_body, msg-body_len; if body_len != ret printf; ret = FAILED; goto Exit; if command ret = SUCCESSFUL; goto Exit; Exit: free; if unlink; close; return ret;客户端进程函数void clinet_process fd_set fs_read; int max_sock; char buf255; int ret; max_sock = sockfd STDIN_FILENO ? sockfd : STDIN_FILENO; print_client_prompt; while FD_ZERO; FD_SET; FD_SET; if select continue; if FD_ISSET ret = handle_server_ack; if break; if FD_ISSET memset; fgets;bufstrlen-1 = 0;/delete nret = handle_user_input; if break; print_client_prompt; 打印符号void print_client_prompt printf; fflush; 由于篇幅有限,这里只是列举一些重要的源代码,其他的代码在源文件里。五、实验内容运行结果:说明:在linux系统目录/home/user-ftp下建立一个文件夹ts,tc,arm_tc(1) ts文件夹中存放编译好的server文件和服务端准备传送的文件ts.txt和arm_ts.txt(2) tc文件夹中存放编译好的client文件和客户端端准备传送的文件tc.txt(3) arm_tc文件夹中存放经交叉编译好的client文件和客户端准备传送的文arm_tc.txt5.1客户端和服务端均在虚拟机linux下运行就在虚拟机ip为192.168.10.101里,以client客户端,以server服务器端,进行此次实验。1. 在虚拟机linux目录/home/user-ftp/ts中运行服务端2. 在虚拟机linux目录/home/user-ftp/tc中运行客户端3. 在虚拟机linux目录/home/user-ftp/tc中下载文件下载文件ts.txt成功4. 在虚拟机linux目录/home/user-ftp/tc中上传文件 返回到目录ts中查看文件,文件上传不成功。截图忘了截了5.2 虚拟机linux运行服务端,开发板运行客户端在虚拟机ip为192.168.10.101里,以server服务器端;在开发板linux系统洗,一client为客户端进行此次实验。1、 在虚拟机linux目录/home/user-ftp/ts中运行服务端2、 在开发板中运行客户端3、 在开发板中下载文件下载文件ts.txt成功5. 在开发板中上传文件客户端截图服务端截图 返回到目录ts中查看文件,文件上传不成功六、实验结果与讨论在做本次实验的时候,一开始是自己用java写了一个文件传输代码,只能在虚拟机上运行,并不能在开发板上运行,后来发现不符合老师要求,参考网上代码又重新编写了C的程序,成功的在虚拟机和开发板上运行,文件查看和下载功能均实现,但不足的地方是不能实现上传功能,这部分还有待改进但是通过这次试验,也让我懂得了很多,不仅了解了linux平台上如何编译和交叉编译C、C+更让我深刻的体会到课java跨平台的好处,由于一开始是用java写的所以感触比较深。同时也让我对socket编程也有课进一步的了解。.
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 管理文书 > 施工组织


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!