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 }