#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. jQuery插件AjaxFileUpload可以实现ajax文件上传

    http://blog.sina.com.cn/s/blog_55e42da60100ocvh.html

  2. Cactus详细讲解

    Cactus建议一年以上有经验的人玩,刚入门MVC,不了解下列组件请先自行学习,切勿好高骛远. Cactus的组成(基于.net4.5.2):Dapper+MVC4+autofac 前端css框架pu ...

  3. webpack@3.6.0(1) -- 快速开始

    本篇内容 前言 配置入口和输出 热更新 loader配置 js代码压缩 html的打包与发布 前言 //全局安装 npm install -g webpack(3.6.0) npm init //安装 ...

  4. KONG -- 配置 service 并添加 key-auth

    默认情况下, KONG 监听下面几个端口: 8000   这个端口用于监听客户端的 HTTP 请求,并转发给上游服务 8443   这个端口用于监听客户端的 HTTPS 请求,并转发给上游服务 800 ...

  5. 机房重构——泛型和“DataTable”

    前言 我们都知道在机房重构的时候,大多数都在用七层进行重构,每一层都依赖实体.所以不管怎么调用,返回的应该是实体参数,这样才符合大多数的逻辑,这样我们试想一下,如果我们要求在U层返回多个实体值,怎么办 ...

  6. 洛谷P1314 聪明的质监员

    P1314 聪明的质监员 题目描述 小T 是一名质量监督员,最近负责检验一批矿产的质量.这批矿产共有 n 个矿石,从 1到n 逐一编号,每个矿石都有自己的重量 wi 以及价值vi .检验矿产的流程是: ...

  7. bzoj2229: [Zjoi2011]最小割(最小割树)

    传送门 这题是用最小割树做的(不明白最小割树是什么的可以去看看这一题->这里) 有了最小割树就很简单了……点数那么少……每次跑出一个最大流就暴力搞一遍就好了 //minamoto #includ ...

  8. python编译环境安装指南

    windows系统先安装python解释器: windows版本exe安装文件下载地址:https://www.python.org/ftp/python/2.7.12/python-2.7.12.m ...

  9. React学习记录

    托webpack的福,我终于可以开始写React了.==ORZ 我感觉我接近webpack工程师更进一步了哈哈哈. 以下所有内容均来自小红书,仅是我的个人记录,如想系统学习,请移步:React小书 : ...

  10. Asp.net Core 创建控制器时出错问题记录(运行所选代码生成器时出错)

    问题描述:在创建一个MVC控制器(带读写,使用EF) 解决方法:添加nuget包