• 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("输入要翻译的英文;
    ");
    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
    ");
    56         exit(-1);
    57     };
    58     printf("发送成功
    ");
    59     recv(*sockfd,dict,BUF_SIZE,0);
    60     printf("%s
    ",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>
    ",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>
    ",argv[0]);
     26         exit(-1);
     27     }
     28     //printf("%s
    %s
    ",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
    ",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
    ");
     45         exit(-1);
     46     }
     47     printf("bind success
    ");
     48     if((listen(listenfd,10))==-1){
     49 
     50         perror("listen error
    ");
     51         exit(-1);
     52     }
     53     printf("listen success
    ");
     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]
    ",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] 链接成功
    ",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
    ",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
    ");
    100     if((recv(*connfd,buf,BUF_SIZE,0))==-1){
    101 
    102         perror("recv error
    ");
    103         exit(-1);
    104     }
    105     printf("接受数据:%s
    ",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
    ");
    113         return 0;
    114     }
    115     while(fgets(dict,128,fp)!=NULL){
    116 
    117         if(strncmp(dict,buf,strlen(buf))==0){
    118 
    119             printf("查询结果:%s
    ",dict);
    120             break;
    121         }    
    122         while(dict[strlen(dict)-1]!='
    '){
    123 
    124             fgets(dict,128,fp);
    125         }
    126         bzero(&dict,sizeof(dict));
    127         strcpy(dict,"未找到查询结果
    ");
    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 }
  • 相关阅读:
    安装Python及pip
    关于软件测试培训
    终于也为自己开了技术博客
    全球地址联动js包2021最新
    约瑟夫斯问题
    添加二级域名
    mysql导出数据
    mysql导入数据
    shopify
    MySQL数据库简介及常用命令
  • 原文地址:https://www.cnblogs.com/lanbofei/p/9638539.html
Copyright © 2020-2023  润新知