MFC # socket # C++ # Server端读源文件,发送到Client端,输出按源文件同样的格式

问题解释: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端:     MFC # socket # C++ # Server端读源文件,发送到Client端,输出按源文件同样的格式_第1张图片

E:\test.txt中:     MFC # socket # C++ # Server端读源文件,发送到Client端,输出按源文件同样的格式_第2张图片

你可能感兴趣的:(MFC # socket # C++ # Server端读源文件,发送到Client端,输出按源文件同样的格式)