MFC # socket # C++ # Server端读源文件,发送到Client端,输出按源文件同样的格式
来源:互联网 发布:司法考试网络培训班 编辑:程序博客网 时间:2024/05/16 15:21
问题解释:Mr Lin 第八周的作业,socket实现FileClient端请求一个文件,FileServer端读取该文件并发送给FileClient端,FileClient端按照源文件同样的格式输出出来:这里同样的格式主要是指换行之类的。
FileServer端读文件到buffer中(部分代码):
/************ 这里要实现的是:逐个字符读入文件内容,然后将分隔符"|"在换行处插入,最后读取完再插入一个换行符,根据这个在client端解析的时候就可以还原 ******************/ char recv_buffer[MAX_RECV_BUFFER]; int c ; int index = 0 ; FILE *pfile = fopen(fileserver.recv_buffer,"r"); if(!pfile){ MessageBox("read file error!") ; exit(1); } do { c = fgetc(pfile); recv_buffer[index] = c ; if(c=='\n') { ++index ; recv_buffer[index] = '|' ; } ++index ; } while (c!=EOF && index < MAX_RECV_BUFFER); recv_buffer[index] = '|'; // 关键之处,在最后加上一个"|",这样就可以按照格式输出了在client端 fclose(pfile); memcpy(fileserver.recv_buffer,recv_buffer,sizeof(recv_buffer));//file_in.getline(fileserver.recv_buffer,1024); /**************** 发送文件 ******************************/ if(fileserver.tcp_to_send(*newsocket)==false){ MessageBox("send()函数执行失败!"); exit(1) ; } _message_list.InsertItem(count,"") ; _message_list.SetItemText(count++,0,"Sent file back to the client:"+file_name) ;}
我自己遇到的问题是:如果不加退出while循环之后的那句:recv_buffer[index] = '|' ; 那么在FileClient端就会少输出一行。这是因为:在E:\hello.txt中文件结束时不是换行符'\n',而在FileClient端解析的时候是根据换行符'|'来解析的,因此有必要在文件读完之后再添加一个分隔符'|'
FileClient端的代码:
_message_list.InsertItem(count_num,"") ; _message_list.SetItemText(count_num++,0,"Receiving file :"+filename) ; _message_list.InsertItem(count_num,"") ; _message_list.SetItemText(count_num++,0,"--------------------------------------------------------------------------");/************* 下面是根据接收的内容放到缓存里面,判断分隔符"|",依据这个将源文件的格式换行输出 *****************/char file_recv[MAX_SEND_BUFFER];memset(file_recv,'\0',sizeof(MAX_SEND_BUFFER)) ;memcpy(file_recv,fileclient.send_buffer,sizeof(fileclient.send_buffer));CString file_output ;for(int i=0 ; i< MAX_SEND_BUFFER ; i++){if(file_recv[i]!='|'){file_output+=file_recv[i] ;}else{_message_list.InsertItem(count_num,"") ; _message_list.SetItemText(count_num++,0,file_output);file_output = "" ; }}_message_list.InsertItem(count_num,"") ; _message_list.SetItemText(count_num++,0,"--------------------------------------------------------------------------");
最终运行的结果为:
FileServer端:
FileClient端:
E:\test.txt中:
- MFC # socket # C++ # Server端读源文件,发送到Client端,输出按源文件同样的格式
- client输入内容发送到server端输出
- C源文件到可执行文件的过程
- C语言源文件到汇编语言的编译
- C程序源文件注释格式
- C程序源文件注释格式
- [MFC]下载一个url的源文件到本地文件
- C源文件到可执行文件全过程
- MFC Socket实现Server和Client发送文件学习记录
- 关于复制HTML源文件到剪贴板格式
- 源文件到可执行文件的过程
- 源文件到可执行文件的过程
- 源文件到可执行文件的过程
- 在linux下C语言源文件到可执行文件的过程
- c源文件到执行文件的编译过程
- c源文件到执行文件的编译过程
- C源文件到ELF可执行文件的生成过程
- C 源文件内的中文
- POJ - I Think I Need a Houseboat
- javascript笔记二(window对象)
- 【Oracle数据库】ORA-12541: TNS:no listener 的详细解决方案
- linux c 字符处理函数
- 灵活运用 SQL SERVER FOR XML PATH
- MFC # socket # C++ # Server端读源文件,发送到Client端,输出按源文件同样的格式
- 【Boost】boost::function介绍
- [sicily online]1051. Biker's Trip Odomete
- 项目中的问题
- jQuery获取及设置单选框、多选框、文本框内容
- POJ 1088 滑雪
- 软件开发编码规范
- [js]js正则表达exec和match的区别
- SCWCD(Servlet&Jsp learning)第二问-------cookie和session的区别和联系