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

这篇博客介绍了如何使用MFC Socket在C++中实现FileServer读取文件并发送给FileClient,同时保证客户端接收到的内容能按源文件的格式(包括换行)正确输出。作者指出,当源文件末尾没有换行符时,需要在服务器端发送额外的分隔符(如'|’)以便客户端正确解析。
摘要由CSDN通过智能技术生成

问题解释: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中:    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值