📄 server.cpp
字号:
#include<stdio.h>
#include<string.h>
#include<fstream.h>
#include<winsock2.h>//Berkeley头文件被包含在WINSOCK.H中
#include<io.h>
#include<direct.h>
#include<time.h>
#define USERPORT 2207
#pragma comment(lib, "ws2_32.lib")
char defpath[128];
void showdir(char * path,char *dirlist);//响应dir
int filesize(char *path,char *tem); //计算文件大小
void cliprocess(SOCKET clientfd,sockaddr_in client);//对客户机的响应
void main(){
printf("请输入共乡路径:\n");
scanf("%s",defpath);
struct sockaddr_in client;
struct sockaddr_in server;
WSADATA wsd;
SOCKET serverfd,connectfd;
int namelen;
if(WSAStartup(MAKEWORD(2,2),&wsd)!=0){//调用的第一个Windows Sockets函数
printf("failed to load winsock.\n");
}
serverfd=socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
if(serverfd==SOCKET_ERROR){
cout<<WSAGetLastError()<<endl;
cout<<"socket error."<<endl;
}
server.sin_family = AF_INET; //地址设置
server.sin_port = htons(USERPORT);
server.sin_addr.s_addr = htonl(INADDR_ANY);
if (bind(serverfd, (LPSOCKADDR)&server, sizeof(server))==SOCKET_ERROR)//bind 一个端口
{
cout<<"bind error."<<endl;
}
while(1)
{
if (listen(serverfd,3)==SOCKET_ERROR)//监听连接
{
cout<<"listen error."<<endl;
}
cout<<"listening!"<<endl;
namelen = sizeof(client);
while(1){//处理连接
if ((connectfd = accept(serverfd, (SOCKADDR*)&client, &namelen))==INVALID_SOCKET)
{
cout<<"accept error."<<endl;
}
else printf("got a conneted from %s\n",inet_ntoa(client.sin_addr));
cliprocess(connectfd,client);
closesocket(connectfd);
break;
}
}
closesocket(serverfd);
WSACleanup();
printf("Server ended successfully\n");
return ;
}
void cliprocess(SOCKET clientfd,sockaddr_in client){
int ret,i=0,k=0;
char szBuffer[128];
//szBuffer[ret]='\0';
char lastpath[128];
strcpy(lastpath,defpath);
char dirlist[512];
char tem[20];
char sizefile[56];
char outfina[128];
ifstream outfile,infile;
int rd=0;
char data[1460];
int size;
while(1){//处理各种从客户端来的命令
if((ret=recv(clientfd,szBuffer,128,0))==0||ret==SOCKET_ERROR)
printf("Receive error");
szBuffer[ret]='\0';
printf("from %s %s\n",inet_ntoa(client.sin_addr),szBuffer);
int length=strlen(szBuffer);
tem[0]=szBuffer[0];
if(tem[0]=='d')k=1;
if(tem[0]=='p')k=2;
if(tem[0]=='q')break;
if(tem[0]=='c')k=3;
if(tem[0]=='g')k=4;
switch(k){
case 1:showdir(defpath,dirlist);//处理dir命令
send(clientfd,dirlist,strlen(dirlist),0);
break;
case 2://处理pwd命令
send(clientfd,defpath,strlen(defpath),0);
break;
case 3://处理cd命令
for(i=3;i<length;i++)
tem[i-3]=szBuffer[i];
tem[i-3]='\0';
if(strcmp(tem,"\\")==0)strcpy(defpath,lastpath);
else{strcat(defpath,tem);
strcat(defpath,"\\");}
send(clientfd,defpath,strlen(defpath),0);
break;
case 4://处理get命令
length=strlen(szBuffer);
printf("%s",szBuffer);
for(i=4;i<length;i++)
tem[i-4]=szBuffer[i];
tem[i-4]='\0';
printf("%s",tem);
size=filesize(defpath,tem);
itoa(size, sizefile, 10);
send(clientfd, sizefile,56,0);
if(size==0)break;
strcpy(outfina,defpath);
strcat(outfina,tem);
outfile.open(outfina,ios::binary);
memset(data,0,1460);
rd=0;
while(rd<size)
{
outfile.read(data,1460);
send(clientfd,data,1460,0);
rd+=1024;
}
outfile.close();
break;
}
}
}
int filesize(char *path,char *tem){
printf("%s\n",tem);
struct _finddata_t filestruct;
_chdir(path);
long handle;
handle = _findfirst(tem, &filestruct);
if(stricmp(filestruct.name,tem)==0)return filestruct.size;
return 0;}
void showdir(char * path,char *dirlist){
struct _finddata_t filestruct;
_chdir(path);
long handle;
memset(dirlist,0,512);
handle = _findfirst("*.*", &filestruct);
strcat(dirlist,filestruct.name);
strcat(dirlist,"\n");
while( _findnext( handle, &filestruct ) == 0 )
{
strcat(dirlist,filestruct.name);
strcat(dirlist,"\n");
}
dirlist[strlen(dirlist)]='\0';
_findclose(handle);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -