//gcc server.c -o server -I /usr/include/mysql -L /usr/lib -lmysqlclient
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
#include<netdb.h>
#include <limits.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include <mysql.h>
#include<unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/wait.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#define LOG_PORTNUMBER 8888
#define HELLO_WORLD_SERVER_PORT 6666
#define LENGTH_OF_LISTEN_QUEUE 20
#define BUFFER_SIZE 1024
#define FILE_NAME_MAX_SIZE 512
#define PERMS S_IRUSR|S_IWUSR
void init_semaphore_struct(struct sembuf* sem,int semnum,int semop,int semflag)
{
sem->sem_num=semnum;
sem->sem_op=semop;
sem->sem_flg=semflag;
}
int del_semaphore(int semid)
{
#if 1
return semctl(semid,0,IPC_RMID);
#endif
}
int search_usrinf(char *name,char *password);
int file_download();
int server_upload();
int user_number=0;
int main(int argc,char **argv)
{
int sem_id,semop_ret,status;
struct sembuf semwait,semsignal;
if((sem_id=semget(IPC_PRIVATE,1,PERMS))==-1)
{
fprintf(stderr,"[%d]: access semophore error\n\a",getpid(),strerror(errno));
exit(1);
}
init_semaphore_struct(&semwait,0,-1,0);
init_semaphore_struct(&semsignal,0,1,0);
if(semop(sem_id,&semsignal,1)==-1)
{
fprintf(stderr,"[%d] increment semaphore error\n\a",getpid(),strerror(errno));
if(del_semaphore(sem_id)==-1)
{
fprintf(stderr,"[%d] destroy semaphore error\n\a",getpid(),strerror(errno));
}
exit(1);
}
int shmid;
char *p_addr;
if((shmid=shmget(IPC_PRIVATE,1024,PERMS))==-1)
{
fprintf(stderr,"create share memory error :%s \n\a",strerror(errno));
exit(1);
}
p_addr=shmat(shmid,0,0);
memset(p_addr,'\0',1024);
strcpy(p_addr,"0");
int sockfd,new_fd;
struct sockaddr_in server_addr;
struct sockaddr_in client_addr;
int sin_size;
char name[20],passwd[20];
if(argc!=1)
{
fprintf(stderr,"Usage %s portnumber\n\a",argv[0]);
exit(1);
}
/*if((portnumber=atoi(argv[1]))<0)
{
fprintf(stderr,"usage : %s hostname portnumber\n\a",argv[0]);
exit(1);
} */
if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
{
fprintf(stderr,"Socket error %s \n\a",strerror(errno));
exit(1);
}
bzero(&server_addr,sizeof(struct sockaddr_in));
server_addr.sin_family=AF_INET;
server_addr.sin_addr.s_addr=htonl(INADDR_ANY);
server_addr.sin_port=htons(LOG_PORTNUMBER);
if((bind(sockfd,(struct sockaddr*)&server_addr,sizeof(struct sockaddr)))==-1)
{
fprintf(stderr,"bind error : %s \n\a",strerror(errno));
exit(1);
}
if(listen(sockfd,20)==-1)
{
fprintf(stderr,"Listen error: %s \n\a",strerror(errno));
exit(1);
}
while(1)
{
sin_size=sizeof(struct sockaddr_in);
if((new_fd=accept(sockfd,(struct sockaddr*)&client_addr,&sin_size))==-1)
{
fprintf(stderr,"Accept error: %s \n\a",strerror(errno));
exit(1);
}
else
{
semop_ret=semop(sem_id,&semwait,1);
p_addr=shmat(shmid,0,0);
user_number=atoi(p_addr);
user_number=(user_number+1)%1000;
sprintf(p_addr,"%d",user_number);
semop(sem_id,&semsignal,1);
printf("User number has increased to %d!!\n",user_number);
if(fork()==0)
{
fprintf(stderr,"Server get connection from %s \n\a",inet_ntoa(client_addr.sin_addr));
send(new_fd,"Please input your username:\0",strlen("Please input your username: \0"),0);
while(1)
{
if(recv(new_fd,name,20,0))
break;
}
send(new_fd,"Please input your password:\0",strlen("Please input password: \0"),0);
while(1)
{
if(recv(new_fd,passwd,20,0)>0)
break;
}
int flag=search_usrinf(name,passwd);
printf("flag=%d\n",flag);
if(flag==1)
{
//printf("*****user_number=%d\n",user_number);
char number[25];
bzero(number,25);
sprintf(number,"%d",user_number);
//printf("-----User number is %s!!----\n",number);
/*send(new_fd,number,25,0);*/
send(new_fd,"*********************************Log success!!*********************************\n\0",strlen("*********************************Log success!!*********************************\n\0"),0);
//******************************************
// start to serve
char buffer[100];
bzero(buffer,100);
recv(new_fd,buffer,100,0);
if(buffer[0]=='1')
{
send(new_fd,number,25,0);
printf("User number is %s!!\n",p_addr);
file_download();
}
if(buffer[0]=='2')
{
send(new_fd,number,25,0);
printf("User number is %s!!\n",p_addr);
server_upload();
}
if(buffer[0]=='3')
{
printf("Connect shut down!!\n");
return 1;
}
}
else if(flag==0)
{
send(new_fd,"Pass word error!!\n",strlen("Pass word error!!\n"),0);
break;
}
else
{
send(new_fd,"User does not exit!!!\n",strlen("User does not exit!!!\n"),0);
break;
}
close(new_fd);
}
}
}
if(del_semaphore(sem_id)==-1)
fprintf(stderr,"[%d] destroy semaphore error\n\a",getpid(),strerror(errno));
close(sockfd);
return 1;
}
int search_usrinf(char *name,char *password)
{
MYSQL mysql;
MYSQL_RES *res;
MYSQL_ROW row;
char sql[100];
int t;
sprintf(sql,"select passwd from usrinf where usr_name=\"%s\"\0",name);
mysql_init(&mysql); //初始化mysql结构
if(!mysql_real_connect(&mysql,"localhost","root","duanmaotao","usr_infor",3306,NULL,0))
printf("\nData base connect error: %s\n",mysql_error(&mysql));
else
printf("\nData base connect!\n");
t = mysql_real_query(& mysql, sql, (unsigned int)strlen(sql)); //在服务器上执行定义的SQL语句
if(t)
printf("select error: %s\n",mysql_error(&mysql));
else
{
res = mysql_store_result(&mysql);
row = mysql_fetch_row(res);
if(row==NULL)
{
printf("User does not exit!!!\n");
printf("Release database...\n\n");
mysql_free_result(res);
mysql_close(&mysql);
return -1;
}
else if(strcmp(password,row[0])==0)
{
printf("Log in\n");
printf("Release database...\n\n");
mysql_free_result(res);
mysql_close(&mysql);
return 1;
}
else
{
printf("Passwd error!\n");
printf("Release database...\n\n");
mysql_free_result(res);