




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、操作系統(tǒng)實(shí) 驗(yàn) 報(bào) 告 課程名稱 操作系統(tǒng) 實(shí)驗(yàn)學(xué)期 2011 至 2012 學(xué)年 第 一 學(xué)期學(xué)生所在系部 通信工程系 年級(jí) 2008 專業(yè)班級(jí) 010812班 學(xué)生姓名 路遙 學(xué)號(hào) 01081191 任課教師 陳晨 實(shí)驗(yàn)成績(jī) 通信工程系制課前資料:l 參考資料查閱工具:man,如man ls,man make;l C編寫手冊(cè),機(jī)器上“l(fā)inux c參考”;l Shell編寫手冊(cè),機(jī)器上“l(fā)inux shell參考“;l Makefile編寫手冊(cè),機(jī)器上“makefile參考“;l Awk編寫手冊(cè),機(jī)器上“awk參考“;l 經(jīng)典書籍,學(xué)習(xí)linux,unix的最佳書籍“Linux,unix
2、shell編程指南“一、 實(shí)驗(yàn)題目:熟悉linux操作系統(tǒng)下最簡(jiǎn)單實(shí)用的通信程序socket.最好能全部完成,否則按照完成情況打分。二、 實(shí)驗(yàn)?zāi)康模和ㄟ^對(duì)socket的編寫,可以了解linux下最簡(jiǎn)單實(shí)用的進(jìn)程通信方法,為后續(xù)信號(hào)燈、消息隊(duì)列等學(xué)習(xí)奠定基礎(chǔ)。三、 實(shí)驗(yàn)設(shè)備及環(huán)境:1. 硬件設(shè)備:PC機(jī)一臺(tái)2. 軟件環(huán)境:安裝Linux操作系統(tǒng),并安裝相關(guān)的程序開發(fā)環(huán)境,如C C+tshbsh等編程語言環(huán)境。四、 實(shí)驗(yàn)內(nèi)容及要求:(1)用C語言編程實(shí)現(xiàn)linux簡(jiǎn)單的聊天室功能。n 用戶程序命名為client.c;服務(wù)器程序命名為 綁定端口等信息見實(shí)驗(yàn)方法內(nèi)容;n 要求clie
3、nt可以通過socket連接serveru 在client,提示輸入服務(wù)器ipu 若連接server 的socket建立成功,返回提示信息u Client輸入的聊天內(nèi)容在client端(多個(gè)client端)和server端同時(shí)顯示;u 多個(gè)client可同時(shí)接入server,進(jìn)入聊天室,最多支持20個(gè)client;u Client端輸入quit退出連接,server端提示client退出。u 可選擇使用多線程實(shí)現(xiàn)多客戶端;u 其他細(xì)節(jié)見輸出結(jié)果;五、實(shí)驗(yàn)方法內(nèi)容1. 需要的頭文件#include<stdlib.h>#include<stdio.h>#include<
4、;string.h>#include<errno.h>#include<netdb.h>#include<sys/types.h>#include<netinet/in.h>#include<sys/socket.h>#include<sys/wait.h>#include<unistd.h>#include<pthread.h>2. 主要的常量變量客戶端:#define TRUE 1#define PORT 5000int quit=0; /quit表示是否用戶確定退出服務(wù)器端:#defin
5、e MAXLINE 1000 /在一條消息中最大的輸出字符數(shù)#define LISTENQ 20 /最大監(jiān)聽隊(duì)列#define PORT 5000 /監(jiān)聽端口#define MAXFD 20 /最大的在線用戶數(shù)量void *get_client(void *); int i,maxi=-1;/maxi表示當(dāng)前client數(shù)組中最大的用戶的i值int clientMAXFD;3. 主要模塊客戶端:int main(void)void *get_server(void* sockfd) /get_server函數(shù),用于接受服務(wù)器轉(zhuǎn)發(fā)的消息服務(wù)器端:int main() void *get_clie
6、nt(void *sockfd) /運(yùn)行g(shù)et_client函數(shù),處理用戶請(qǐng)求六代碼考慮大家沒做過,給幾個(gè)例子:參考socket編程.pdf/* 客戶端程序 client.c */#include <stdlib.h>#include <stdio.h>#include <errno.h>#include <string.h>#include <netdb.h>#include <sys/types.h>#include <netinet/in.h>#include <sys/socket.h>#d
7、efine TRUE 1#define PORT 5000 static int sockfd;void recvfromserver() /接受服務(wù)器消息線程入口函數(shù)char mes1024;int nbytes=0;while(1)memset(mes,0,sizeof(mes);nbytes=read(sockfd,mes,sizeof(mes);if(nbytes>0)mesnbytes='0'printf("%sn",mes);pthread_exit(NULL);int main(int argc, char *argv)/int sock
8、fd;char buffer1024;struct sockaddr_in server_addr;struct hostent *host;int portnumber,nbytes;char strhost16;char clientname20;char mes1024;int thr_id; /* thread ID for the newly created thread */pthread_t p_thread; /* thread's structure */if(argc!=1)fprintf(stderr,"Usage:%s an",argv0);
9、exit(1);printf("請(qǐng)輸入服務(wù)器ip地址n");scanf("%s",strhost);if(host=gethostbyname(strhost)=NULL)fprintf(stderr,"Gethostname errorn");exit(1);/* 客戶程序開始建立 sockfd 描述符 */printf("正在建立套接口.n");if(sockfd=socket(AF_INET,SOCK_STREAM,0)=-1)fprintf(stderr,"Socket Error:%san&qu
10、ot;,strerror(errno);exit(1);/* 客戶程序填充服務(wù)端的資料 */bzero(&server_addr,sizeof(server_addr);server_addr.sin_family=AF_INET;server_addr.sin_port=htons(PORT);server_addr.sin_addr=*(struct in_addr *)host->h_addr);printf("套接口創(chuàng)建成功,正在鏈接服務(wù)器.n");/* 客戶程序發(fā)起連接請(qǐng)求 */if(connect(sockfd,(struct sockaddr *
11、)(&server_addr),sizeof(struct sockaddr)=-1)fprintf(stderr,"Connect Error:%san",strerror(errno);exit(1);/* 連接成功了 */printf("鏈接服務(wù)器成功n歡迎來到聊天室n");printf("請(qǐng)輸入你的用戶昵稱n");scanf("%s",clientname);/write(sockfd,clientname,sizeof(clientname);printf("nn開始聊天吧("
12、Quit"斷開連接)nn");thr_id = pthread_create(&p_thread, NULL, recvfromserver, NULL);while(1)memset(buffer,0,sizeof(buffer);memset(mes,0,sizeof(mes);scanf("%s",buffer);strcat(mes,clientname);strcat(mes,":");strcat(mes,buffer);/printf("main thread %sn",mes);if(wri
13、te(sockfd,mes,sizeof(mes)=-1)fprintf(stderr,"Write Error:%sn",strerror(errno);exit(1);if(strcmp(buffer,"Quit")=0)break;/* 結(jié)束通訊 */close(sockfd);exit(0);/* 服務(wù)器程序 (server.c) */#include <stdlib.h>#include <stdio.h>#include <errno.h>#include <string.h>#include
14、<netdb.h>#include <sys/types.h>#include <netinet/in.h>#include <sys/socket.h>#define MAXLINE 1000 /在一條消息中最大的輸出字符數(shù)#define LISTENQ 20 /最大監(jiān)聽隊(duì)列#define PORT 5000 /監(jiān)聽端口#define MAXFD 20 /最大的在線用戶數(shù)量void *get_client(void *); int sockfd,i;static int maxi=0;/maxi表示當(dāng)前client數(shù)組中最大的用戶的i值stat
15、ic int clientMAXFD;void recvandsend(void) /監(jiān)聽轉(zhuǎn)發(fā)線程入口函數(shù)int index=0;int nbytes=0;char buffer1024;int len;int outindex=0;while(1)if(maxi>0)memset(buffer,0,sizeof(buffer);nbytes=0;/index+;nbytes=read(clientindex+,buffer,sizeof(buffer);/printf("%d,%dn",index,clientindex);if(nbytes>0)buffer
16、nbytes='0'printf(" %sn",buffer);outindex=0;while(outindex<maxi)if(write(clientoutindex+,buffer,sizeof(buffer)=-1)fprintf(stderr,"Write Error:%sn",strerror(errno);exit(1);if(index>=maxi)index=0;pthread_exit(NULL);int main(int argc, char *argv)/int client_fdLISTENQ,cl
17、ientnum=0;struct sockaddr_in server_addr;struct sockaddr_in client_addr;int sin_size,portnumber;char hello="Hello! Are You Fine?n"int thr_id; /* thread ID for the newly created thread */pthread_t p_thread; /* thread's structure */int new_fd=0;memset(client,0,sizeof(client);if(argc!=1)f
18、printf(stderr,"Usage:%s portnumberan",argv0);exit(1);/* 服務(wù)器端開始建立 socket 描述符 */if(sockfd=socket(AF_INET,SOCK_STREAM,0)=-1)fprintf(stderr,"Socket error:%sna",strerror(errno);exit(1);/* 服務(wù)器端填充 sockaddr 結(jié)構(gòu) */bzero(&server_addr,sizeof(struct sockaddr_in);server_addr.sin_family=AF_
19、INET;server_addr.sin_addr.s_addr=htonl(INADDR_ANY);server_addr.sin_port=htons(PORT);/* 捆綁 sockfd 描述符 */if(bind(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr)=-1)fprintf(stderr,"Bind error:%sna",strerror(errno);exit(1);printf("服務(wù)器監(jiān)聽端口%d.n",PORT);/* 監(jiān)聽 sockfd
20、描述符 */if(listen(sockfd,LISTENQ)=-1)fprintf(stderr,"Listen error:%sna",strerror(errno);exit(1);thr_id = pthread_create(&p_thread, NULL, recvandsend, NULL);printf("歡迎來到本聊天室n");while(1)/* 服務(wù)器阻塞,直到客戶程序建立連接 */if(maxi>=20)printf("以達(dá)到人數(shù)上線n");continue;sin_size=sizeof(str
21、uct sockaddr_in);if(new_fd=accept(sockfd,(struct sockaddr *)(&client_addr),&sin_size)=-1)fprintf(stderr,"Accept error:%sna",strerror(errno);exit(1);/*fprintf(stderr,"Server get connection from %sn",inet_ntoa(client_addr.sin_addr);*/clientmaxi+=new_fd;printf("n新用戶進(jìn)入聊天室%dn",new_fd);close(sockfd);exit(0);七、實(shí)驗(yàn)結(jié)果1. 執(zhí)行結(jié)果l 服務(wù)器打開l 客戶端打開,并輸入了地址,昵稱l 服務(wù)器端顯示l 客戶
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- Gentulizumab-Gensci-059-生命科學(xué)試劑-MCE
- Abazistobart-生命科學(xué)試劑-MCE-7151
- 2025屆陜西省安康市重點(diǎn)中學(xué)高考物理全真模擬密押卷含解析
- 2025屆湖北省當(dāng)陽市第一中學(xué)高三最后一卷物理試卷含解析
- 重要革新2025年臨床執(zhí)業(yè)醫(yī)師考試試題及答案
- 閱讀情商測(cè)試題及答案
- 2025年機(jī)械治療及病房護(hù)理設(shè)備項(xiàng)目建議書
- 2025年高效節(jié)能電動(dòng)機(jī)項(xiàng)目建議書
- 計(jì)算機(jī)二級(jí)考試的編程技巧分享試題及答案
- 計(jì)算機(jī)二級(jí)考試的常見題型與應(yīng)試技巧的總結(jié)與探討試題及答案
- 《柔性棚洞防護(hù)結(jié)構(gòu)技術(shù)規(guī)程》
- 國(guó)外中學(xué)物理實(shí)驗(yàn)教學(xué)現(xiàn)狀分析
- 免疫規(guī)劃工作經(jīng)驗(yàn)
- 2023年水工建筑物水泥灌漿施工技術(shù)規(guī)范
- 醫(yī)院國(guó)家安全主題班會(huì)
- 失信應(yīng)急和響應(yīng)演練記錄
- 第一單元字詞過關(guān)專題卷-2022-2023學(xué)年語文五年級(jí)下冊(cè)(部編版)
- 醫(yī)院反恐知識(shí)課件
- 唱給小蘿卜頭的歌
- 新型電力系統(tǒng)簡(jiǎn)介演示
- 傳統(tǒng)戲曲的角色扮演與表演藝術(shù)
評(píng)論
0/150
提交評(píng)論