C,通信,多线程,数据库小练习——在线电子词典第一版

 

 

 

 

 

 1 #ifndef FILE_H
 2 #define FILE_H
 3 
 4 #include<stdio.h>
 5 #include<sys/types.h>
 6 #include<sys/socket.h>
 7 #include<stdlib.h>
 8 #include<string.h>
 9 #include<unistd.h>
10 #include<netinet/in.h>
11 #include<arpa/inet.h>
12 
13 #define BUF_SIZE 128
14 typedef struct user{
15     char userch[BUF_SIZE];
16     int password;
17 }user;
18 
19 #endif

 

 

 

 1 #include"my.h"
 2 
 3 /******************************************
 4  *函数:log_in()
 5  *返回值:int 
 6  *参数:main()参数,访问套接字,地址结构提
 7  *功能:产生访问套接字
 8  * 
 9  **************************************** */
10 int log_in(int *argc,const char *argv[],int *sockfd,struct sockaddr_in *servaddr){
11     if((*sockfd=socket(AF_INET,SOCK_STREAM,0))==-1){
12     
13         perror("socket error");
14         exit(-1);
15     }
16     bzero(servaddr,sizeof(*servaddr));
17     
18     (*servaddr).sin_family=AF_INET;
19     (*servaddr).sin_port=htons(atoi(argv[2]));
20     (*servaddr).sin_addr.s_addr=inet_addr(argv[1]);
21     if((connect(*sockfd,(struct sockaddr *)servaddr,sizeof(*servaddr)))==-1){
22     
23         perror("connect error");
24         exit(-1);
25     }
26 
27     //登录
28     
29     while(1){
30         user cliuser={
31             "lanbofei221",
32             666
33         };
34         send(*sockfd,&cliuser,sizeof(cliuser),0);
35         break;
36     }
37     
38     return 0;
39 }
40 /**************************************
41  *函数:translation()
42  *参数:访问套接字 
43  *返回值 :0或1
44  *功能:发送原文,接受译文
45  * ************************************** */
46 int translation(int *sockfd){
47 
48     char buf[BUF_SIZE]={0};//"beautiful";
49     printf("输入要翻译的英文;\n");
50     //getchar();
51     scanf("%s",buf);
52     char dict[BUF_SIZE]={0};
53     if(send(*sockfd,buf,sizeof(buf),0)==-1){
54     
55         perror("send error\n");
56         exit(-1);
57     };
58     printf("发送成功\n");
59     recv(*sockfd,dict,BUF_SIZE,0);
60     printf("%s\n",dict);
61     close(*sockfd);
62     return 0;
63 }
64 /**********************************
65  *函数:main()
66  *参数:主调函数
67  *功能:登录服务器,发送原文,接收译文
68  *
69  ********************************* */
70 int main(int argc, const char *argv[])
71 {
72     int sockfd;
73     struct sockaddr_in servaddr;
74     if(argc<3){
75     
76         printf("Usage:%s<ip><port>\n",argv[0]);
77         exit(-1);
78     }
79 
80     //登录
81     log_in(&argc,argv,&sockfd,&servaddr);
82     //链接翻译
83     translation(&sockfd);
84     
85     return 0;
86 }

 

 

 

  1 /*********************************
  2  * 实验目的:实现客户机和服务器的通信,在线实时翻译,对多个客户机并发服务
  3  *实验思路:
  4  * 一;模块化编程
  5  * 二;使用tcp链接客户机和服务器
  6  * 三;使用文件IO对字典文件进行单词查询
  7  * 四;服务器多进程并发
  8  ********************************* */
  9 
 10 #include"my.h"
 11 #include<signal.h>
 12 #include<stdio.h>
 13 #include<string.h>
 14 
 15 
 16 /*********************************
 17  *函数:log_in()
 18  *参数:main()函数传参个数地址和向量表,服务套接字和地址结构体的地址,
 19  *返回值:0或1
 20  * 功能:创建一个负责监听的主进程,每当有客户机链接时创建专门服务的子进程。提供登录模块
 21  * 注意:使用指针的指向是记得加*
 22  ********************************/
 23 int log_in(int argc,const char *argv[],int *connfd,struct sockaddr_in *cliaddr){
 24     if(argc<3){
 25         printf("Usage:%s <ip><port>\n",argv[0]);
 26         exit(-1);
 27     }
 28     //printf("%s\n%s\n",argv[1],argv[2]);
 29     pid_t pid;
 30     int listenfd=999;
 31     struct sockaddr_in servaddr;
 32 
 33     if((listenfd=socket(AF_INET,SOCK_STREAM,0))==-1){
 34         perror("socket error");
 35         exit(-1);
 36     }
 37     printf("listenfd=%d\n",listenfd);
 38     bzero(&servaddr,sizeof(servaddr));
 39     servaddr.sin_family=AF_INET;
 40     servaddr.sin_port=htons(atoi(argv[2]));
 41     servaddr.sin_addr.s_addr=inet_addr(argv[1]);
 42     if(bind(listenfd,(struct sockaddr *)&servaddr,sizeof(servaddr))<0){
 43 
 44         perror("bind error\n");
 45         exit(-1);
 46     }
 47     printf("bind success\n");
 48     if((listen(listenfd,10))==-1){
 49 
 50         perror("listen error\n");
 51         exit(-1);
 52     }
 53     printf("listen success\n");
 54     socklen_t peerlen=sizeof(servaddr);
 55     while(1){
 56         bzero(cliaddr,peerlen);
 57         if((*connfd=accept(listenfd,(struct sockaddr *)cliaddr,&peerlen))<0){
 58             perror("accept error");
 59             exit(-1);
 60         }
 61         //printf("connection from [%s:%d]\n",inet_ntoa((*cliaddr).sin_addr),ntohs((*cliaddr).sin_port));
 62 
 63         if((pid=fork())<0){
 64 
 65             perror("fork error");
 66             exit(-1);
 67         }else if(pid==0){
 68 
 69             printf("与[%s:%d] 链接成功\n",inet_ntoa((*cliaddr).sin_addr),ntohs((*cliaddr).sin_port));
 70             //登录模块 
 71             
 72                while(1){
 73                user seruser;
 74                recv(*connfd,&seruser,sizeof(seruser),0);
 75                printf("帐号:%s\n",seruser.userch);
 76                break;
 77                }
 78                
 79             break;
 80         }else{
 81 
 82             close(*connfd);
 83         }
 84     }
 85 
 86 
 87     return 0;
 88 }
 89 /************************************
 90  * 函数:translation()
 91  * 参数:服务套接字
 92  * 返回值:1或0
 93  * 功能:接受客户机发送的单词,进行翻译然后结果返回客户机。
 94  * 注意:
 95  *********************************** */
 96 
 97 int translation(int *connfd){
 98     char buf[BUF_SIZE];
 99     printf("等待数据aaaaaaaaaa\n");
100     if((recv(*connfd,buf,BUF_SIZE,0))==-1){
101 
102         perror("recv error\n");
103         exit(-1);
104     }
105     printf("接受数据:%s\n",buf);
106 
107     char dict[128]={0};
108     FILE *fp;
109 
110     if((fp=fopen("dict.txt","r"))==NULL){
111 
112         perror("fail to fopen\n");
113         return 0;
114     }
115     while(fgets(dict,128,fp)!=NULL){
116 
117         if(strncmp(dict,buf,strlen(buf))==0){
118 
119             printf("查询结果:%s\n",dict);
120             break;
121         }    
122         while(dict[strlen(dict)-1]!='\n'){
123 
124             fgets(dict,128,fp);
125         }
126         bzero(&dict,sizeof(dict));
127         strcpy(dict,"未找到查询结果\n");
128     }
129     send(*connfd,dict,strlen(dict)+1,0);
130 
131     close(*connfd);
132     return 0;
133 }
134 /***********************************
135  *函数:main()
136  *功能:接受参数,进行登录链接,接收客户机原文,进行翻译并返回客户机
137  *注意:
138  * */
139 int main(int argc, const char *argv[])
140 {
141     int connfd;
142     struct sockaddr_in cliaddr;
143 
144     log_in(argc,argv,&connfd,&cliaddr);
145     translation(&connfd);
146 
147 
148     return 0;
149 }

 

posted @ 2018-09-13 08:59  蓝勃斐重新开始  阅读(329)  评论(0编辑  收藏  举报