socket实现文件上传下载-嵌入式期末报告_第1页
socket实现文件上传下载-嵌入式期末报告_第2页
socket实现文件上传下载-嵌入式期末报告_第3页
socket实现文件上传下载-嵌入式期末报告_第4页
socket实现文件上传下载-嵌入式期末报告_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第一部分:移植类1一、实验目的;1二、实验内容1三、实验环境1四、实验步骤2五、实验结果与讨论3第二部分:代码类3一、实验目的3二、实验内容与要求4三、主要仪器设备4四、实验内容44.1、实验基本功能44.2主要代码编写:44.2.1、实现服务器功能的主要代码编写54.2.2、实现客户端功能的主要代码编写14五、实验内容运行结果:215.1客户端和服务端均在虚拟机linux下运行215.2 虚拟机linux运行服务端,开发板运行客户端22六、实验结果与讨论24第一部分:移植类一、实验目的;利用虚拟机,在redhat linux下编译一个能在开发板上成功运行的应用软件二、实验内容在嵌入式Linu

2、x中移植一个能播放U盘上的mp3音频文件的应用程序MadPlay。三、实验环境Win7、虚拟机中的redhat linux四、实验步骤首先通过ftp把四个所需安装包拷贝到虚拟机的linux中,然后依次进行如下操作:1、创建工作目录:2、创建如下子目录以存放不同的源文件目录说明: tarball 目录用来存放所有的源代码包 src-x86 目录用来存放X86 版本的所有源代码文件 src-arm 目录用来存放ARM 版本的所有源代码文件 target-x86 目录是X86 版本的安装目录 target-arm 目录是ARM 版本的安装目录设置环境变量:将相关安装包拷贝到工作目录中:3、编译安装z

3、lib-1.2.3.tar.zip 配置4、然后make-àmake install即可5、编译安装libid3tag-0.15.1b(注:截图中的第一行代码后面部分为:-I$TARGET_DIR/include)6、然后make-àmake install即可7、编译安装libmad-0.15.1b 配置8、然后make-àmake install即可9、编译安装madplay-0.15.2b 配置10、然后make-àmake install即可Make install 完成后,会在target-arm/bin目录生成在arm开发板上可以运行的二进制

4、文件madplay,拷贝到user-ftp目录下;打开超级终端,连接到开发板上,在超级终端上通过ftp连接到虚拟机,然后使用get命令获取madplay和mp3文件,退出ftp,运行“./madplay music.mp3”即可播放视频。五、实验结果与讨论成功播发音频文件music.mp3,并演示给老师看,但在实验结束后忘记截取了相关图像,因此结果的图像未展现。第二部分:代码类一、实验目的按照教学计划,本课程要求初步掌握嵌入式基本知识,懂得在开发板使用wince和linux基本操作,本实验是利用socket是的开发板与主机通信。二、实验内容与要求Wince/Linux平台与windows主机间

5、使用以太网实现通信,要求在linux/wince/windows上编写一个TCP socket数据包收发程序,实现数据的通信,如实现文件发送。(也可以是2个开发板间的网络通信)三、主要仪器设备1、已连接网络的计算机。2、安装red hat9的虚拟机。3、装有linux的开发板四、实验内容4.1、实验基本功能在linux下用C语言编写,实现如下功能:服务器端客户端数据的上传、下载 4.2主要代码编写:Linux系统下,用文本编辑器编写ftp客户端与服务器端的C语言代码,另外几个包含的头文件。下面是在ftp客户端和服务器功能实现中比较重要的代码。4.2.1、实现服务器功能的主要代码编写 Main主

6、函数定义一些相关的变量等代码:int main(int argc,char* argv) int sockfd; int clientfd; uint16_t port; int ret; pid_t pid; struct sockaddr_in server_addr; if ( 2 != argc ) printf("usage: command listen_portn"); return -1; port = atoi(argv1); server_addr.sin_family = AF_INET; server_addr.sin_addr.s_addr = I

