综合例程.docx
- 文档编号:27522802
- 上传时间:2023-07-02
- 格式:DOCX
- 页数:24
- 大小:56.18KB
综合例程.docx
《综合例程.docx》由会员分享,可在线阅读,更多相关《综合例程.docx(24页珍藏版)》请在冰豆网上搜索。
综合例程
综合例程
1.客户机发送256个字符,服务器将这256个字符颠倒顺序然后返回。
服务器:
#include
#include
#include
#include
#include
#defineSERVER_PORT8086
#defineBACKLOG5
voidserv_respon(intsockfd)
{
intnbytes;
charbuf_recv[1024];
charbuf_send[1024];
nbytes=read_all(sockfd,buf_recv,256);
if(nbytes==0)
return;
elseif(nbytes<0)
{
fprintf(stderr,"Readerror");
exit
(1);
}
char*pc_recv=buf_recv+255;
char*pc_send=buf_send;
for(inti=0;i<256;i++)
{
*pc_send=*pc_recv;
pc_send++;
pc_recv--;
}
nbytes=write_all(sockfd,buf_send,256);
if(nbytes<0)
{
fprintf(stderr,"Writeerror");
exit
(1);
}
}
intmain(intargc,char*argv[])
{
intlistenfd,connfd;
structsockaddr_inservaddr;
listenfd=socket(AF_INET,SOCK_STREAM,0);
if(listenfd<0)
{
fprintf(stderr,"Socketerror");
exit
(1);
}
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family=AF_INET;
servaddr.sin_addr.s_addr=htonl(INADDR_ANY);
servaddr.sin_port=htons(SERVER_PORT);
if(bind(listenfd,(structsockaddr*)&servaddr,sizeof(servaddr))<0)
{
fprintf(stderr,"Binderror");
exit
(1);
}
if(listen(listenfd,BACKLOG)<0)
{
fprintf(stderr,"Listenerror");
exit
(1);
}
for(;;)
{
connfd=accept(listenfd,NULL,NULL);
if(connfd<0)
{
fprintf(stderr,"Accepterror");
exit
(1);
}
serv_respon(connfd);
close(connfd);
}
close(listenfd);
}
客户机:
#include
#include
#include
#include
#include
#defineSERVER_PORT8086
voidcli_requ(intsockfd)
{
charbuf[1024];
intn;
for(inti=0;i<256;i++)
{
buf[i]=random(256);
}
intnbytes=write_all(sockfd,buf,256);
if(nbytes<0)
{
fprintf(stderr,"Writeerror");
exit
(1);
}
nbytes=read_all(sockfd,buf,512);
if(nbytes<0||nbytes==0)
{
fprintf(stderr,"Readerror");
exit
(1);
}
}
intmain(intargc,char*argv[])
{
intsockfd;
structsockaddr_inservaddr;
sockfd=socket(AF_INET,SOCK_STREAM,0);
if(sockfd<0)
{
fprintf(stderr,"Socketerror");
exit
(1);
}
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family=AF_INET;
servaddr.sin_port=htons(SERVER_PORT);
if(inet_aton(argv,&servaddr.sin_addr)==0)
{
fprintf(stderr,"Inet_atonerror");
exit
(1);
}
if(connect(sockfd,(structsockaddr*)&servaddr,sizeof(servaddr))<0)
{
fprintf(stderr,"Connecterror");
exit
(1);
}
cli_requ(sockfd);
close(sockfd);
}
2.客户机发送256个整数,服务器将这256个整数中>100的数字挑出来,计算其平均值,然后将挑出来的数字和他们的平均值一起返回给客户机。
(返回数据序列:
个数、数据1、数据2、…、数据n、平均值)note:
整数要注意什么?
为什么要用双指针?
服务器:
#include
#include
#include
#include
#include
#defineSERVER_PORT8086
#defineBACKLOG5
voidserv_selectbigger(intsockfd)
{
intnbytes;
intbuf_recv[1024];
intbuf_send[1024];
for(;;)
{
nbytes=read_all(sockfd,buf_recv,256*sizeof(int));
if(nbytes<0||nbytes==0)
{
fprintf(stderr,"Readerror");
exit
(1);
}
for(inti=0;i<256;i++)//字节顺序
{
buf_recv[i]=ntohs(buf_recv[i]);
}
intj=0;
for(inti=0;i<256;i++)//大于100的计数,并保存起来等待发送;
{
if(buf_recv[i]>100)
{
j++;
buf_send[j]=buf_recv[i];
}
}
buf_send[0]=j;//数组第一个值存有大于100的数的个数
intavg=0;
for(inti=0;i<=j;i++)//计算平均值
{
avg+=buf_send[i+1];
}
if(j>0)
avg=avg/j;
else
avg=0;
buf_send[j+1]=avg;
for(inti=0;i { buf_send[i]=htons(buf_send[i]); } nbytes=write_all(sockfd,buf_send,(j+2)*sizeof(int)); if(nbytes<0||nbytes==0) { fprintf(stderr,"Writeerror"); exit (1); } } } intmain() { intlistenfd,connfd; structsockaddr_inservaddr; listenfd=socket(AF_INET,SOCK_STREAM,0); if(listenfd<0) { fprintf(stderr,"Socketerror"); exit (1); } bzero(&servaddr,sizeof(servaddr)); servaddr.sin_family=AF_INET; servaddr.sin_addr.s_addr=htonl(INADDR_ANY); servaddr.sin_port=htons(SERVER_PORT); if(bind(listenfd,(structsockaddr*)&servaddr,sizeof(servaddr))<0) { fprintf(stderr,"Binderror"); exit (1); } if(listen(listenfd,BACKLOG)<0) { fprintf(stderr,"Listenerror"); exit (1); } for(;;) { connfd=accept(listenfd,NULL,NULL); if(connfd<0) { fprintf(stderr,"Accepterror"); exit (1); } serv_selectbigger(connfd); close(connfd); } close(listenfd); } 客户机: #include #include #include #include #include #defineSERVER_PORT8086 boolselectbigger(int*buf,intlen_in,int**ppn_out,int*piLen_out) { intsockfd; structsockaddr_inservaddr; intbuf_recv[1024]; sockfd=socket(AF_INET,SOCK_STREAM,0); if(sockfd<0) { fprintf(stderr,"Socketerror"); returnfalse; } bzero(&servaddr,sizeof(servaddr)); servaddr.sin_family=AF_INET; servaddr.sin_port=htons(SERVER_PORT); if(inet_aton(“192.168.0.1”,&servaddr.sin_addr)==0) { fprintf(stderr,"Inet_atonerror"); returnfalse; } if(connect(sockfd,(structsockaddr*)&servaddr,sizeof(servaddr))<0) { fprintf(stderr,"Connecterror"); close(sockfd); returnfalse; } int*pbuf=buf;//buf从函数外面传进来的,需要发送给服务器端 //pbuf只是用于转换字节顺序 intn; for(inti=0;i { n=htons(*pbuf); *pbuf=n; pbuf++; } char*pc=(char*)buf;//buf从函数外面传进来的,需要发送给服务器端 intnbytes=write(sockfd,pc,256*sizeof(int));//这里传送是buf的char*强制转换 //而没有传送上面已经进行转换过的pbuf! if(nbytes<=0) { fprintf(stderr,"Writeerror"); close(sockfd); returnfalse; } pc=(char*)buf_recv;//pc是经过char*强制转换的, nbytes=read(sockfd,pc,256*sizeof(int));//pc得到了从服务器传回来的数据 if(nbytes<=0) { fprintf(stderr,"Readerror"); close(sockfd); returnfalse; } *piLen_out=nbytes/sizeof(int); *ppn_out=newint[*piLen_out]; int*pn=*ppn_out; for(inti=0;i<*piLen_out;i++)//这里的pn也是用于转换字节顺序 { n=ntohs(*buf_recv);//这里,buf_recv指针的内容和pc指针的内容是一样的, //只不过buf_recv是int*,所以需要转换才存入*pn; *pn=n;//。 pn++; buf_recv++; close(sockfd); returntrue; } intmain() { intbuf[1024]; int**ppn; int*plen; for(inti=0;i<256;i++) { buf[i]=random(2048); } if(! selectbigger(buf,256,ppn,plen)) exit (1); if(*ppn==NULL) exit (2); int*pn=*ppn;//*ppn传回来的是从服务器收到的数据存在的数组地址 //用双指针就是为了方便操作数组的指针, //否则在函数内新建立的*ppn_out=newint[*piLen_out];就传不出来 printf(“Thelengthis: %d\n”,*pn); for(inti=1;i<*plen-2;i++) { pn++; printf(“Thenumberis: %d\n”,*pn); } pn++; printf(“Theaverageis: %d\n”,*pn); if(*ppn! =NULL) delete*ppn; } 3.找出两个自然数之间的所有质数,并计算其平均值,其中寻找质数、平均值计算由两个不同的服务器完成。 Note: 采用怎样的层次结构? 应用程序的通信协议。 客户机: #include #include #include #include #include #defineSERVER_ADDR1"192.168.0.1" #defineSERVER_ADDR2"192.168.0.2" #defineSERVER_PORT18081 #defineSERVER_PORT28082 //获得nBegin,nEnd之间的所有质数,质数的个数作为返回值,质数放在*ppnData开始的//数组中,若函数出错,则返回负值。 intget_the_Data(intnBegin,intnEnd,int**ppnData)//把nBegin,nEnd发送给服务 //器,由服务器计算之间的质数,接收返回的值。 { intsockfd; structsockaddr_inservaddr; sockfd=socket(AF_INET,SOCK_STREAM,0); if(sockfd<0) return-1; bzero(&servaddr,sizeof(servaddr)); servaddr.sin_family=AF_INET; servaddr.sin_port=htons(SERVER_PORT1); if(inet_aton(SERVER_ADDR1,&servaddr.sin_addr)==0) return–1; if(connect(sockfd,(structsockaddr*)&servaddr,sizeof(servaddr))<0) { close(sockfd); return–1; } intnBuf[3]; nBuf[0]=htonl (1);//函数代码,服务器可扩展成为一组功能,这有些像客户与服务器之//间的通信协议了。 nBuf[1]=htonl(nBegin); nBuf[2]=htonl(nEnd); intnbytes=write_all(sockfd,(char*)nBuf,3*sizeof(int)); if(nbytes<=0) {close(sockfd);return-1;} int*pnBuf=newint[1024];//收到服务器计算好的质数 nbytes=read_all(sockfd,(char*)pnBuf,1024*sizeof(int)); if(nbytes<=0||nByte%sizeof(int)! =0) {close(sockfd);return-1;} intnNum=nBytes/sizeof(int); if(nNum==0) {close(sockfd);return0;} *ppnData=newint[nNum];//得到数的个数 int*pData=*ppnData; for(inti=0;i //存入int*pData=*ppnData;自然通过函数就传到函数外。 { *pData=ntohl(*pnBuf); pData++; pnBuf++; } close(sockfd); returnnNum; } intget_the_Avg(intnNum,int*pnData);//把收到的质数再发送给第二个服务器, //并等待其计算好平均数再传送回来; { intsockfd; structsockaddr_inservaddr; sockfd=socket(AF_INET,SOCK_STREAM,0); if(sockfd<0) return-1; bzero(&servaddr,sizeof(servaddr)); servaddr.sin_family=AF_INET; servaddr.sin_port=htons(SERVER_PORT2); if(inet_aton(SERVER_ADDR2,&servaddr.sin_addr)==0) return–1; if(connect(sockfd,(structsockaddr*)&servaddr,sizeof(servaddr))<0) {close(sockfd);return–1;} int*pnData1=pnData; *pnData1=htonl (2);//函数代码,用于与函数通信的协议 for(inti=0;i { pnData1++; *pnData1=htonl(*pnData1); } intnbytes=write_all(sockfd,(char*)pnData,(nNum+1)*sizeof(int)); if(nbytes<=0) {close(sockfd);return-1;} intnAvg; nbytes=read_all(sockfd,(char*)&nAvg,sizeof(int));//服务器直接返回平均值, //这个平均值的计算应该比较简单; if(nByte! =sizeof(int)) {close(sockfd);return-1;} nAvg=ntohl(nAvg); close(sockfd); returnnAvg; } voidmain() { intnBegin,nEnd,nAvg; scanf("%d\n",&nBegin); scanf("%d\n",&nEnd); int**ppnData=NULL;//**ppnData中放数据 intnNum=get_the_Data(nBegin,nEnd,ppnData); if(nNum<0) { printf("Thedatacannotbegotten."); exit (1); } elseif(nNum==0) { printf("Thereisnoanydatabetween%dand%d.",nBegin,nEnd); exit (1); } nAvg=get_the_Avg(nNum,*ppnData); if(nAvg<0) { printf("Thedatacannotbegotten."); exit (1); } printf("Theavgis%d.",nAvg); if(*ppnData! =NULL) delete*ppnData; } 服务器1: #include #include #include #include #include #defineSERVER_PORT8080 #defineBACKLOG5 voidserv_respon(intsockfd)// { intnbytes; intbuf_recv[1024]; intbuf_send[1024]; for(;;)//从客户端收到一串int,存入buf_recv,并进行字节转换; { nbytes=read(sockfd,(char*)buf_recv,1024*sizeof(int)); if(nbytes<=0||nbytes%sizeof(int)! =0) return; intnNum=nbytes%sizeof(in
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 综合 例程
![提示](https://static.bdocx.com/images/bang_tan.gif)