




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、操作系統(tǒng)課程設(shè)計報告題目: ipc機(jī)制 班級: 計算機(jī)2009-2、3班 學(xué)號: 200901051718 200901051626 姓名: 指導(dǎo)老師: 完成起止日期:2011年 12 月 18 日 2011 年 12 月 23 日目錄0、目錄 11、課程設(shè)計題目與要求 22、設(shè)計思想與系統(tǒng)結(jié)構(gòu) 34、代碼分析 85、課程設(shè)計總結(jié) 22課程設(shè)計題目與要求題目:linux ipc機(jī)制設(shè)計要求:搭建一個服務(wù)器,該服務(wù)器采用不同的響應(yīng)方式,可以支持30個以下,或者100個以上的不同客戶的訪問.l 基于socekt的服務(wù)器構(gòu)建l 阻塞/非阻塞方式l 線程和進(jìn)程方式測試要求: l 客戶端/服務(wù)器端的響應(yīng)
2、速度l 服務(wù)器端占用的內(nèi)存設(shè)計思想與系統(tǒng)結(jié)構(gòu)設(shè)計思想:此課程設(shè)計共以兩種方式實現(xiàn)了服務(wù)器端,即分別以線程調(diào)用和進(jìn)程調(diào)用響應(yīng)客戶端請求的方式設(shè)計了服務(wù)器端。用兩種方式實現(xiàn)了客戶端,即使用阻塞和非阻塞的方式設(shè)計客戶端。系統(tǒng)結(jié)構(gòu):1、線程調(diào)用的方式實現(xiàn)服務(wù)器端結(jié)構(gòu)如下:流程圖如下:(見下頁)2、進(jìn)程程調(diào)用的方式實現(xiàn)服務(wù)器端結(jié)構(gòu)如下:流程圖如下:2、以阻塞的方式實現(xiàn)客戶端的讀寫操作流程圖如下:(見下頁)4、以非阻塞的方式實現(xiàn)客戶端的讀寫操作流程圖如下:代碼分析此模塊列出了兩個服務(wù)器的代碼和兩個客戶端的代碼1、用進(jìn)程機(jī)制設(shè)計服務(wù)器端server_process.c/* * file: server_pr
3、ocess.c * author: root * * created on 2011年12月23日, 下午4:24 */#include #include #include #include #include #include #include #define server_port 6666 / 預(yù)先指定服務(wù)器的服務(wù)端口#define length_of_listen_queue 10 / 監(jiān)聽的最大請求數(shù)#define buffer_size 255 intmain (int argc, char* argv) int i = 0; int servfd, clifd; struct so
4、ckaddr_in servaddr, cliaddr; if (servfd = socket (af_inet, sock_stream, 0 ) 0 ) printf ( 創(chuàng)建socket失?。 );exit ( 1 ); bzero ( & servaddr, sizeof (servaddr); servaddr.sin_family = af_inet; servaddr.sin_port = htons (server_port); servaddr.sin_addr.s_addr = htons (inaddr_any); if (bind (servfd, ( struct
5、 sockaddr * ) & servaddr, sizeof (servaddr) 0 ) printf ( 綁定到端口: %d 失?。 , server_port);exit ( 1 ); if (listen (servfd, length_of_listen_queue) 0 ) printf ( 服務(wù)器監(jiān)聽失?。 );exit ( 1 ); for (i = 0; i 10; i+) char bufbuffer_size;long timestamp;socklen_t length = sizeof (cliaddr);clifd = accept (servfd, ( s
6、truct sockaddr * ) & cliaddr, & length);if (clifd 0 ) printf ( 開始接收請求時出錯!n ); break ;if (!fork () printf ( 收到客戶端請求ip為:%s,port:%dn , inet_ntoa (cliaddr.sin_addr), ntohs (cliaddr.sin_port); timestamp = time (null); strcpy (buf, 服務(wù)器受到你的信息!來自服務(wù)器,時間:); strcat (buf, ctime ( & timestamp); send (clifd, buf,
7、 buffer_size, 0 ); close (clifd); sleep (5); printf (我是進(jìn)程 %d ,我已經(jīng)關(guān)閉!n, i); exit (0); /此處是關(guān)閉進(jìn)程,而不是關(guān)閉整個程序 / exit close (servfd); return 0 ;2、用線程機(jī)制設(shè)計服務(wù)器端server_thread.c/* * file: client_thread.c * author: root * * created on 2011年12月23日, 下午4:24 */#include #include #include #include #include #include #i
8、nclude #include#include#define server_port 6666 / 預(yù)先指定服務(wù)器端口#define length_of_listen_queue 10 / 限定監(jiān)聽的最大請求數(shù) #define buffer_size 255 static pthread_mutex_t mutex = pthread_mutex_initializer;static pthread_cond_t cond = pthread_cond_initializer;char bufbuffer_size;long timestamp;int i;int servfd, clifd;
9、struct sockaddr_in servaddr, cliaddr;pthread_t tid;void*dealing_thread (void* arg) printf (enter threadn); printf ( 來自客戶端:%s 端口:%dn , inet_ntoa (cliaddr.sin_addr), ntohs (cliaddr.sin_port); timestamp = time (null); pthread_mutex_lock (&mutex); /鎖上全局變量 strcpy (buf, 服務(wù)器收到你的信息!來自服務(wù)器,時間:); strcat (buf,
10、ctime ( & timestamp); send (clifd, buf, buffer_size, 0 ); close (clifd); pthread_mutex_unlock (&mutex); /解鎖 sleep(5); printf (我是線程程 %d ,我已經(jīng)關(guān)閉!n, i); printf (leave threadn); pthread_exit (0);int main (int argc, char* argv) if (servfd = socket (af_inet, sock_stream, 0 ) 0 ) printf ( 創(chuàng)建socket失?。 ); ex
11、it ( 1 ); bzero ( & servaddr, sizeof (servaddr); servaddr.sin_family = af_inet; servaddr.sin_port = htons (server_port); servaddr.sin_addr.s_addr = htons (inaddr_any); if (bind (servfd, ( struct sockaddr * ) & servaddr, sizeof (servaddr) 0 ) printf ( 綁定到端口:%d 失敗n , server_port); exit ( 1 ); if (list
12、en (servfd, length_of_listen_queue) 0 ) printf ( 開始監(jiān)聽失?。 ); exit ( 1 ); for (i = 0; i 10; i+) socklen_t length = sizeof (cliaddr); clifd = accept (servfd, ( struct sockaddr * ) & cliaddr, & length); if (clifd 0 ) printf ( 運(yùn)行出錯!!n ); break ; printf (運(yùn)行的此處!n); int ret = pthread_create (&tid, null, (v
13、oid *) dealing_thread , null); if (ret != 0) printf (%s: %dn, _func_, strerror (ret); / exit close (servfd); return 0 ;3、用阻塞方式設(shè)計客戶端client_block.c/* * file: client_block.c * author: root * * created on 2011年12月23日, 下午4:24 */#include #include #include #include #include #include #define server_port 666
14、6 / 預(yù)先指定服務(wù)器端口#define buffer_size 255 #define reuqest_message 歡迎連接服務(wù)器!n void using (char* name) printf ( 用法: %s ipaddrn , name);int main (int argc, char* argv) int servfd, clifd, length = 0; struct sockaddr_in servaddr, cliaddr; socklen_t socklen = sizeof (servaddr); char bufbuffer_size; if (argc 2 )
15、 using (argv 0 ); exit ( 1 ); if (clifd = socket (af_inet, sock_stream, 0 ) 0 ) printf ( 創(chuàng)建socket失敗!n ); exit ( 1 ); srand (time (null); bzero ( & servaddr, sizeof (servaddr); servaddr.sin_family = af_inet; if ( inet_aton (argv 1 , & servaddr.sin_addr) = 0) printf (“錯誤!”); exit (0); servaddr.sin_por
16、t = htons (server_port); if (connect (clifd, ( struct sockaddr * ) & servaddr, socklen) 0 ) printf ( 不能鏈接到服務(wù)器: %s!n , argv 1 ); exit ( 1 ); length = recv (clifd, buf, buffer_size, 0); if (length 0) printf ( 當(dāng)從服務(wù)器:%s! 獲取數(shù)據(jù)是出錯 , argv1 ); exit ( 1 ); printf ( 來自ip: %s :nt%s, argv1, buf); close (clifd);
17、 return 0;4、用非阻塞方式設(shè)計客戶端client_nonblock.c/* * file: client_nonblock.c * author: root * * created on 2011年12月23日, 下午4:24 */#include #include #include #include #include #include #include #include #include #include #include #include #include #include int setnonblocking (int sockfd) if (fcntl (sockfd, f_
18、setfl, fcntl (sockfd, f_getfd, 0) | o_nonblock) = -1) return -1; /假如設(shè)置非阻塞失敗返回-1 return 0; /假如設(shè)置非阻塞成功返回0unsigned long name_resolve (char *host_name) /將ip地址解析成網(wǎng)絡(luò)地址 struct in_addr addr; struct hostent *host_ent; if (addr.s_addr = inet_addr (host_name) = (unsigned) - 1) host_ent = gethostbyname (host_na
19、me); if (host_ent = null) return (-1); memcpy (host_ent-h_addr, (char *) &addr.s_addr, host_ent-h_length); return (addr.s_addr);int connectserver (char *address, int port) int client_id; /定義socket返回的id struct sockaddr_in sin; /定義服務(wù)器 地址結(jié)構(gòu)體 if ( client_id = socket (af_inet, sock_stream, 0) = -1) perro
20、r (創(chuàng)建socket失??!r); return -1; bzero ( & sin, sizeof (sin); /全部賦值為零 sin.sin_family = af_inet; /進(jìn)行簡單的設(shè)置 sin.sin_port = htons (port); sin.sin_addr.s_addr = name_resolve (address); if (sin.sin_addr.s_addr = null) return (-1); printf (ip: %sn, inet_ntoa (sin.sin_addr); if ( connect (client_id, (struct soc
21、kaddr *) &sin, sizeof (sin) 0) /假如連接失敗,則返回-1 printf (connect error!n); return (-1); if (setnonblocking (client_id) = -1) return -1; return client_id;int main (void) /測試函數(shù) fd_set read_flags, write_flags; struct timeval waitd; int connectedid; char outbuff512; /定義寫的字符數(shù)組 char inbuff512; /定義讀取的字符數(shù)組 int
22、state; /定義現(xiàn)在有誤讀或?qū)憯?shù)據(jù)的狀態(tài) memset (&outbuff, 0, sizeof (outbuff); /全部賦值為零 connectedid = connectserver (192.168.136.105, 6666); / 連接服務(wù)器 if (connectedid = -1) printf (不能連接到服務(wù)器!n); exit (0); strcat (outbuff, hello/n); /把此字符串連接到outbuff 上 /buffer while (1) waitd.tv_sec = 1; / 設(shè)置等待的時間為1秒 waitd.tv_usec = 1; /
23、設(shè)置等待的時間為1秒 fd_zero (&read_flags); /賦值為零以備使用 fd_zero (&write_flags); /賦值為零以備使用 fd_set (connectedid, &read_flags); if (strlen (outbuff) != 0) fd_set (connectedid, &write_flags); state = select (connectedid + 1, &read_flags, &write_flags, (fd_set*) 0, &waitd); if (state 0) /判斷當(dāng)前是否有數(shù)據(jù)讀或?qū)?printf (暫無數(shù)據(jù)接收n); sleep (1); else if (fd_isset (connectedid, &write_flags) /假如當(dāng)前可寫 /socket準(zhǔn)備寫 fd_clr (connectedid, &write_flags); write (connectedid, outbuff, strlen (outbuff); memset (&outbuff, 0, sizeof (outbuff); if (fd_isset (connectedid, &read_flags) /假如當(dāng)前可讀 /socket準(zhǔn)備讀取 fd_clr (conn
溫馨提示
- 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 產(chǎn)業(yè)園區(qū)入駐合同協(xié)議
- 關(guān)于推進(jìn)跨部門合作項目的工作計劃
- 關(guān)于采購流程的往來文書說明
- 商務(wù)會議溝通要點及會議紀(jì)要模板
- 健康管理平臺的構(gòu)建及運(yùn)營規(guī)劃
- 機(jī)器人智能化生產(chǎn)線建設(shè)委托代理合同
- 交通物流調(diào)度管理系統(tǒng)建設(shè)方案
- 房屋預(yù)約買賣合同
- 木材原木購銷合同
- 2025年版《認(rèn)識大熊貓》課件發(fā)布
- 城市軌道交通乘客服務(wù)課件(完整版)
- 圍手術(shù)期肺部感染
- 北師大版語文選修《蕭蕭》ppt課件1
- 大學(xué)生職業(yè)素養(yǎng)課件-5第五單元學(xué)會有效溝通-PPT課件
- 煤礦2021年重大安全風(fēng)險分析預(yù)判防控報告全文
- 《傷逝》_魯迅課件__大學(xué)語文(基礎(chǔ)教育)
- 《談骨氣》課文閱讀(共2頁)
- 高考成績證明模板
- 蝴蝶蘭PPT課件
- 賓館做房記錄表
- 工業(yè)管道檢查報告
評論
0/150
提交評論