下載本文檔
版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 外貿(mào)運(yùn)費(fèi)說明話術(shù)
- 廠房消防施工要求
- 刑事培訓(xùn)課件
- 分賬技術(shù)講解
- 跨區(qū)域業(yè)務(wù)協(xié)調(diào)與信息共享平臺(tái)
- 企業(yè)培訓(xùn)課程效果評(píng)估問卷模板
- 皖西中學(xué)招聘2026屆應(yīng)屆公費(fèi)師范畢業(yè)生備考題庫及答案詳解一套
- 分形技術(shù)與石油
- 課件培訓(xùn)輕音樂文案
- 骨質(zhì)疏松癥的藥物治療策略
- 人教版九年級(jí)物理上學(xué)期期末復(fù)習(xí)(知識(shí)速記+考點(diǎn)突破+考點(diǎn)練習(xí)題)含答案
- 電梯更新改造方案
- GB/T 70.4-2025緊固件內(nèi)六角螺釘?shù)?部分:降低承載能力內(nèi)六角平圓頭凸緣螺釘
- 2026年安徽國防科技職業(yè)學(xué)院單招職業(yè)適應(yīng)性考試題庫及完整答案詳解1套
- 2026年電商年貨節(jié)活動(dòng)運(yùn)營方案
- 2025秋粵教粵科版(新教材)小學(xué)科學(xué)二年級(jí)上冊(cè)知識(shí)點(diǎn)及期末測試卷及答案
- 譯林版英語六年級(jí)上冊(cè)專題05 首字母填詞100題專項(xiàng)訓(xùn)練含答案
- 醫(yī)院信息系統(tǒng)零信任訪問控制方案
- 2025年7月國開電大專科《公共行政學(xué)》期末紙質(zhì)考試試題及答案
- 2025年安徽省公務(wù)員考試申論真題及參考答案
- 耳穴壓豆治療失眠
評(píng)論
0/150
提交評(píng)論