1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166
| #include "_public.h" #include <errno.h>
using namespace std; int listenfd; struct sockaddr_in servaddr; int clientfd; int socklen; char buffer[1100];
const int MAX_SIZE=50005; char findAll[MAX_SIZE]; void s_LOGI(); void s_SAVE(); void s_FIND(); void s_DOWN(); void s_DELE(); int main(){ listenfd=(socket(AF_INET,SOCK_STREAM,0)); memset(&servaddr,0,sizeof(servaddr)); servaddr.sin_family=AF_INET; servaddr.sin_addr.s_addr=htonl(INADDR_ANY); servaddr.sin_port=htons(atoi("5005")); bind(listenfd,(struct sockaddr *)&servaddr,sizeof(servaddr)); listen(listenfd,5); socklen=sizeof(struct sockaddr_in); struct sockaddr_in clientaddr; clientfd=accept(listenfd,(struct sockaddr *)&clientaddr,(socklen_t*)&socklen); printf("客户端(%s)已连接.\n",inet_ntoa(clientaddr.sin_addr)); while(1){ memset(buffer,0,sizeof(buffer)); recv(clientfd,buffer,5,0); int flag=atoi(buffer); switch(flag){ case 0:s_LOGI(); continue; case 1:s_SAVE(); continue; case 2:s_FIND(); continue; case 3:s_DOWN(); continue; case 4:s_DELE(); continue; default:cout<<"服务端无此功能!"<<endl; break; } } close(listenfd); close(clientfd); return 0; } void s_SAVE(){ char filename[80]; int filedes; memset(filename,0,sizeof(filename)); recv(clientfd,filename,20,0); printf("客户端:%s\n",filename); filedes=open(filename,0755);
memset(buffer,0,sizeof(buffer)); recv(clientfd,buffer,1000,0);
write(filedes,buffer,1000); printf("已将%s保存至服务端\n",filename); close(filedes); } void s_DOWN(){ char filename[25]; memset(filename,0,sizeof(filename)); if(recv(clientfd,filename,sizeof(filename),0)<0){ cout<<"未能接收到文件名"<<endl; } char file_content[MAX_SIZE]; memset(file_content,0,sizeof(file_content)); int filedes; if((filedes=open(filename,O_RDONLY))<0){ cout<<"该文件不存在!"<<endl; cout<<errno<<endl; } read(filedes,file_content,sizeof(file_content)); if((send(clientfd,file_content,sizeof(file_content),0))<=0){ cout<<"文件发送失败!"<<endl; } cout<<"发送完毕!"<<endl; close(filedes); }
void s_DELE(){ char filename[25]; char isDele[5]; memset(filename,0,sizeof(filename)); memset(isDele,0,sizeof(isDele)); if((recv(clientfd,filename,sizeof(filename),0))<=0){ cout<<"未能成功接收到待删除文件名!"<<endl; } if((remove(filename))==-1){ cout<<"删除失败!请输入正确的文件名!"<<endl; strcpy(isDele,"0"); send(clientfd,isDele,sizeof(isDele),0); exit(0); } strcpy(isDele,"1"); send(clientfd,isDele,sizeof(isDele),0); cout<<filename<<"删除成功!"<<endl; }
void s_FIND(){ DIR *dir; dir=opendir("."); struct dirent *rent; int cnt=0; memset(findAll,0,sizeof(findAll)); while(rent=readdir(dir)){ char tmp[100]; memset(tmp,0,sizeof(tmp)); strcpy(tmp,rent->d_name); if(tmp[0]=='.'||tmp[0]=='\n') continue; cnt++; sprintf(tmp,"%-15s",tmp); strcat(findAll,tmp); if(cnt%5==0){ strcat(findAll,"\n"); } } strcat(findAll,"\n"); printf("%s目录有以下文件\n%s",".",findAll);
if(send(clientfd,findAll,MAX_SIZE,0)<=0){ cout<<"文件列表发送失败,请检查网络连接"<<endl; } cout<<"发送成功!\n"; } void s_LOGI(){ char work_name[25]; char isexist[5]; memset(work_name,0,sizeof(work_name)); memset(isexist,0,sizeof(isexist)); recv(clientfd,work_name,sizeof(work_name),0); if(chdir(work_name)!=-1){ strcpy(isexist,"1"); send(clientfd,isexist,sizeof(isexist),0); }else{ strcpy(isexist,"0"); send(clientfd,isexist,sizeof(isexist),0); } }
|