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