




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
(此文档为word格式,下载后您可任意编辑修改!)《UNIX系统与软件开发》课程设计说明书设计题目:图书管理系统专业:计算机科学与技术指导教师:班级:学号:姓名:同组人:计算机科学与工程学院2014年6月18日前言在信息技术发展迅猛的二十一世纪的今天,我们需要掌握的不仅仅是科学文化知识,还需要把所学到的知识合理的运用到现实生活中来。科学技术是第一生产力,它给我们带来的不仅仅是生活中的各种便利和生活水平的不断提高,同时也给带给了我们各种各样的不同类型和不同层次的科技的领先发展的成果。在中间件诞生之前,多采用传统CS二层结构。这种二层结构是计算机及软件技术发展的一大进步。一般而言,服务器是一个进程,它等待客户机与其联系,提出某种类型的服务要求。CS模式在操作过程中采取的是主动请求方式。服务对客户机服务可将结果或信息返回给客户机(双向),也可不返回(单向)。虽然它带来了相当的灵活性,但也逐渐暴露出其客户端和服务器端负担过重的现象,并且拓展性也较差,无法跨越不同的业务部门和业务系统。这不仅表现在技术上有难度,更重要的是在制度和安全方面。于是,三层结构出现了所谓三层结构,就是在原有的两层结构之间,增加一个中间层。该中间层既包括服务也包括请求中间件是一种独立的系统软件或服务程序,分布式应用软件借助这种软件在不同的技术之间共享资源。中间件位于客户机服务器的操作系统之上,管理计算资源和网络通讯。是连接两个独立应用程序或独立系统的软件。相连接的系统,即使它们具有不同的接口,但通过中间件相互之间仍能交换信息。执行中间件的一个关键途径是信息传递。通过中间件,应用程序可以工作于多平台或OS环境。它的工作机制是:当客户端上的应用程序需要从网络中某个节点处获取一定的数据或服务时,这些数据和服务可能处于一个运行着和客户端不同的硬、软件、网络或操作系统的平台上。CS应用程序中负责寻找数据的部分只需访问一个中间件系统,由中间件完成到网络中找到数据源或服务,进而实现传输客户请求、重组答复信息,最后将结果送回应用程序的任务。本次设计的中间件是交易型中间件。交易型中间件是指用在不同行业、不同部门间的通讯转发和协议转换的软件,在不同的行业、不同的系统间提供通讯转发和协议转换的桥梁作用。本次设计不是基于WEB的,不需要很多与WEB开发相关的知识,主要是利用UNIX系统提供的Socket库在网络底层,开发交易型中间件。本次设计的目的是掌握利用软件工程的思想方法和TCPIP设计出用于不同行业和部门间的通讯转发或协议转换软件—中间件,尤其掌握这种设计的思想和方法。目录TOC\o"1-3"\h\u一、系统环境 11、硬件环境 12、软件环境 1二、设计目的及要求 22.1设计目的 22.2设计要求 2三、总体设计 43.1程序设计组成框图 43.2程序设计类图 53.3程序设计流程图 6四、详细设计 74.1基本套接字系统调用 74.2MySQL数据库在Unix的使用 8 8MySQL服务配置 9MySQL客户端命令行工具 9行 9MySQL开发接口 9五、调试与测试 115.1调试方法 115.2测试结果分析及讨论 11六、设计中遇到的问题及解决方法 22七、源程序清单 237.1数据库代码 237.2服务器代码 247.3中间件程序 337.4客户端程序 36八、心得体会 57九、参考文献 58一、系统环境1、硬件环境Pentium(R),4cpu3.06GHz,512MB内存。2、软件环境该图书管理系统是在windowsXP操作系统下使用Linux虚拟机环境,使用GNUC,在UNIXLinuxmake开发工具的管理和控制下,利用UNIXLinuxSocket库和MySQL数据库在网络的底层进行开发设计的。二、设计目的及要求2.1设计目的基于UNIXSocket和MySQL数据库,设计一个交易型中间件系统。这里的中间件是指交易型中间件。交易型中间件是指用在不同行业、不同部门间的通讯转发和协议转换的软件,在不同的行业、不同的系统间提供通讯转发和协议转换的桥梁作用。例如电子商务、银行代理业务软件等都是这种类型的软件。本设计不是基于WEB的,不需要很多与WEB开发相关的知识,主要是利用UNIX系统提供的Socket库在网络底层,开发交易型中间件。本设计的目的是使参与设计者掌握利用软件工程的思想方法和TCPIP设计出用于不同行业和部门间的通讯转发或协议转换软件—中间件,尤其掌握这种设计的思想和方法。在很多场合中间件部分是必须的,因为在不同的行业的网络是不允许直通的。这里有政策的因素,有制度的要求,也有技术的成份。2.2设计要求(1)客户端客户端程序可命名为client,要求带有两个命令行参数一个是服务(自己定义,并保存在etcservices中,比如mysvr15678),另一个是目的主机(自己定义,并保存在etc,inttype,intprotocol);该调用要接收3个参数,根据这3个参数建立一个套接字,并将相应的资源分配给它,同时返回一个整型套接字号,只和一个特定的协议相联系。实际上指定了相关五元组中的“协议”这一元。domain(协议族):AF_INET,AF_UNIX,AF_IPXtype(类型):SOCK_STREAM,SOCK_DGRAMprotocol(协议):0-让系统使用指定类型和协议族上的默认协议。【2】绑定本地地址—bind()当一个套接字用socket()创建后,存在一个名字空间(地址族),但它没有被命名,bind()将套接字地址(包括本地主机地址和本地端口地址)与所创建的套接字号绑定起来,即将名字赋予套接字,以指定本地半相关。其调用格式如下:#include <syssocket.);说明:sockfd:为socket成功时的返回值—套接字描述符。my_addr为本方地址数据结构。addrlen=sizeof(my_addr).【3】监听连接—listen()此调用用于面向连接服务器,表明它愿意接收连接。1isten()需在accept()之前调用,其调用格式如下:#include <syssocket.(ints,intbacklog);listen()在执行调用过程中可为没有调用过bind()的套接字s完成所必需的连接,并建立长度为backlog的请求连接队列。backlog定义最大长度的socket等待队列。默认值为5.【4】connect(),accept()这两个系统调用用于完成一个完整相关的建立,其中connect()用于客户建立连接。accept()用于使服务器等待来自某客户进程的实际连接。=1\*GB3①connect功能:客户方调用发出的请求用法:intconnect(intsockfd,conststructctsockaddr*server_addr,socklen_taddrlen);在面向连接的协议中,该调用导致本地系统和外部系统之间连接实际建立。=2\*GB3②accept服务器调用,从等待从编号为s的套接字上接受客户连接请求用法:intaccept(ints,structsockaddr*addr,socklen_taddrlen);=3\*GB3③connect与accept的说明调用accept()后,服务器等待从编号为s的套接字上接受客户连接请求,连接请求是由客户方的connect()调用发出的。当有连接请求到达时,accept()调用将请求连接队列上的第一个客户方套接字地址及长度放入addr和addrlen,并创建一个与s有相同特性的新套接字号。新的套接字可用于处理服务器并发请求。【5】数据传输:send()write与recv()read()当一个连接建立以后,就可以传输数据了。常用的系统调用有send()和recv()。send()调用用于在参数s指定的已连接的数据报或流套接字上发送输出数据,格式如下:intsend(ints,void*buf,intlen,intflags);intrecv(ints,void*buf,intlen,intflags);recvsend可由文件系统调用readwrite所取代。在处理二进制数据处理时,后者优于前者。【6】关闭套接字:close()close()关闭套接字s,并释放分配给该套接字的资源;如果s涉及一个打开的TCP连接,则该连接被释放。close()的调用格式如下:intclose(ints);4.2MySQL数据库在Unix的使用1)MySql服务器2)MySql客户端3)MySql开发接口库MySQL服务配置◆mysqyld服务要运行起来。最好是设为开机自动启动。方法:◆chkconfig–level2345mysqldon◆ntsysv◆servicemysqldstartstoprestart◆图形方式MySQL客户端命令行工具MySqyl客户端命令行工具为mysql。其常用法为:mysql[OPTIONS][database]<script.sql>output.tab常用参数有:-?,--");保存结果result=mysql_store_result(&mysql);◆处理结果集while((row=mysql_fetch_row(result))){ fprintf(stdout,"%s|\t%s\n",row[0],row[2]); }mysql_free_result(result);清理数据mysql_close(&mysql);关闭连接}◆编译和链接方法编译链接时要使用-L和-l参数例如:cc-omysqlmysql.c -Lusrlibmysql-lmysqlclient五、调试与测试5.1调试方法1)安装组件:rpm–ivhmysql-devel*.rpm2)增加服务:vietcservicesS11245tcpS21246tcp3)连接数据库:mysql–uroot<mysql.script4)运行服务器:cc-oserverserver.c-Lusrlibmysql-lmysqlclient.servers15)运行中间件:cc–omiddlemiddle.c.middles2s1localhost6)运行客户端:cc–oclientclient.c.clients2localhost5.2测试结果分析及讨论1)MySQL数据库的相关截图编写mysql.script脚本文件,在文件中编写创建数据库library,在该数据库下创建admi、books、borrow、test表,并插入相应的数据,具体内容如下图所示。:数据库library中的相关表,如图所示:服务器通信过程中如图图4)运行客户端程序client.c,如图5.2.7所示:图5.2.75)实现查询图书功能6)实现用户登录功能,且实现了密码不回显功能,图9)实现用户还10)实现用户续11)实现用户注12)实现管理员登录,且实现了密码不回显功13)实现管理员查询图书功14)实现管理员增加图书功15)实现管理员删除图书功删除图书book10后再查询改图书,提示“未找到该图书”,说明确实删16)实现管理员六、设计中遇到的问题及解决方法这是我们第一次学习关于中间件的知识,对它的具体运行只是有一定程度的了解,不是很深刻,在设计中由于对UNIX知识的掌握不好,导致初期进度是相当的慢,在开始的几天里差不多就没有什么进度,后来通过我们小组成员的讨论、不断查阅资料及向老师请教,我们开始有了一点点的设计思路,设计过程中用到的知识不单单是课本上有的,还有的是课本上没介绍过的,因此这就需要我们多方的查阅资料和向老师请教。平时我们都习惯了使用Windows的编辑器,开始的时候由于UNIX的文档编辑和Windows有着很大的区别,UNIX是全字符编辑器,所以在初期使用UNIX进行的编辑的时候有点不知道该从那下手,后来经过学习知道在其编辑过程中我们可以使用终端通过命令来实现。还有在数据库的建立中,由于其基本程序中不带有数据库,一次我们必须自己建立一个数据库来存储信息,但是我们不知道怎样在客户端和主机程序中插入数据库,以此来存储图书信息,在指导老师和同学的帮助下,还有借助网络查了一些资料后终于解决了这一问题,等等。在编写好程序后,发现在管理员增加图书模块,只能连续的增加图书,不能退出该选项。在仔细研究代码后,我在管理员增加图书的代码后添加了break语句,成功的解决了错误。其次原先若输入比菜单中选项大的数字,系统没有识别错误,继续执行。为了解决这个错误,我在客户端的主菜单部分添加了if-else语句,对字符进行判断和错误处理,成功的解决了该错误。其实设计中遇到的问题远比这多很多,因为掌握知识的程度不同,各种各样的编程问题都会遇到,我们坚持不懈,通过不断的学习和查阅资料、向老师请教,最后通过努力完成了任务。七、源程序清单7.1数据库代码编写脚本文件mysql.script,并在脚本中编写如下内容:createdatabaselibrary;uselibrary;createtablebooks(idchar(10)notnullprimarykey,namechar(50)notnull,writerchar(50),storagechar(10));createtablereader(idchar(10)notnullprimarykey,namechar(50)notnull,passwordchar(15),enablechar(2)default"1");createtableadmi(idchar(10)notnullprimarykey,namechar(50)notnull,passwordchar(15));createtableborrow(r_idchar(10)notnull,b_idchar(10)notnull,b_datedate,statuschar(2),primarykey(b_id,r_id),foreignkey(b_id)referencesbooks(id)ondeletecascadeonupdatecascade,foreignkey(r_id)referencesreader(id)ondeletecascadeonupdatecascade);insertintobooksvalues("1","book1","a","5");insertintobooksvalues("2","book2","b","6");insertintobooksvalues("3","book3","c","6");insertintobooksvalues("4","book4","d","10");insertintobooksvalues("5","book5","e","9");insertintobooksvalues("6","book6","f","4");insertintobooksvalues("7","book7","g","7");insertintoreadervalues("00000","youke","123","1");insertintoadmivalues("11111","root","123");7.2服务器代码#include<stdio..=0;temp=(char*)malloc(strlen(buf));strcpy(temp,buf);p=temp;strtok_r(temp,";",&op);while((tmp=strtok_r(NULL,";",&op))!=NULL){p=tmp;while((tmp=strtok_r(p,",",&ip))!=NULL){strcpy(result[i][j],tmp);p=NULL;j++;}i++;j=0;}free(temp);}intopdb(char*cmd,char*p,intflag)operatedatabase{MYSQLmysql;MYSQL_RES*result;MYSQL_ROWrow;inti,j,n=0;charbuf[256];if(mysql_init(&mysql)==NULL){printf("dbiniterror!\n");return-1;}printf("Initdbsuccessfully!\n");if(!mysql_real_connect(&mysql,"localhost","root",0,"library",0,NULL,0)){printf("Connecterror!\n");mysql_close(&mysql);return-1;}printf("Connectdbsuccessfully!\n");printf("cmd=%s\n",cmd);if(mysql_query(&mysql,cmd)!=0){printf("querydatabasewrong!\n");mysql_close(&mysql);return-1;}if(flag==1){printf("bbbbbbbbbbbbb\n");if((result=mysql_store_result(&mysql))==NULL){mysql_free_result(result);mysql_close(&mysql);return-1;}n=mysql_num_rows(result);}i=0;j=0;if(p!=NULL){bzero(buf,sizeof(buf));while((row=mysql_fetch_row(result))){strcat(buf,";");strcat(buf,row[0]);for(i=1;i<mysql_num_fields(result);i++){strcat(buf,",");strcat(buf,row[i]);}}sprintf(p,"%d%s",n,buf);}if(flag==1){printf("aaaaaaaaaaaaaaaaaaaaa\n");mysql_free_result(result);}mysql_close(&mysql);printf("opdbsuccessfully!\n");printf("n=%d\n",n);returnn;}checkstat(charid[]){charcmd1[128],cmd2[128],cmd[128],buf[10];sprintf(cmd1,"select*fromborrowwhereto_days(now())-to_days(b_date)>30&&r_id=\"%s\"",id);sprintf(cmd2,"select*fromborrowwherer_id=\"%s\"",id);if((opdb(cmd1,NULL,1)==0)&&(opdb(cmd2,NULL,1)<4)){sprintf(cmd,"updatereadersetenable=\"1\"whereid=\"%s\"",id);opdb(cmd,NULL,0);}else{sprintf(cmd,"updatereadersetenable=\"0\"whereid=\"%s\"",id);opdb(cmd,NULL,0);}printf("Checkok!\n");}main(intargc,char**argv){structsockaddr_insin;structservent*sp;ints,ns,pid;charbuf[1024];char*service;if(argc!=1)service=argv[1];else{fprintf(stderr,"NOserviceassigned!\nUsage:\n");fprintf(stderr,"\t%sserver_name!\n",argv[0]);fprintf(stderr,"Note:server_nameisdefinedinfileetcservices\n");exit(-1);}if((sp=getservbyname(service,"tcp"))==NULL){fprintf(stderr,"Error:getservbyname");exit(-5);}if((s=socket(AF_INET,SOCK_STREAM,0))==-1){fprintf(stderr,"Error:socketcreate");exit(-6);}bzero(&sin,sizeof(sin));sin.sin_port=sp->s_port;if(bind(s,(structsockaddr*)&sin,sizeof(sin))==-1){fprintf(stderr,"Error:bind");close(s);exit(-6);}if(listen(s,5)==-1){fprintf(stderr,"Error:listen");close(s);exit(-6);}while(1){fprintf(stderr,"\n\t\t\tNowwaitconnect...\n");if((ns=accept(s,0,0))==-1){waitaconnection*fprintf(stderr,"error:accept");continue;}if((pid=fork())==-1){conneted,andthencreatechildprocfprintf(stderr,"server:forkerror!");close(s);exit(-1);}if(pid!=0){parentproce,nothingtodo,andtothenextloopclose(ns);wait(0);continue;}if(pid==0){enteredchildproccedureclose(s);printf("Receiveaclientconnect:\n");MYSQLmysql;MYSQL_RES*result;MYSQL_ROWrow;charcmd[128],buf[128];char*info[3];charname[50],writer[50];charid[50],password[50];charrec[10][10][50];char*b_id,*r_id;intn;chartmp[10][10][50];while(1){n=0;bzero(name,sizeof(name));bzero(id,sizeof(id));bzero(password,sizeof(password));bzero(writer,sizeof(writer));bzero(rec,sizeof(rec));bzero(tmp,sizeof(tmp));printf("******************************************************************\n");if((n=read(ns,buf,sizeof(buf)))<=0){printf("readwrong!\n");break;}buf[n]='\0';printf("receivemessage:%s\n",buf);if(strcmp(buf,"over")==0){printf("ClosedbyClient\n");break;}if(buf[1]==';'){switch(buf[0]) {case'c':updateuserinfogetm(buf,rec);checkstat(rec[0][0]);sprintf(cmd,"select*fromreaderwhereid=\"%s\"",rec[0][0]);n=opdb(cmd,buf,1);printf("userinfo=%s\n",buf);if((write(ns,buf,sizeof(buf)))<=0) {printf("Writesocketwrong!\n");break; }break;case'q':Querygetm(buf,rec);printf("buf=%s\n",buf);sprintf(cmd,"select*frombookswherenamelike\"%s%\"",rec[0][0]);n=opdb(cmd,buf,1);printf("Reply:%s\n",buf);if((write(ns,buf,sizeof(buf)))<=0){printf("Writesocketwrong!\n");break; }break;case'l':getm(buf,rec);checkstat(rec[0][0]);sprintf(cmd,"select*fromreaderwhereid=\"%s\"&&password=\"%s\"",rec[0][0],rec[0][1]);opdb(cmd,buf,1);printf("reply:%s\n",buf);if((write(ns,buf,strlen(buf)))<=0){printf("Writesocketerror!\n");break; }printf("Login\n");break;case'L':getm(buf,rec);sprintf(cmd,"select*fromadmiwhereid=\"%s\"&&password=\"%s\"",rec[0][0],rec[0][1]);opdb(cmd,buf,1);printf("reply:%s\n",buf);if((write(ns,buf,strlen(buf)))<=0) {printf("Writesocketerror!\n");break; }printf("Login\n");break;case'b':getm(buf,rec);sprintf(cmd,"select*fromborrowwherer_id=\"%s\"&&b_id=\"%s\"",rec[0][0],rec[0][1]);if(opdb(cmd,NULL,1)!=0) {printf("Haveborrowed!\n");buf[0]='1';buf[1]='\0';if((write(ns,buf,strlen(buf)))<=0) {printf("Writesocketerror!\n");break; }break; }sprintf(cmd,"select*frombookswhereid=\"%s\"&&storage=\"0\"",rec[0][1]);if(opdb(cmd,NULL,1)!=0) {buf[0]='2';if((write(ns,buf,strlen(buf)))<=0){printf("Writesocketerror!\n");break; }break; }printf("tmp=%s,%s\n",tmp[0][0],tmp[0][3]);printf("rec=%s,%s\n",rec[0][0],rec[0][1]);bzero(cmd,sizeof(cmd));sprintf(cmd,"insertintoborrowvalues(\"%s\",\"%s\",now(),\"1\")",rec[0][0],rec[0][1]);opdb(cmd,NULL,0);bzero(cmd,sizeof(cmd));sprintf(cmd,"updatebookssetstorage=storage-1whereid=\"%s\"",rec[0][1]);opdb(cmd,writer,0);buf[0]='0';buf[1]='\0';if((write(ns,buf,strlen(buf)))<=0){printf("Writesocketerror!\n");break; }printf("Borrowsuccessfully!\n");break;case'r':getm(buf,rec);printf("Onereturnrequest!\n");sprintf(cmd,"selectborrow.b_id,books.namefromborrow,bookswhereborrow.b_id=books.id&&borrow.r_id=\"%s\"",rec[0][0]);opdb(cmd,buf,1);printf("buf=%s\n",buf);n=write(ns,buf,strlen(buf));if(n<=0) {printf("writeerror!\n");break; }printf("sendn=%d\n",n);break;case'R':getm(buf,rec);sprintf(cmd,"deletefromborrowwherer_id=\"%s\"&&b_id=\"%s\"",rec[0][0],rec[0][1]);opdb(cmd,buf,0);sprintf(cmd,"updatebookssetstorage=storage+1whereid=\"%s\"",rec[0][1]);opdb(cmd,buf,0);checkstat(rec[0][0]);buf[0]='0';if(write(ns,buf,strlen(buf))<=0){printf("Writewrong!\n");exit(-1); }break;case'm':getm(buf,rec);printf("Onemoretimerequest!\n");sprintf(cmd,"selectborrow.b_id,books.name,borrow.b_date,date_add(borrow.b_date,interval30day),borrow.statusfromborrow,bookswhereborrow.b_id=books.id&&borrow.r_id=\"%s\"",rec[0][0]);opdb(cmd,buf,1);printf("buf=%s\n",buf);n=write(ns,buf,strlen(buf));if(n<=0){printf("writeerror!\n");break;}printf("sendn=%d\n",n);break;case'M':getm(buf,rec);sprintf(cmd,"updateborrowsetstatus=\"0\"wherer_id=\"%s\"&&b_id=\"%s\"",rec[0][0],rec[0][1]);opdb(cmd,buf,0);sprintf(cmd,"updateborrowsetb_date=date_add(b_date,interval30day)wherer_id=\"%s\"&&b_id=\"%s\"",rec[0][0],rec[0][1]);opdb(cmd,buf,0);checkstat(rec[0][0]);buf[0]='0';if(write(ns,buf,strlen(buf))<=0){printf("Writewrong!\n");exit(-1); }break;case'a':getm(buf,rec);sprintf(cmd,"select*frombookswhereid=\"%s\"",rec[0][0]);if(opdb(cmd,buf,1)!=0){if(write(ns,buf,strlen(buf))<=0) {printf("Writewrong!\n");break; }break; }sprintf(cmd,"insertintobooksvalues(\"%s\",\"%s\",\"%s\",\"%s\")",rec[0][0],rec[0][1],rec[0][2],rec[0][3]);opdb(cmd,buf,0);buf[0]='0';if(write(ns,buf,strlen(buf))<=0) {printf("Writewrong!\n");exit(-1); }break;case'd':getm(buf,rec);printf("Onedelrequest!\n");sprintf(cmd,"select*frombooks");opdb(cmd,buf,1);n=write(ns,buf,strlen(buf));if(n<=0){printf("writeerror!\n");break; }printf("buf=%s\n",buf);printf("sendn=%d\n",n);break;case'D':getm(buf,rec);sprintf(cmd,"deletefrombookswhereid=\"%s\"",rec[0][0]);opdb(cmd,buf,0);buf[0]='0';if(write(ns,buf,strlen(buf))<=0) {printf("Writewrong!\n");break; }break;default:break;}}}close(ns);exit(0);}}}7.3中间件程序#include<stdio..(intargc,char**argv){structuredefinedforrequestasaclientstructsin1;structservent*sp1;charsbuf[128];intss,spid;char*sservice,*sdest;structuredefinedforrequestasaserverstructsockaddr_insin;structservent*sp;ints,ns,pid,n;charbuf[128];char*service;testtheenvironmentparameter:lservice,dservice,server_nameif(argc==4){service=argv[1];sservice=argv[2];sdest=argv[3];}else{fprintf(stderr,"ParameterassignedError!\nUsage:\n");fprintf(stderr,"\t%slservicedserviceserver_name!\n",argv[0]);fprintf(stderr,"Note:server_nameisdefinedinfileetc");fprintf(stderr,"and:lservicedservicearedefinedinfileetcservices\n");exit(-1);}if((sp=getservbyname(service,"tcp"))==NULL){fprintf(stderr,"Error:getservbyname");exit(-5);}if((s=socket(AF_INET,SOCK_STREAM,0))==-1){fprintf(stderr,"Error:socketcreate");exit(-6);}bzero(&sin,sizeof(sin));sin.sin_port=sp->s_port;if(bind(s,(structsockaddr*)&sin,sizeof(sin))==-1){fprintf(stderr,"Error:bind");close(s);exit(-6);}if(listen(s,5)==-1){fprintf(stderr,"Error:listen");close(s);exit(-6);}while(1){fprintf(stderr,"\n\t\t\tNowwaitconnect...\n");if((ns=accept(s,0,0))==-1){waitaconnection*fprintf(stderr,"error:accept");continue;}if((pid=fork())==-1){conneted,andthencreatechildprocfprintf(stderr,"server:forkerror!");close(s);exit(-1); }if(pid!=0){parentproce,nothingtodo,andtothenextloopclose(ns);wait(0);continue; }if(pid==0){enteredchildproccedureclose(s);if((sp1=getservbyname(sservice,"tcp"))==NULL){fprintf(stderr,"Error:getservbynames1");exit(-5); }if((_addr,_family=_port=sp1->s_port;if((ss=socket(AF_INET,SOCK_STREAM,0))==-1){fprintf(stderr,"Error:sockets1");exit(-6); }if(connect(ss,(structsockaddr*)&sin1,sizeof(sin1))==-1){fprintf(stderr,"Error:connects1");close(ss);exit(-6); }printf("Receiveaclientconnect:%s\n",argv[1]);while(1) {bzero(buf,sizeof(buf));if((n=read(ns,buf,sizeof(buf))<=0)){fprintf(stderr,"Readnothingfromsocket:ns\n");close(ns);exit(-3); }printf("datafromclient:%s\n",buf);requestmessagegotfromtheClient.printf("datatoserver:%s\n",buf);if(write(ss,buf,strlen(buf))!=strlen(buf)){toserverfprintf(stderr,"WriteSocketssERROR!s1\n");close(ss);exit(-1); }if(strcmp(buf,"over")==0)break;bzero(buf,sizeof(buf));if((n=read(ss,buf,sizeof(buf)))==0){fromserverfprintf(stderr,"ReadSocketssError!s1\n");close(ss);exit(-2); }printf("datafromserver:%s\n",buf);EndtheCommunicationwithmyServerNext2Line,buildareplayMessagebuf,andwriteitbackprintf("datatoclient:%s\n",buf);if(write(ns,buf,strlen(buf))!=strlen(buf)){fprintf(stderr,"Writesocketnserror!\n");close(ns);exit(-4); } }close(ss);close(ns);exit(0);}}}7.4客户端程序#include<stdio..(intargc,char**argv){structsin;通用地址结构sockaddrstructservent*sp;服务器数据结构serventcharbuf[50];ints,pid;char*service,*dest;1检查命令行参数个数if(argc!=1){ service=argv[1]; dest=argv[2]; }else{fprintf(stderr,"NOserviceassigned!\nUsage:");fprintf(stderr,"%sservice_namedestination!\n",argv[0]);fprintf(stderr,"Note:service_nameisdefinedinetcservices\n");fprintf(stderr,"destinationisdefinedinetc");exit(-1);}2获得服务信息if((sp=getservbyname(service,"tcp"))==NULL){fprintf(stderr,"Error:getservbyname");exit(-5);}3获得(服务器)主机信息if((,sizeof(sin));首先清0b
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 新疆维吾尔自治区喀什地区莎车县2024-2025学年高二上学期1月期末考试物理试题(含答案)
- 2024-2025学年重庆市酉阳县八年级(上)期末历史试卷(含答案)
- 2019-2025年消防设施操作员之消防设备中级技能考前冲刺模拟试卷B卷含答案
- 2020年中考生物试题(含答案)
- 遗产继承遗嘱代办合同(2篇)
- 采购与供应链分包合同(2篇)
- 2025年大学英语四级考试模拟试卷一
- 艾滋病相关知识培训课件
- 2025年法律知识竞赛试题库判断题及答案(共100题)
- 交通枢纽开发协议
- 中华人民共和国文物保护法
- 小学五年级体育教案全册(人教版)
- 2024《整治形式主义为基层减负若干规定》全文课件
- 理性与感性议论文900字(通用范文3篇)
- 【小学语文 】鲁滨逊漂流记导读课(课件)六年级下册语文部编版
- GB/T 7999-2007铝及铝合金光电直读发射光谱分析方法
- 收支管理内部控制流程图
- 《企业员工培训国内外文献综述》4800字
- 华中科技大学复变函数试题(一)
- 三年级下册数学教案-速度、时间和路程 沪教版
- 徽派建筑PPT江西婺源
评论
0/150
提交评论