




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
S10、并發(fā)程序-套接字通信S10、并發(fā)程序-套接字通信S10、并發(fā)程序-套接字通信1、套接字通信服務(wù)器程序sockserver.c:S10、并發(fā)程序-套接字通信#include<unistd.h>#include<sys/types.h>#include<sys/socket.h>#include<netinet/in.h>#include<signal.h>#include<stdio.h>#include<stdlib.h>#include<string.h>#include<pthread.h>#include<semaphore.h>#defineLinkNum5 //連接數(shù)intclient_sockfd[LinkNum]; /*分別記錄服務(wù)器端的套接字與連接的多個(gè)客戶端的套接字*/intserver_sockfd=-1; //命名套接字intcurLink=0; //當(dāng)前連接數(shù)sem_tmutex; //表示連接數(shù)的資源信號量charstopmsg[100]; //服務(wù)器端發(fā)送消息緩沖區(qū)S10、并發(fā)程序-套接字通信voidquit(){//客戶服務(wù)通信結(jié)束處理函數(shù)inti;char*msg="服務(wù)器將要關(guān)閉了!";while(1){if(strcmp(stopmsg,"quit")==0){//如果服務(wù)器端發(fā)送消息為"quit",則提示服務(wù)器將關(guān)閉printf("服務(wù)器關(guān)閉!\n"); for(i=0;i<LinkNum;i++)if(client_sockfd[i]!=-1) write(client_sockfd[i],msg,sizeof(msg));/*依次向繼續(xù)保持連接的客戶端發(fā)出“服務(wù)器將關(guān)閉”的通知消息*/close(server_sockfd); //關(guān)閉服務(wù)器監(jiān)聽套接字 sem_destroy(&mutex); //銷毀連接數(shù)資源信號量mutexexit(0);}}}S10、并發(fā)程序-套接字通信voidrcv_snd(intn){//服務(wù)器與客戶端的收發(fā)通信函數(shù),n為連接數(shù)組序號inti=0;intretval;charrecv_buf[1024]; //接收消息緩沖區(qū)charsend_buf[1024]; //發(fā)送消息緩沖區(qū)intclient_len=0;intrcv_num; //從客戶端接收到的消息長度pthread_ttid; //線程idtid=pthread_self(); //獲取當(dāng)前線程idprintf("-----------服務(wù)器線程id=%u使用套接字%d,n=%d與客戶機(jī)對話開始...\n",tid,client_sockfd[n],n);do
{//服務(wù)器與客戶端循環(huán)發(fā)送接收消息 memset(recv_buf,0,1024);//接收消息緩沖區(qū)清零 printf("服務(wù)器線程id=%u,套接字%d,n=%d等待客戶端回應(yīng)...\n",tid,client_sockfd[n],n);rcv_num=read(client_sockfd[n],recv_buf,sizeof(recv_buf));S10、并發(fā)程序-套接字通信 printf("服務(wù)器線程id=%u,套接字%d,n=%d從客戶端接受的消息長度=%d\n",tid,client_sockfd[n],n,strlen(recv_buf));printf("3.服務(wù)器線程id=%u,套接字%d,n=%d<---客戶端,服務(wù)器從客戶端接受的消息是:(%d):%s\n",tid,client_sockfd[n],n,rcv_num,recv_buf); if(rcv_num==0)break; sleep(1); if(strncmp(recv_buf,"!q",2)==0)break; //若接收到"!q",則結(jié)束循環(huán),通信結(jié)束printf("4.服務(wù)器線程id=%u,套接字%d,n=%d--->客戶端,請輸入服務(wù)器要發(fā)送給客戶機(jī)的消息:",tid,client_sockfd[n],n); memset(send_buf,0,1024); //發(fā)送消息緩沖區(qū)清零scanf("%s",send_buf); //服務(wù)器端鍵盤輸入字符串消息,輸入"!q"或"quit",則通信結(jié)束 strcpy(stopmsg,send_buf);write(client_sockfd[n],send_buf,sizeof(send_buf)); if(strncmp(send_buf,"!q",2)==0)break; //若服務(wù)器端發(fā)送"!q",則結(jié)束循環(huán),通信結(jié)束 if(strncmp(send_buf,"quit",4)==0)break; //若服務(wù)器端發(fā)送"quit",則結(jié)束循環(huán),通信結(jié)束}while(strncmp(recv_buf,"!q",2)!=0);S10、并發(fā)程序-套接字通信printf("-----------服務(wù)器線程id=%u,套接字%d,n=%d與客戶機(jī)對話結(jié)束---------\n",tid,client_sockfd[n],n);close(client_sockfd[n]); //關(guān)閉連接套接字client_sockfd[n]=-1; //被關(guān)閉連接套接字?jǐn)?shù)組項(xiàng)置為空閑curLink--; //當(dāng)前連接數(shù)減1printf("當(dāng)前連接數(shù)為:%d(<=%d)\n",curLink,LinkNum); //輸出當(dāng)前連接數(shù)和最大連接數(shù)sem_post(&mutex); //釋放可用連接數(shù)資源信號量mutexpthread_exit(&retval); //當(dāng)前服務(wù)器線程結(jié)束}intmain(void){charrecv_buf[1024]; //接收消息緩沖區(qū)charsend_buf[1024]; //發(fā)送消息緩沖區(qū)intclient_len=0;structsockaddr_inserver_addr; //服務(wù)器端協(xié)議地址structsockaddr_inclient_addr; //客戶端協(xié)議地址inti=0; //連接套接字?jǐn)?shù)組循環(huán)變量server_sockfd=socket(AF_INET,SOCK_STREAM,0);S10、并發(fā)程序-套接字通信server_addr.sin_family=AF_INET; //指定網(wǎng)絡(luò)套接字server_addr.sin_addr.s_addr=htonl(INADDR_ANY); //接受所有IP地址的連接server_addr.sin_port=htons(9736); //綁定到9736端口bind(server_sockfd,(structsockaddr*)&server_addr,sizeof(server_addr));//協(xié)議套接字命名為server_sockfdprintf("1、服務(wù)器開始listen...\n");listen(server_sockfd,LinkNum); /*創(chuàng)建連接數(shù)最大為LinkNum的套接字隊(duì)列,監(jiān)聽命名套接字,listen不會阻塞,它向內(nèi)核報(bào)告套接字和最大連接數(shù)*/signal(SIGCHLD,SIG_IGN); //忽略子進(jìn)程停止或退出信號printf("輸入!q,服務(wù)結(jié)束.\n");//輸入!q,服務(wù)結(jié)束pthread_create(&thread,NULL,(void*)(&quit),NULL);//創(chuàng)建線程,執(zhí)行函數(shù)quitfor(i=0;i<LinkNum;i++)client_sockfd[i]=-1;//初始化連接隊(duì)列sem_init(&mutex,0,LinkNum); //信號量mutex初始化為連接數(shù)while(1){for(i=0;i<LinkNum;i++) //搜尋空閑連接if(client_sockfd[i]==-1)break;S10、并發(fā)程序-套接字通信if(i==LinkNum){//如果達(dá)到最大連接數(shù),則客戶等待printf("已經(jīng)達(dá)到最大連接數(shù)%d,請等待其它客戶釋放連接...\n",LinkNum);sem_wait(&mutex); //阻塞等待空閑連接continue; //被喚醒后繼續(xù)監(jiān)測是否有空閑連接}client_len=sizeof(client_addr);printf("2、服務(wù)器開始accept...i=%d\n",i);client_sockfd[i]=accept(server_sockfd,(structsockaddr*)&client_addr,&client_len);curLink++; //當(dāng)前連接數(shù)增1sem_wait(&mutex); //可用連接數(shù)信號量mutex減1printf("當(dāng)前連接數(shù)為:%d(<=%d)\n",curLink,LinkNum);printf("連接來自:連接套接字號=%d,IP地址=%s,端口號=%d\n",client_sockfd[i],inet_ntoa(client_addr.sin_addr),ntohs(client_addr.sin_port));//輸出客戶端地址信息pthread_create(malloc(sizeof(pthread_t)),NULL,(void*)(&rcv_snd),(void*)i);}}S10、并發(fā)程序-套接字通信客戶端程序sockclient.c:#include<unistd.h>#include<sys/types.h>#include<sys/socket.h>#include<netinet/in.h>#include<arpa/inet.h>#include<stdio.h>#include<stdlib.h>#include<sys/stat.h>#include<errno.h>#include<fcntl.h>#include<string.h>intmain(void){intsockfd; //客戶端套接字描述符intlen=0;structsockaddr_inaddress; //套接字協(xié)議地址charsnd_buf[1024]; //發(fā)送消息緩沖區(qū)charrcv_buf[1024]; //接收消息緩沖區(qū)intresult;S10、并發(fā)程序-套接字通信intrcv_num; //接收消息長度pid_tcpid; //客戶進(jìn)程標(biāo)識符sockfd=socket(AF_INET,SOCK_STREAM,0); if(sockfd<0){perror("客戶端創(chuàng)建套接字失??!\n");return1;}address.sin_family=AF_INET; //使用網(wǎng)絡(luò)套接字address.sin_addr.s_addr=inet_addr("127.0.0.1");//服務(wù)器地址address.sin_port=htons(9736); //服務(wù)器所監(jiān)聽的端口if(inet_aton("127.0.0.1",&address.sin_addr)<0){printf("inet_atonerror.\n");return-1;}len=sizeof(address);cpid=getpid(); //獲取客戶進(jìn)程標(biāo)識符printf("1、客戶機(jī)%ld開始connect服務(wù)器...\n",cpid);result=connect(sockfd,(structsockaddr*)&address,len);S10、并發(fā)程序-套接字通信if(result==-1){perror("客戶機(jī)connect服務(wù)器失敗!\n");exit(1);}printf("-----------客戶機(jī)%ld與服務(wù)器線程對話開始...\n",cpid);do{//客戶機(jī)與服務(wù)器循環(huán)發(fā)送接收消息printf("2.客戶機(jī)%ld--->服務(wù)器:sockfd=%d,請輸入客戶機(jī)要發(fā)送給服務(wù)器的消息:",cpid,sockfd);memset(snd_buf,0,1024); //發(fā)送緩沖區(qū)清零scanf("%s",snd_buf); //鍵盤輸入欲發(fā)送給服務(wù)器的消息字符串write(sockfd,snd_buf,sizeof(snd_buf)); //將消息發(fā)送到套接字if(strncmp(snd_buf,"!q",2)==0)break;//若發(fā)送"!q",則結(jié)束循環(huán),通信結(jié)束memset(rcv_buf,0,1024); //接收緩沖區(qū)清零printf("客戶機(jī)%ld,sockfd=%d等待服務(wù)器回
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 商場攤位租金合同范本
- 合伙開采玉礦合同范本
- 加工鑄造用工合同范本
- 吊籃安拆合同范本
- 傳媒助力校園綠化
- 醫(yī)療設(shè)備推廣合同范本
- 供甲醇燃料合同范本
- 賣砂合同范本
- 回款協(xié)議合同范本
- 團(tuán)體旅游合同合同范本
- 安徽省江南十校2024屆高三3月聯(lián)考數(shù)學(xué)試卷 含解析
- 人教版 七年級英語下冊 UNIT 1 單元綜合測試卷(2025年春)
- 2025年遼寧醫(yī)藥職業(yè)學(xué)院高職單招職業(yè)技能測試近5年??及鎱⒖碱}庫含答案解析
- 《痛經(jīng)的預(yù)防保健》課件
- 公園物業(yè)管理安保服務(wù)投標(biāo)技術(shù)標(biāo)方案參考借鑒范本
- 《習(xí)近平法治思想概論(第二版)》 課件 3.第三章 習(xí)近平法治思想的實(shí)踐意義
- 中醫(yī)藥文化知識培訓(xùn)課件
- 2025中智集團(tuán)招聘高頻重點(diǎn)提升(共500題)附帶答案詳解
- 養(yǎng)老院院感管理與應(yīng)急預(yù)案
- 湘教版七年級上冊數(shù)學(xué)期末考試試卷及答案
- 2024-2025學(xué)年上學(xué)期河北初中英語八年級期末試卷
評論
0/150
提交評論