#ifndef FILE_H
#define FILE_H #include<stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<netinet/in.h>
#include<arpa/inet.h> #define BUF_SIZE 128
typedef struct user{
char userch[BUF_SIZE];
int password;
}user; #endif
 #include"my.h"

 /******************************************
*函数:log_in()
*返回值:int
*参数:main()参数,访问套接字,地址结构提
*功能:产生访问套接字
*
**************************************** */
int log_in(int *argc,const char *argv[],int *sockfd,struct sockaddr_in *servaddr){
if((*sockfd=socket(AF_INET,SOCK_STREAM,))==-){ perror("socket error");
exit(-);
}
bzero(servaddr,sizeof(*servaddr)); (*servaddr).sin_family=AF_INET;
(*servaddr).sin_port=htons(atoi(argv[]));
(*servaddr).sin_addr.s_addr=inet_addr(argv[]);
if((connect(*sockfd,(struct sockaddr *)servaddr,sizeof(*servaddr)))==-){ perror("connect error");
exit(-);
} //登录 while(){
user cliuser={
"lanbofei221", };
send(*sockfd,&cliuser,sizeof(cliuser),);
break;
} return ;
}
/**************************************
*函数:translation()
*参数:访问套接字
*返回值 :0或1
*功能:发送原文,接受译文
* ************************************** */
int translation(int *sockfd){ char buf[BUF_SIZE]={};//"beautiful";
printf("输入要翻译的英文;\n");
//getchar();
scanf("%s",buf);
char dict[BUF_SIZE]={};
if(send(*sockfd,buf,sizeof(buf),)==-){ perror("send error\n");
exit(-);
};
printf("发送成功\n");
recv(*sockfd,dict,BUF_SIZE,);
printf("%s\n",dict);
close(*sockfd);
return ;
}
/**********************************
*函数:main()
*参数:主调函数
*功能:登录服务器,发送原文,接收译文
*
********************************* */
int main(int argc, const char *argv[])
{
int sockfd;
struct sockaddr_in servaddr;
if(argc<){ printf("Usage:%s<ip><port>\n",argv[]);
exit(-);
} //登录
log_in(&argc,argv,&sockfd,&servaddr);
//链接翻译
translation(&sockfd); return ;
}
 /*********************************
* 实验目的:实现客户机和服务器的通信,在线实时翻译,对多个客户机并发服务
*实验思路:
* 一;模块化编程
* 二;使用tcp链接客户机和服务器
* 三;使用文件IO对字典文件进行单词查询
* 四;服务器多进程并发
********************************* */ #include"my.h"
#include<signal.h>
#include<stdio.h>
#include<string.h> /*********************************
*函数:log_in()
*参数:main()函数传参个数地址和向量表,服务套接字和地址结构体的地址,
*返回值:0或1
* 功能:创建一个负责监听的主进程,每当有客户机链接时创建专门服务的子进程。提供登录模块
* 注意:使用指针的指向是记得加*
********************************/
int log_in(int argc,const char *argv[],int *connfd,struct sockaddr_in *cliaddr){
if(argc<){
printf("Usage:%s <ip><port>\n",argv[]);
exit(-);
}
//printf("%s\n%s\n",argv[1],argv[2]);
pid_t pid;
int listenfd=;
struct sockaddr_in servaddr; if((listenfd=socket(AF_INET,SOCK_STREAM,))==-){
perror("socket error");
exit(-);
}
printf("listenfd=%d\n",listenfd);
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family=AF_INET;
servaddr.sin_port=htons(atoi(argv[]));
servaddr.sin_addr.s_addr=inet_addr(argv[]);
if(bind(listenfd,(struct sockaddr *)&servaddr,sizeof(servaddr))<){ perror("bind error\n");
exit(-);
}
printf("bind success\n");
if((listen(listenfd,))==-){ perror("listen error\n");
exit(-);
}
printf("listen success\n");
socklen_t peerlen=sizeof(servaddr);
while(){
bzero(cliaddr,peerlen);
if((*connfd=accept(listenfd,(struct sockaddr *)cliaddr,&peerlen))<){
perror("accept error");
exit(-);
}
//printf("connection from [%s:%d]\n",inet_ntoa((*cliaddr).sin_addr),ntohs((*cliaddr).sin_port)); if((pid=fork())<){ perror("fork error");
exit(-);
}else if(pid==){ printf("与[%s:%d] 链接成功\n",inet_ntoa((*cliaddr).sin_addr),ntohs((*cliaddr).sin_port));
//登录模块 while(){
user seruser;
recv(*connfd,&seruser,sizeof(seruser),);
printf("帐号:%s\n",seruser.userch);
break;
} break;
}else{ close(*connfd);
}
} return ;
}
/************************************
* 函数:translation()
* 参数:服务套接字
* 返回值:1或0
* 功能:接受客户机发送的单词,进行翻译然后结果返回客户机。
* 注意:
*********************************** */ int translation(int *connfd){
char buf[BUF_SIZE];
printf("等待数据aaaaaaaaaa\n");
if((recv(*connfd,buf,BUF_SIZE,))==-){ perror("recv error\n");
exit(-);
}
printf("接受数据:%s\n",buf); char dict[]={};
FILE *fp; if((fp=fopen("dict.txt","r"))==NULL){ perror("fail to fopen\n");
return ;
}
while(fgets(dict,,fp)!=NULL){ if(strncmp(dict,buf,strlen(buf))==){ printf("查询结果:%s\n",dict);
break;
}
while(dict[strlen(dict)-]!='\n'){ fgets(dict,,fp);
}
bzero(&dict,sizeof(dict));
strcpy(dict,"未找到查询结果\n");
}
send(*connfd,dict,strlen(dict)+,); close(*connfd);
return ;
}
/***********************************
*函数:main()
*功能:接受参数,进行登录链接,接收客户机原文,进行翻译并返回客户机
*注意:
* */
int main(int argc, const char *argv[])
{
int connfd;
struct sockaddr_in cliaddr; log_in(argc,argv,&connfd,&cliaddr);
translation(&connfd); return ;
}