7、NADDR_ANY; server_addr.sin_port = htons(port); sockfd = socket(PF_INET,SOCK_STREAM,0); if (sockfd < 0) perror("open data stream socket failed!n"); return -1; ret = bind(sockfd,(struct sockaddr *)&server_addr,sizeof(server_addr); if(ret < 0) perror("bind data socket failed!n&

8、quot;); return -1; ret = listen(sockfd, SOMAXCONN ); if( ret < 0) perror("listening data stream failed!n"); return -1; printf("正在等待客户端到链接.n"); while(1) clientfd = accept(sockfd, NULL, NULL); if( clientfd < 0) perror("accept data connection error!n"); return -1; pi

9、d = fork(); if ( pid < 0 ) perror("fork error!n"); if ( 0 = pid ) /chid process printf("one client come .n"); serv_client(clientfd); return 0; close(clientfd); 处理服务器的请求int handle_request( msg_head_ctrl_t * msg, int sockfd);void serv_client(int sockfd) msg_head_ctrl_t *msg; ssi

10、ze_t size; uint32_t body_len; uint32_t total_len; int ret; fd_set fs_client; struct timeval timeout;等待服务器请求 while(1) FD_ZERO(&fs_client); FD_SET( sockfd, &fs_client); timeout.tv_sec = DEFAULT_TIME_OUT; timeout.tv_usec = 0; ret = select(sockfd+1, &fs_client, NULL, NULL, &timeout); if

11、( 0 = ret ) /time out printf("time out.n"); return ; if ( -1 = ret ) continue; 接收服务器的请求信息 size = recv( sockfd, &body_len, sizeof(uint32_t), MSG_PEEK); if ( size< 0 ) printf("recv msg error!n"); return ; if ( size = 0 ) printf("client close the connectionn"); retu

12、rn ; 转换网络字节为本地字节 total_len = ntohl(body_len) + sizeof(msg_head_ctrl_t); msg = malloc(total_len + 1); if ( NULL =msg ) printf("malloc error!n"); return ; memset(msg, 0 , total_len+1); size = recv( sockfd, msg, total_len, 0); if ( size != total_len) printf("recv msg body failed!n")

13、; return ; msg->body_len = ntohl(msg->body_len); msg->command = ntohl(msg->command);/ printf("len = %d, msg = %sn", msg->body_len, msg->msg_body);如果服务器出现quit 的时候就推出 if ( COMMAND_QUIT = msg->command ) printf("client closed connection!n"); close(sockfd); return

14、 ; 处理下载请求 ret = handle_request(msg, sockfd); if ( SOCK_ERROR = ret ) return; free(msg); 处理客户端的下载int handle_get(msg_head_ctrl_t * msg, int sockfd) 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_exist( msg->

15、;msg_body ); printf("%s , %d", msg->msg_body, exist); if ( false = exist ) printf("File %s doesn't exist!n",msg->msg_body); body_len = msg->body_len; msg->body_len = htonl(msg->body_len); msg->command = htonl(COMMAND_NO_FILE); ret = send(sockfd, msg, sizeof(

16、msg_head_ctrl_t) + body_len, 0); if ( ( sizeof(msg_head_ctrl_t) + body_len ) != ret) printf("send error,%s:%d",_FUNCTION_, _LINE_); return SOCK_ERROR; return FAILED; 传送下载数据 while(true) read_bytes = read(fd, ack_msg->msg_body, MAX_READ_BYTES); if ( read_bytes > 0 ) /printf("len %

17、d, %dn", read_bytes, ack_msg->body_len); ack_msg->body_len = htonl(read_bytes); ack_msg->command = htonl(msg->command); ret = SUCCESSFUL; else if ( -1 = read_bytes ) read_bytes = 0; ack_msg->body_len = 0; ack_msg->command = htonl(COMMAND_ERROR_FILE); ret = FAILED; else if ( 0

18、= read_bytes ) /传送完退出 ack_msg->body_len = 0; ack_msg->command = htonl(COMMAND_END_FILE); ret = SUCCESSFUL; sent_bytes = send( sockfd, ack_msg, read_bytes + sizeof(msg_head_ctrl_t), 0); if ( sent_bytes != (read_bytes + sizeof(msg_head_ctrl_t) ret = SOCK_ERROR; printf("send data error!%s:%d

19、",_FUNCTION_, _LINE_); break; if ( 0 = ack_msg->body_len ) break; close(fd); return ret;处理显示服务端目录内容和打印服务端路径int handle_ls_pwd(msg_head_ctrl_t * msg, int sockfd) FILE *file; msg_head_ctrl_t *ack_msg; size_t read_bytes; size_t ret; printf("%sn", msg->msg_body); file = popen( msg-&g

20、t;msg_body, "r"); if ( NULL = file ) printf("execute command failed! %sn", msg->msg_body); return FAILED; ack_msg = malloc(sizeof(msg_head_ctrl_t) + MAX_READ_BYTES); if ( NULL = ack_msg ) printf("out of memory!n"); return FAILED; ack_msg->command = htonl( msg->

21、command ); while(true) read_bytes = fread(ack_msg->msg_body,1, MAX_READ_BYTES, file); if ( ferror(file) break; ack_msg->body_len = htonl(read_bytes); ret = send(sockfd, ack_msg, read_bytes+sizeof(msg_head_ctrl_t), 0); if ( (read_bytes+sizeof(msg_head_ctrl_t) != ret ) printf("sock error!n&

22、quot;); return SOCK_ERROR; if ( feof(file ) ) printf("send over!n"); break; pclose(file);处理服务器的请求int handle_request( msg_head_ctrl_t * msg, int sockfd) char *cmd; int ret; switch(msg->command) case COMMAND_CD: /处理cd命令 cmd = trim_all_space( msg->msg_body+2);/skip "cd" charat

23、cer ret = chdir(cmd); if ( -1 = ret ) printf("%s, |%s|n", strerror(errno), cmd); break; case COMMAND_LS: case COMMAND_PWD: ret = handle_ls_pwd(msg, sockfd); break; case COMMAND_GET: ret = handle_get(msg, sockfd); break; case COMMAND_PUT: break; default: ret = FAILED; break; return ret;4.2.

24、2、实现客户端功能的主要代码编写建立套接字 sockfd = socket(PF_INET, SOCK_STREAM , 0); if(sockfd < 0) perror("data stream socket create failed!n"); return -1; server.sin_family = AF_INET; port = atoi(argv2); server.sin_port = htons(port); ret = inet_pton(AF_INET, argv1, &server.sin_addr.s_addr); if ( ret

25、 <=0 ) printf("your ip address is unvalide!n"); usage(); return -1; 链接到服务端 ret = connect(sockfd,(struct sockaddr*) &server,sizeof(struct sockaddr_in); if(ret < 0) perror("data connection is failed!n"); return -1; printf("connect to server successfully!n"); cli

26、net_process( sockfd ); /客户端进程函数调用处理服务端信息int handle_server_ack(sockfd) int ret; uint32_t body_len; uint32_t total_len; msg_head_ctrl_t *msg;接受服务器端的请求 ret = recv( sockfd, &body_len , sizeof(body_len), MSG_PEEK); if ( ret<=0 ) printf("connectionn lost . n"); exit(-1); body_len = ntohl(

27、body_len); total_len = body_len + sizeof(msg_head_ctrl_t); msg = malloc( total_len + 1 ); if ( NULL = msg ) perror("out of memeoryn"); return ; memset( msg, 0, total_len + 1); ret = recv( sockfd, msg , total_len, MSG_WAITALL); if ( ret<=0 ) printf("connectionn lost . n"); exit

28、(-1); msg->body_len = ntohl(msg->body_len); msg->command = ntohl(msg->command); if ( (COMMAND_LS=msg->command) | (COMMAND_PWD=msg->command) ) printf("n%sn",msg->msg_body); else if ( COMMAND_GET = msg->command ) save_file_to_disk(msg->msg_body); free(msg);把命令传送到服务

29、端int send_command_to_server( int sockfd, char *user_input, command_type_t type) ssize_t ret; msg_head_ctrl_t *msg; int body_len; int total_len; body_len = strlen(user_input); total_len = body_len + sizeof(msg_head_ctrl_t); msg = malloc(total_len); if ( NULL = msg ) printf("out of memeory!n"

30、;); return FAILED; msg->command = htonl(type); msg->body_len = htonl(body_len); memcpy(msg->msg_body, user_input, body_len); ret = send(sockfd, msg, total_len, 0); if ( ret < total_len ) printf("connection lost .n"); free(msg); return SOCK_ERROR; free(msg); return SUCCESSFUL;在客

31、户端中下载文件功能int get_file_from_server(int sockfd, char *user_input, command_type_t type) 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(sockfd, user_input, type); if ( ret != SUCCESSFUL) return ret; msg = malloc(sizeof(msg_h

32、ead_ctrl_t) + MAX_READ_BYTES + 1); if ( NULL = msg ) printf("out of memory!n"); return FAILED; 传送下载数据 while(true) FD_ZERO(&fs_client); FD_SET( sockfd, &fs_client); timeout.tv_sec = DEFAULT_CLIENT_TIME_OUT; timeout.tv_usec = 0;select是处理多用户情况 ret = select(sockfd+1, &fs_client, NU

33、LL, NULL, NULL); if ( 0 = ret ) /time out printf("time out.n"); ret = SOCK_ERROR; break; if ( -1 = ret ) continue; memset(msg, 0, sizeof(msg_head_ctrl_t) + MAX_READ_BYTES + 1); ret = recv(sockfd, &len, sizeof(msg->body_len), MSG_PEEK); if (ret <= 0) printf("sock error!n"

34、;); ret = SOCK_ERROR; goto Exit; len = ntohl(len); ret = recv(sockfd, msg, sizeof(msg_head_ctrl_t) + len, MSG_WAITALL); if ( (sizeof(msg_head_ctrl_t) + len) != ret) printf("recv msg error!%s:%d, recv %d, acut %dn", _FUNCTION_, _LINE_,ret,len ); ret = SOCK_ERROR; goto Exit; msg->body_len

35、 = ntohl(msg->body_len); msg->command = ntohl(msg->command); if ( COMMAND_NO_FILE = msg->command ) printf("File %s doesn't exist on servern", user_input); ret = FAILED; goto Exit; if ( -1 = fd) fd = open(user_input, O_WRONLY|O_CREAT|O_EXCL, 0660); if ( -1 = fd) printf("

36、;create file %s failed! %sn", user_input, strerror(errno); ret = FAILED; goto Exit; /save to file ret = write(fd, msg->msg_body, msg->body_len); if ( msg->body_len != ret ) printf("Write file failed!n"); ret = FAILED; goto Exit; if ( COMMAND_END_FILE = msg->command ) ret =

37、 SUCCESSFUL; goto Exit; Exit: free(msg); if (SUCCESSFUL != ret ) unlink(user_input); close(fd); return ret;客户端进程函数void clinet_process(int sockfd ) fd_set fs_read; int max_sock; char buf255; int ret; max_sock = sockfd > STDIN_FILENO ? sockfd : STDIN_FILENO; print_client_prompt(); while(1) FD_ZERO(

38、 &fs_read); FD_SET( STDIN_FILENO, &fs_read); FD_SET( sockfd, &fs_read); if ( select ( max_sock+1, &fs_read, NULL, NULL, NULL) <=0 ) continue; if ( FD_ISSET( sockfd, &fs_read ) ) ret = handle_server_ack(sockfd); if ( SOCK_ERROR = ret ) break; if ( FD_ISSET( STDIN_FILENO, &fs_read ) ) m

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论