网络编程答案.docx
- 文档编号:5758026
- 上传时间:2023-01-01
- 格式:DOCX
- 页数:11
- 大小:31.04KB
网络编程答案.docx
《网络编程答案.docx》由会员分享,可在线阅读,更多相关《网络编程答案.docx(11页珍藏版)》请在冰豆网上搜索。
网络编程答案
2003网络编程答案
一、单项选择题(10分)
1②2③3③4②5①6③7④8①9①10①
二、简答题(25分)
1.请给出利用Socket接口实现面向连接的网络编程模型。
2.网络编程时,为什么要考虑字节顺序问题?
不同机器表示数据的字节顺序是不同的(答出这即可,答下面也可)
Intel芯片:
低字节在前,高字节在后,称little-endian;
RISC芯片:
高字节在前,低字节在后,称big-endian,
3.在使用UDP套接字时也可以使用connect()函数,连接UDP套接字有哪些特点?
答:
使得在无连接UDP通信中,发送(send)时不用带有目的地址,接收(read)时不用带原地址。
4.服务器经常使用什么绑定方式,为什么?
绑定方式:
INADDR_ANY(或绑定任意地址也可)
这样服务器可接收发到它的任意IP地址(或网络接口卡)的数据。
5.试比较pipe和UNIX域套接字的差异。
Pipe:
单向通信(或单工通信);
UNIX域套接字:
双向通信(或双工通信);
三、(8分)当服务器采用并发服务器进行有连接的通信时,采用以下程序段的编程模式来处理应用,请将程序的空白处完善。
intsockfd,newsockfd;
if((sockfd=socket(…)<0)
Err_sys(“socketerror.”);
if(bind(sockfd,…)<0)
Err_sys(“error.”);
if(listen(sockfd,5)<0)
Err_sys(“error.”);
for(;;)
{
newsockfd=accept(sockfd,…);
if(newsockfd<0)
Err_sys(“error.”);
If(fork()==0)
{
close(sockfd);
…
doit(newsockfd);//用newsockfd处理具体连接请求
exit(0);
}
close(newsockfd);
}
四、(7分)在一个采用数据流通信的管套sock上进行读操作的程序代码如下,请将程序的空白处完善。
#include
#include
#include
#include
…
rc=read(sock,buf,size);
if(rc>0)
{/*读操作正确并返回数据*/
write(fd,buf,rc);
}elseif(rc==0)
{…
close(fd);
close(sock);
}
else{/*读操作可能错误*/
if(errno==EINTR)
{
/*继续读数据 */
…
}
else{fprintf(stderr,”readerror:
%d\n”,errno)
exit
(1);
}
}
五、完成如下服务器和客户机的编程工作(15分)
基于有连接的通信方式,客户机产生两个随机数,发给两个服务器。
服务器1(IP地址:
192.168.0.1,Port:
3254)将这两个随机数相加;服务器2(IP地址:
192.168.0.10,Port:
3255),将这两个随机数相减。
两个服务器分别将运算结果返回给客户机,客户机显示回传结果。
客户机:
#include
#include
#include
#include
#include
#defineSERVER_ADDR1"192.168.0.1"
#defineSERVER_ADDR2"192.168.0.10"
#defineSERVER_PORT13254
#defineSERVER_PORT23255
//获得nBegin,nEnd之间的所有质数,质数的个数作为返回值,质数放在*ppnData开始的//数组中,若函数出错,则返回负值。
intget_the_Data(intnBegin,intnEnd,int**ppnData)
{
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);//8080
if(inet_aton(SERVER_ADDR1,&servaddr.sin_addr)==0)//"192.168.0.1"
return–1;
if(connect(sockfd,(structsockaddr*)&servaddr,sizeof(servaddr))<0)
return–1;
intnBuf[3];
nBuf[0]=htonl
(1);//函数代码
nBuf[1]=htonl(nBegin);
nBuf[2]=htonl(nEnd);
intnbytes=write(sockfd,(char*)nBuf,3*sizeof(int));
if(nbytes<=0)
{close(sockfd);return-1;}
int*pnBuf=newint[1024];
nbytes=read(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 { *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);//8081 if(inet_aton(SERVER_ADDR2,&servaddr.sin_addr)==0)//"192.168.0.2" return–1; if(connect(sockfd,(structsockaddr*)&servaddr,sizeof(servaddr))<0) return–1; int*pnData1=pnData; *pnData1=htonl (2);//函数代码 for(inti=0;i { *pnData1=htonl(*pnData1); pnData1++; } intnbytes=write(sockfd,(char*)pnData,(nNum+1)*sizeof(int)); if(nbytes<=0) {close(sockfd);return-1;} intnAvg; nbytes=read(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; 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) {deleteppnData;ppnData=NULL;} } 服务器1: #include #include #include #include #include #defineSERVER_PORT8080 #defineBACKLOG5 voidserv_respon(intsockfd) { intnbytes; intbuf_recv[1024]; intbuf_send[1024]; for(;;) { nbytes=read(sockfd,(char*)buf_recv,1024*sizeof(int)); if(nbytes<=0||nbytes%sizeof(int)! =0) return; intnNum=nbytes%sizeof(int); int*pn=buf_recv; for(inti=0;i { *pn=ntohl(*pn); pn++; } int**ppnData=NULL; if(buf_recv[0]==1)//函数代号,get_the_Data { nNum=get_the_Data(buf_recv[1],buf_recv[2],ppnData); if(nNum<0) return; } elseif(buf_recv[0]==2)//函数代号,其它 { ……… } …… int*pnData=*ppnData; for(inti=0;i { buf_send[i+1]=htonl(*pnData); pnData++; } delete*ppnData; buf_send[0]=htonl(nNum); nbytes=write(sockfd,(char*)buf_send,(nNum+1)*sizeof(int)); if(nbytes==0) return; elseif(nbytes<0) { fprintf(stderr,"Writeerror"); exit (1); } } } intget_the_Data(intnBegin,intnEnd,int**ppnData) { if(nBegin<=0||nEnd<=0||nEnd return–1; intnNum=0; for(inti=nBegin;i { boolb=true; for(intj=2;j { if(i%j==0) {b=false;break;} } if(b) {nNum++;} } if(nNum==0) return0; *ppnData=newint[nNum]; int*pnData=*ppnData; for(inti=nBegin;i { boolb=true; for(intj=2;j { if(i%j==0) {b=false;break;} } if(b){nNum++;*pnData=i;} } returnnNum; } intmain() { //与例1相同 …… } 服务器2: 与服务器1类似。 六、(15分)编程产生子进程、孙进程(即子进程的子进程),并使进程按“孙-子-父”的顺序结束。 Intson_pid; Intfrandson_pid; If(son_pid=fork()==0) {//儿进程 If(grandson_pid=fork()==0) {//孙进程 exit(); } else {//儿进程 wait(); exit(); } } else{//父进程 wait(); exit(); }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 网络 编程 答案