C,通信,多线程,数据库小练习——在线电子词典第一版的更多相关文章

  1. 关于Java多线程的线程同步和线程通信的一些小问题(顺便分享几篇高质量的博文)

    Java多线程的线程同步和线程通信的一些小问题(顺便分享几篇质量高的博文) 前言:在学习多线程时,遇到了一些问题,这里我将这些问题都分享出来,同时也分享了几篇其他博客主的博客,并且将我个人的理解也分享 ...

  2. Andriod小项目——在线音乐播放器

    转载自: http://blog.csdn.net/sunkes/article/details/51189189 Andriod小项目——在线音乐播放器 Android在线音乐播放器 从大一开始就已 ...

  3. 【转】Delphi多线程学习(9):多线程数据库查询(ADO)

    原文:http://www.cnblogs.com/djcsch2001/articles/2382559.html ADO多线程数据库查询通常会出现3个问题: 1.CoInitialize 没有调用 ...

  4. android 多线程数据库读写分析与优化

    最新需要给软件做数据库读写方面的优化,之前无论读写,都是用一个 SQLiteOpenHelper.getWriteableDataBase() 来操作数据库,现在需要多线程并发读写,项目用的是2.2的 ...

  5. 教程-Delphi多线程数据库查询(ADO)

    ADO多线程数据库查询通常会出现3个问题: 1.CoInitialize 没有调用(CoInitialize was not called):所以,在使用任何dbGo对象前,必须手 调用CoIniti ...

  6. Delphi多线程数据库查询(ADO)

    ADO多线程数据库查询通常会出现3个问题: 1.CoInitialize 没有调用(CoInitialize was not called):所以,在使用任何dbGo对象前,必须手 调用CoIniti ...

  7. ADO多线程数据库总结

    ADO多线程数据库查询通常会出现以下问题: 1.CoInitialize 没有调用(CoInitialize was not called):所以,在使用任何dbGo对象前,必须手 调用CoIniti ...

  8. 多线程数据库查询(ADO)

    ADO多线程数据库查询通常会出现3个问题: 1.CoInitialize 没有调用(CoInitialize was not called):所以,在使用任何dbGo对象前,必须手 调用CoIniti ...

  9. 微信小程序在线支付功能使用总结

    最近需要在微信小程序中用到在线支付功能,于是看了一下官方的文档,发现要在小程序里实现微信支付还是很方便的,如果你以前开发过服务号下的微信支付,那么你会发现其实小程序里的微信支付和服务号里的开发过程如出 ...

随机推荐

  1. 在Android中使用FlatBuffers(下篇)

    本文来自网易云社区. FlatBuffers编码数组 编码数组的过程如下: 先执行 startVector(),这个方法会记录数组的长度,处理元素的对齐,准备足够的空间,并设置nested,用于指示记 ...

  2. vs2013使用git报错

    之前使用的是个人git账号,先转换为公司git账号,在同步时报Response status code does not indicate success: 403 (Forbidden) 上述问题是 ...

  3. Codeforces Round #517 (Div. 2, based on Technocup 2019 Elimination Round 2)D(思维,DP,字符串)

    #include<bits/stdc++.h>using namespace std;char c[2007][2007];char ans[4007];int s[2007][2007] ...

  4. nginx 反向代理及负载均衡

    假设我们在 192.168.137.11:8080 上有一个web服务,在 192.168.137.12 配置了一台 nginx,我们可以进行如下配置: location / {    proxy_p ...

  5. Gradle用户使用指南

    转载请事先沟通,未经允许,谢绝转载. 1. 新工具介绍(Introduction) 能够复用代码和资源能够构建几种不同版本参数的应用能够配置.扩展.自定义构建过程1.1 为什么选择Gradle(Why ...

  6. ajax跨域问题解决方案(jsonp,cors)

    跨域 跨域有三个条件,满足任何一个条件就是跨域 1:服务器端口不一致 2:协议不一致 3:域名不一致 解决方案: 1.jsonp 在远程服务器上设法动态的把数据装进js格式的文本代码段中,供客户端调用 ...

  7. sql 存储过程-proc

    创建 create proc 存储过程名 (参数列表) as sql 语句 go 执行 exec 存储过程名 参数1,参数2 删除 drop procedure  存储过程名 注: 存储过程名最好以_ ...

  8. mybatis深入理解(一)之 # 与 $ 区别以及 sql 预编译

    mybatis 中使用 sqlMap 进行 sql 查询时,经常需要动态传递参数,例如我们需要根据用户的姓名来筛选用户时,sql 如下: select * from user where name = ...

  9. 为什么要问Servlet的初始化时间

    Servlet的init方法到底是在什么时候调用的? j2ee specification和java doc中有以下说明 如果load-on-startup设置为>=0, 部署的时候就会调用.  ...

  10. mycat1.6.5分片(字符串拆分hash)

    https://blog.csdn.net/webnum/article/details/78313525   分片规则:字符串拆分hash 一.conf/schema.xml文件   <?xm ...