📄 ser_xxf.c
字号:
#include<stdio.h>
#include<stdlib.h>
#include<errno.h>
#include<string.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<sys/socket.h>
#include<sys/wait.h>
#include<sys/ipc.h>
#include<unistd.h>
#include<sys/shm.h>
#include<sys/stat.h>
#define MYPORT 3490 // num of port
#define BACKLOG 5 // largest num of accept
#define MAXDATASIZE 1000
#define N 100
#define g_struct (*(g+i)).seri,(*(g+i)).name,(*(g+i)).price,(*(g+i)).n_sold,(*(g+i)).n_store
#define PERM S_IRUSR|S_IWUSR
void process_cli(int new_fd,struct sockaddr_in cliaddr,int num_cli_pro);
struct flower
{
int seri; //serial of flower
char name[20]; //
int price; //
int n_sold; //num of have been sold
int n_store; // num of in store
};
struct search
{
int seri;
int num;
};
int n,i,item_num;
struct flower *g;
struct search s;
int t_last; // item num before add item
void input(); // add item
void print(); // print all info
void scanf_pro(); //browse info for client
void book(); //book flower for client
void unbook(); //unbook flower for client
void go_out(); //client disconnected
main()
{
int j;
int shmid;
printf("initi flower info..");
if((shmid = shmget(IPC_PRIVATE,1024,PERM))==-1)
{
perror("error\n");
exit(1);
}
g = shmat(shmid,0,0);
FILE *f;
if((f=fopen("info","r"))==NULL)
{
perror("fopen error");
exit(1);
}
for(i=0;i<N;i++)
{
fscanf(f,"%d%s%d%d%d",&(*(g+i)).seri,(*(g+i)).name,&(*(g+i)).price,&(*(g+i)).n_sold,&(*(g+i)).n_store);
if((*(g+i)).seri==0)
{
item_num=i;
break;
}
}
fclose(f);
printf(".ok\n");
do
{
printf("choose server options*********************************\n");
printf ("1.browse info about flowers\n"
"2.input the info\n"
"0.quit to start server\n");
printf("please choose a option from 0 to 2:\n");
scanf("%d",&j);
switch(j)
{
case 1:print();break;
case 2:input(); break;
case 0:;
break;
}
}while(j!=0);
int pid;
int sockfd,new_fd;
struct sockaddr_in srvaddr;
struct sockaddr_in cliaddr;
int sin_size;
if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
{
perror("socket error");
exit(1);
}
///initi struct sockaddr_in srvaddr
bzero(&srvaddr,sizeof(srvaddr));
srvaddr.sin_family=AF_INET;
srvaddr.sin_port=htons(MYPORT);
srvaddr.sin_addr.s_addr=htonl(INADDR_ANY);
printf("initi struct server_addr..ok\n");
if(bind(sockfd,(struct sockaddr *)&srvaddr,sizeof(struct sockaddr))==-1)
{
perror("bind error");
exit(1);
}else printf("bind socket server_addr ..ok\n");
if(listen(sockfd,BACKLOG)==-1)
{
perror("listen error");
exit(1);
}else printf("server waiting..\n");
/////////
int num_cli_pro=0;
while(1)
{
sin_size=sizeof(struct sockaddr_in);
if((new_fd=accept(sockfd,(struct sockaddr *)&cliaddr,&sin_size))==-1)
{
perror("accept error");exit(1);
}
num_cli_pro++;
if((pid = fork())>0)
{
close(new_fd);
continue;
}
else if(pid == 0) //child process
{
close(sockfd);
process_cli(new_fd,cliaddr,num_cli_pro);
}
else
{
printf("fork error\n"); exit(0);
}
}
close(sockfd);
}
///////////////////////////////////////////////////
void process_cli(int new_fd,struct sockaddr_in cliaddr,int num_cli_pro) //child processing
{
int option_cli;
char buf3[100];
printf("you got a connection from %s\n",inet_ntoa(cliaddr.sin_addr));
int num1,pro_num=0;
do //every processing for the same pro
{
num1 = recv(new_fd,&option_cli,4,0);
if(num1 <= 0)
{
close(new_fd);
printf("read option error\n");
exit(1);
}
pro_num++;
switch(option_cli)
{
case 1:scanf_pro(new_fd,pro_num,num_cli_pro);break;
case 2:book(new_fd,pro_num,num_cli_pro);break;
case 3:unbook(new_fd,pro_num,num_cli_pro);break;
case 0:go_out(new_fd,pro_num,num_cli_pro);
}
}while(1);
}
void go_out(int new_fd,int pro_num,int num_cli_pro)
{
printf("***this is the %dth processing of client %d\n",pro_num,num_cli_pro);
printf("client disconnected\n");
close(new_fd);
exit(0);
}
void scanf_pro(int new_fd,int pro_num,int num_cli_pro)
{
int n;
printf("***this is the %dth processing of client %d\n",pro_num,num_cli_pro);
printf("client browsing...");
struct flower t;
write(new_fd,&item_num,4);
for(i=0;i<item_num;i++)
{
t.seri=(*(g+i)).seri;
strcpy(t.name,(*(g+i)).name);
t.price=(*(g+i)).price;
t.n_sold=(*(g+i)).n_sold;
t.n_store=(*(g+i)).n_store;
if((n=write(new_fd,&t,sizeof(struct flower)))==-1)
{
printf("write scanf_pro error\n");exit(1);
}
}
printf("ok\n");
}
void book(int new_fd,int pro_num,int num_cli_pro)
{
int n_bytes;
struct search s;
if((n_bytes=read(new_fd,&s,sizeof(struct search)))==-1)
{
perror("read struct search error\n");exit(1);
}
printf("***this is the %dth processing of client %d\n",pro_num,num_cli_pro);
printf("client booking...");
for(i=0;i<item_num;i++)
{
if(s.seri==(*(g+i)).seri)
{
if(s.num<=(*(g+i)).n_store)
{
write(new_fd,"success!",10);
lockf(1,1,0);
(*(g+i)).n_sold=(*(g+i)).n_sold+s.num;
(*(g+i)).n_store=(*(g+i)).n_store-s.num;
FILE *fp;
if((fp=fopen("info","wb"))==NULL) // write a file
{
printf("open a file failed!\n"); getchar(); return;
}
for(i =0; i<item_num; i++)
fprintf(fp,"%d %s %d %d %d\n",g_struct);
lockf(1,0,0);
fclose(fp);
printf("success\n");
}
else if((n=write(new_fd,"failed!",9))==-1)
{
perror("write failed! error\n");exit(1);
}else printf("failed\n");
print();
break;
}
}
}
void unbook(int new_fd,int pro_num,int num_cli_pro)
{
int n_bytes;
struct search s;
if((n_bytes=read(new_fd,&s,sizeof(struct search)))==-1)
{
perror("read struct search error\n");exit(1);
}
printf("***this is the %dth processing of client %d\n",pro_num,num_cli_pro);
printf("client unbooking...");
for(i=0;i<item_num;i++)
{
if(s.seri==(*(g+i)).seri)
{
if(s.num<=(*(g+i)).n_sold)
{
write(new_fd,"success!",10);
lockf(1,1,0);
(*(g+i)).n_sold=(*(g+i)).n_sold-s.num;
(*(g+i)).n_store=(*(g+i)).n_store+s.num;
FILE *fp;
if((fp=fopen("info","wb"))==NULL) // write a bina file
{
printf("open a file failed!\n"); getchar(); return;
}
for(i =0; i<item_num; i++)
fprintf(fp,"%d %s %d %d %d\n",g_struct);
lockf(1,0,0);
fclose(fp);
printf("success\n");
}
else if((n=write(new_fd,"failed!",9))==-1)
{
perror("write failed! error\n");exit(1);
}else printf("failed\n");
print();
break;
}
}
}
void input() // add info of flower
{
int y;
printf("please input new info:\n");
t_last=item_num;
for(i = item_num; i<N; i++)
{
printf("serial:\n");
scanf("%d",&(*(g+i)).seri);
printf("name:\n");
scanf("%s",(*(g+i)).name);
printf("price:\n");
scanf("%d",&(*(g+i)).price);
printf("num(sold)\n");
scanf("%d",&(*(g+i)).n_sold);
printf("num(in store)\n");
scanf("%d",&(*(g+i)).n_store);
item_num++;
printf("the %dth item has been input,\npress 0 to quit or press others to continue\n",item_num);
scanf("%d",&y);
if(y == 0)
{
FILE *fp;
if((fp=fopen("info","ab"))==NULL) // add item to file
{
printf("open a file failed\n"); return;
}
for(i = t_last; i<item_num; i++)
fprintf(fp,"%d%12s%12d%12d%12d\n",g_struct);
fclose(fp);
print();
break;
}
}
}
void print()
{
printf("seir name price num(sold) num(in store)\n");
for(i=0; i<item_num; i++)
printf("%d%12s%12d%12d%12d\n",g_struct);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -