#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);
}