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

📄 server.c

📁 基于TCP的控制台下局域网ftp(C/S),能够实现简单ftp命令。具有简单的客户端身份认证功能。内含简单的makefile文件
💻 C
字号:
#include "server.h"

int usrcheck ( int usrchecksock);
void cmd_help(int sock);
void cmd_put(int sock,char *fileName);

int rval,i,j;
char client_cmd[10] , cmd_arg[20] ,usr_msg[50]; 

char currentDirPath[200];
char currentDirName[30];

												/*简单的用户信息*/

char usr_msg_3[50]="the user name or password error!";

												/*简单的用户信息*/
		
int main(int argc,char *argv[]) 
{ 
int sock,sockmsg, length, lengthmsg,sockusrcheck;

			
  struct sockaddr_in server; 
  struct sockaddr_in servermsg;
  struct sockaddr_in serverusrcheck;
  int datasock, msgsock,usrchecksock; 
												/*创建三个端口分别用于接受、上传和身份验证,得到三个套接字*/

  sock=socket(AF_INET,SOCK_STREAM,0);
  sockmsg=socket(AF_INET,SOCK_STREAM,0); 
  sockusrcheck=socket(AF_INET,SOCK_STREAM,0);

			

  if (sock<0||sockmsg<0||sockusrcheck<0) 
  	{ 
   	 perror("opening stream socket"); 
   	 exit(1); 
	} 

  server.sin_family=AF_INET; 
  server.sin_addr.s_addr=INADDR_ANY; 
  server.sin_port=htons(LISTEN_PORT);


  servermsg.sin_family=AF_INET; 
  servermsg.sin_addr.s_addr=INADDR_ANY; 
  servermsg.sin_port=htons(LISTEN_PORT+1);

  serverusrcheck.sin_family=AF_INET; 
  serverusrcheck.sin_addr.s_addr=INADDR_ANY;
  serverusrcheck.sin_port=htons(LISTEN_PORT+2);
  
  												/*bind使监听端口的套接字与端口关联*/
  if (  bind(sock,(struct sockaddr *)&server,sizeof server)<0
	||bind(sockmsg,(struct sockaddr *)&servermsg,sizeof servermsg)<0
	||bind(sockusrcheck,(struct sockaddr *)&serverusrcheck,sizeof serverusrcheck)<0) 
	{ 
   	 perror("binding stream socket"); 
 	 exit(1); 
	}

  length=sizeof server;
  lengthmsg=sizeof servermsg; 

  printf("Socket port # %d %d\n",LISTEN_PORT,LISTEN_PORT+1);

  memset(currentDirPath,0,sizeof(currentDirPath));
  getcwd(currentDirPath,sizeof(currentDirPath));
 												/*监听等待客户端接入*/
  listen(sock,2);
  listen(sockmsg,2); 
  listen(sockusrcheck,2);

while ( TRUE)
 { 												  /*接受连接得到新的套接字,用于接受发送数据*/
  datasock = accept(sock,NULL,NULL);
  msgsock = accept(sockmsg,NULL,NULL); 
  usrchecksock=accept(sockusrcheck,NULL,NULL);
  if ( datasock == -1 || msgsock==-1 || usrchecksock==-1) 
   {perror("accept"); 
    continue;
   }
  else 
   { 
     printf("Connection accepted! New client comming\n"); 
   } 
   if ( (usrcheck ( usrchecksock))==0)
     {
       if(write(msgsock,usr_msg_3,sizeof(usr_msg_3))<0)
	{	
	  perror("Write");
	}
	close(datasock);
	close(msgsock);
	close(usrchecksock);
	continue;
     }
   
  

/*用户认证结束*/
while(TRUE)
{	
 	memset(client_cmd,0,sizeof(client_cmd));
	  rval=0; 
	  rval=read(msgsock,client_cmd,sizeof(client_cmd));

	  if(rval<0) 
	    { 
	  	perror("reading command failed\n"); 
	    } 
	  else if(rval==0) 
	    { 
		printf("connection closed.\n");
		close(datasock);
		close(msgsock); 
	    } 
	  else 
	    { 
		if(strcmp(client_cmd,"put")==0) 
		{
			printf("command put\n");

			memset(cmd_arg,0,sizeof(cmd_arg));
			read(msgsock,cmd_arg,sizeof(cmd_arg));
			cmd_put(datasock,cmd_arg);
			printf("done\n\n");
			continue; 
		}
		else if(strcmp(client_cmd,"help")==0)
		{
			printf("command help\n");

			cmd_help(datasock);
			printf("done\n\n");
			continue;
		} 
		else if(strcmp(client_cmd,"quit")==0) 
		{
			printf("quit\n"); 
			goto EndPro; 
		} 
		else 
		{ 
			printf("bad request!\n"); 
			continue; 
		} 
         }	 
      } 
    }
EndPro:
   printf("connection closed.\n"); 
   close(datasock);
   close(msgsock); 
   exit(0); 

}





⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -