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

📄 ser_xxf.c

📁 基于终端的订花系统_socket #include<stdio.h> #include<stdlib.h> #include<errno.h> #inclu
💻 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 + -