電子科技大學(xué)網(wǎng)絡(luò)編程作業(yè)(IO復(fù)用)4_第1頁
電子科技大學(xué)網(wǎng)絡(luò)編程作業(yè)(IO復(fù)用)4_第2頁
電子科技大學(xué)網(wǎng)絡(luò)編程作業(yè)(IO復(fù)用)4_第3頁
電子科技大學(xué)網(wǎng)絡(luò)編程作業(yè)(IO復(fù)用)4_第4頁
電子科技大學(xué)網(wǎng)絡(luò)編程作業(yè)(IO復(fù)用)4_第5頁
免費(fèi)預(yù)覽已結(jié)束,剩余8頁可下載查看

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

電子科技大學(xué)網(wǎng)絡(luò)編程作業(yè)(IO復(fù)用)4電子科技大學(xué)網(wǎng)絡(luò)編程作業(yè)(IO復(fù)用)4電子科技大學(xué)網(wǎng)絡(luò)編程作業(yè)(IO復(fù)用)4......網(wǎng)絡(luò)編程作業(yè)4作業(yè)要求:服務(wù)器利用I/O復(fù)用技術(shù),實(shí)現(xiàn)同時(shí)向多個(gè)客戶供應(yīng)服務(wù)。要求:服務(wù)器:接收客戶連接央求,并打印客戶IP地址及端口號(hào),爾后接收客戶發(fā)來的字符串,并打印該字符串和其來自與哪個(gè)客戶。同時(shí)向客戶返回該字符串。當(dāng)某一客戶斷開連接時(shí),要求服務(wù)器打印該客戶輸入的所有字符??蛻簦簭拿钚薪邮辗?wù)器地址,并向服務(wù)器倡導(dǎo)連接央求,連接成功后,從標(biāo)準(zhǔn)輸入接收字符串并發(fā)送給服務(wù)器,等待服務(wù)器響應(yīng)并打印接收的信息。程序:服務(wù)器端:#include<stdlib.h>#include<string.h>#include<stdio.h>#include<unistd.h>#include<pthread.h>#include<sys/types.h>#include<sys/socket.h>#include<netinet/in.h>#include<arpa/inet.h>專業(yè).專注.......#definePORT9999#defineBACKLOG5#defineMAXDATASIZE1000typedefstructCLIENT{intfd;char*name;structsockaddr_inaddr;char*data;}CLIENT;voidprocess_cli(structCLIENT*client,char*recvbuf,intlen);voidsavedata(char*recvbuf,intlen,char*data);intmain(void){inti,maxi,maxfd,sockfd;intnready;ssize_tn;fd_setrset,allset;intlistenfd,connectfd;structsockaddr_inserver;structCLIENTclient[FD_SETSIZE];charrecvbuf[MAXDATASIZE];intsin_size;專業(yè).專注.......if((listenfd=socket(AF_INET,SOCK_STREAM,0))==-1){perror("Createsocketfailed.");exit(-1);}intopt=SO_REUSEADDR;setsockopt(listenfd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt));bzero(&server,sizeof(server));server.sin_family=AF_INET;server.sin_port=htons(PORT);server.sin_addr.s_addr=htonl(INADDR_ANY);if(bind(listenfd,(structsockaddr*)&server,sizeof(structsockaddr))==-1){perror("Binderror.");exit(-1);}if(listen(listenfd,BACKLOG)==-1){perror("listenerror.");專業(yè).專注.......exit(-1);}sin_size=sizeof(structsockaddr_in);maxfd=listenfd;maxi=-1;for(i=0;i<FD_SETSIZE;i++)client[i].fd=-1;FD_ZERO(&allset);FD_SET(listenfd,&allset);while(1){structsockaddr_inaddr;rset=allset;nready=select(maxfd+1,&rset,NULL,NULL,NULL);if(FD_ISSET(listenfd,&rset)){if((connectfd=accept(listenfd,(structsockaddr*)&addr,&sin_size))==-1){perror("accepterror.");continue;}for(i=0;i<FD_SETSIZE;i++){if(client[i].fd<0){專業(yè).專注.......client[i].fd=connectfd;client[i].name=malloc(sizeof(char)*MAXDATASIZE);client[i].addr=addr;client[i].data=malloc(sizeof(char)*MAXDATASIZE);client[i].name[0]='\0';client[i].data[0]='\0';printf("Yougotaconnectfrom%s:%d.\n",inet_ntoa(client[i].addr.sin_addr),client[i].addr.sin_port);send(connectfd,"Welcome\n",22,0);break;}}if(i==FD_SETSIZE)printf("toomanycllients.\n");FD_SET(connectfd,&allset);if(connectfd>maxfd)maxfd=connectfd;if(i>maxi)maxi=i;專業(yè).專注.......if(--nready<=0)continue;}for(i=0;i<=maxi;i++){if((sockfd=client[i].fd)<0)continue;if(FD_ISSET(sockfd,&rset)){if((n=recv(sockfd,recvbuf,MAXDATASIZE,0))==0){close(sockfd);printf("Client(%s)closedconnection.Userdata:%s\n",client[i].name,client[i].data);FD_CLR(sockfd,&allset);client[i].fd=-1;free(client[i].name);free(client[i].data);}elseprocess_cli(&client[i],recvbuf,n);if(--nready<=0)break;}}}close(listenfd);}專業(yè).專注.......voidprocess_cli(CLIENT*client,char*recvbuf,intlen){inti1;charsendbuf[MAXDATASIZE];recvbuf[len]='\0';if(strlen(client->name)==0){memcpy(client->name,recvbuf,len);printf("Client'snameis%s.\n",client->name);return;}printf("Receivedclient(%s)message:%s\n",client->name,recvbuf);savedata(recvbuf,len,client->data);for(i1=0;i1<len-1;i1++){sendbuf[i1]=recvbuf[len-i1-2];}sendbuf[len-1]='\0';send(client->fd,sendbuf,strlen(sendbuf),0);}voidsavedata(char*recvbuf,intlen,char*data)專業(yè).專注.......{intstart=strlen(data);inti;for(i=0;i<len;i++){data[start+i]=recvbuf[i];}}客戶端:#include<unistd.h>#include<stdio.h>#include<string.h>#include<stdlib.h>#include<sys/socket.h>#include<netinet/in.h>#include<netdb.h>#definePORT9999#defineMAXDATASIZE100intmain(intargc,char*argv[]){intfd,numbytes;charbuf[MAXDATASIZE];structhostent*he;專業(yè).專注.......structsockaddr_inserver;inti=1;if(argc!=2){printf("Usage:%s<IPaddress>\n",argv[0]);exit(-1);}if((he=gethostbyname(argv[1]))==NULL){perror("gethostbynameerror.");exit(-1);}if((fd=socket(AF_INET,SOCK_STREAM,0))==-1){perror("Createsocketfailed.");exit(1);}bzero(&server,sizeof(server));server.sin_family=AF_INET;專業(yè).專注.......server.sin_port=htons(PORT);server.sin_addr=*((structin_addr*)he->h_addr);if(i=connect(fd,(structsockaddr*)&server,sizeof(structsockaddr))==-1){perror("connectfailed.");exit(1);}if(((numbytes=recv(fd,buf,MAXDATASIZE,0))==-1)){perror("recverror.");exit(1);}buf[numbytes]='\0';printf("ServerMessage:%s",buf);printf("Pleaseinputyourname:");scanf("%s",buf);if(((numbytes=send(fd,buf,strlen(buf),0))==-1)){perror("senderror.");專業(yè).專注.......exit(1);}while(1){printf("Pleaseinputmessage(maxchar:%d):",MAXDATASIZE);scanf("%s",buf);if(strlen(buf)<1)i=0;if(((nu

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論