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中:    

原创粉丝点击