if((s=socket(AF_INET,SOCK_STREAM,0))==-1){ fprintf(stderr,\ exit(-6); }
bzero(&sin,sizeof(sin)); sin.sin_port=sp->s_port;
if(bind(s,(struct sockaddr *)&sin,sizeof(sin))==-1){ fprintf(stderr,\ close(s); exit(-6); }
if(listen(s,5)==-1){
fprintf(stderr,\ close(s); exit(-6); } while(1){
fprintf(stderr,\ Now wait connect ...\\n\ if((ns=accept(s,0,0))==-1){ // wait a connection */ fprintf(stderr,\ continue; }
if((pid=fork())==-1){ // conneted, and then create child proc fprintf(stderr,\ close(s); exit(-1); }
if(pid!=0){ //parent proce, nothing to do, and to the next loop close(ns);wait(0);continue; }
if(pid==0){ // entered child proccedure close(s);
if((sp1=getservbyname(sservice,\ fprintf(stderr,\ exit(-5); }
if((hp1=gethostbyname(sdest))==0){
fprintf(stderr,\ exit(-6); }
bzero(&sin1,sizeof(sin1));
bcopy(hp1->h_addr,&sin1.sin_addr,hp1->h_length); sin1.sin_family=hp1->h_addrtype; sin1.sin_port=sp1->s_port;
if((ss=socket(AF_INET,SOCK_STREAM,0))==-1){ fprintf(stderr,\ exit(-6);
33
}
if(connect(ss,(struct sockaddr *)&sin1,sizeof(sin1))==-1){ fprintf(stderr,\ close(ss); exit(-6); }
printf(\ while(1) {
bzero(buf,sizeof(buf));
if((n=read(ns,buf,sizeof(buf))<=0)){
fprintf(stderr,\ close(ns); exit(-3); }
printf(\ // request message got from the Client. printf(\
if(write(ss,buf,strlen(buf))!=strlen(buf)){ //to server fprintf(stderr,\ close(ss); exit(-1); }
if(strcmp(buf,\ break;
bzero(buf,sizeof(buf));
if((n=read(ss,buf,sizeof(buf)))==0){ //from server
fprintf(stderr,\ close(ss); exit(-2); }
printf(\
// End the Communication with my Server
// Next 2 Line, build a replay Message buf, and write it back printf(\
if(write(ns,buf,strlen(buf))!=strlen(buf)){ fprintf(stderr,\ close(ns); exit(-4); } }
close(ss); close(ns); exit(0); } }
34
}
7.4客户端程序
#include
struct hostent *hp;//主机信息相关数据结构 struct sockaddr_in sin;//通用地址结构sockaddr struct servent *sp;//服务器数据结构servent char buf[50]; int s,pid;
char *service,*dest; //1 检查命令行参数个数
if(argc!=1){ service=argv[1]; dest=argv[2]; } else {
fprintf(stderr,\
fprintf(stderr,\
fprintf(stderr,\ fprintf(stderr,\ destination is defined in /etc/hosts\\n\ exit(-1); }
//2 获得服务信息
if((sp=getservbyname(service,\ fprintf(stderr,\ exit(-5); }
//3 获得(服务器)主机信息 if((hp=gethostbyname(dest))==0){ fprintf(stderr,\ exit(-6); }
//4 填写服务器地址结构
bzero(&sin,sizeof(sin)); //首先清0 bcopy(hp->h_addr,&sin.sin_addr,hp->h_length); //地址 sin.sin_family=hp->h_addrtype; //地址族 sin.sin_port=sp->s_port; //端口号
35
//5 建立套接字
if((s=socket(AF_INET,SOCK_STREAM,0))==-1){ fprintf(stderr,\ exit(-6); }
//6 向服务器请求连接
if(connect(s,(struct sockaddr *)&sin,sizeof(sin))==-1){ fprintf(stderr,\ close(s); exit(-6); }
// next 2 Line build request message //My Codes mainmenu(s); exit(0); }
#include
#define MAX_PASSWD_LEN 8
#define ECHOFLAGS (ECHO |ECHOE |ECHOK |ECHONL) int getpasswd(char * password, int size); #define C_NUM 3 struct reader{//读者数据结构 char id[50]; char name[50]; char password[50]; char enable[1]; };
struct admi{ char id[20]; char name[40]; char password[40]; };
//全局变量保存登录信息 int userlogin=0;//普通用户登录 int admilogin=0;//管理员登录 struct reader readerlog; struct admi admilog;
getm(char buf[],char result[][10][50])//接收信息转换
{
char *ip=NULL,*op=NULL,*temp=NULL,*p=NULL,*tmp=NULL;
36
int i=0,j=0,n=0;
temp=(char *)malloc(strlen(buf)); strcpy(temp,buf); p=temp;
strtok_r(temp,\
while((tmp=strtok_r(NULL,\{ p=tmp;
while((tmp=strtok_r(p,\{ strcpy(result[i][j],tmp); p=NULL;j++; } i++; j=0; }
p=NULL; tmp=NULL; ip=NULL; op=NULL; free(temp); temp=NULL; }
quit(int s) //退出 { } {
char *buf=\printf(\谢谢使用\\n\if(write(s,buf,strlen(buf))<=0) printf(\exit(0);
int querymenu(int s) //查询菜单
char buf[128],c,msg[128],info[128][10][50]; int i=0,j=0,k=0,n=0;char *book[3];
char *title[4]={\编号\书名\作者\数量\
while(1) { printf(\
printf(\请输入您要查找的书的名字(输入!返回):\bzero(buf,sizeof(buf)); bzero(msg,sizeof(msg)); bzero(info,sizeof(info)); scanf(\输入
37