⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 server.cpp

📁 这是个利用VC++做的进程调度实验模拟,是操作系统中要求的编程,本实验只是进程的模拟,所以有好多问题没有写进去,只是提供合适的算法.
💻 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 + -