中間件復(fù)習(xí)題01_第1頁(yè)
中間件復(fù)習(xí)題01_第2頁(yè)
中間件復(fù)習(xí)題01_第3頁(yè)
中間件復(fù)習(xí)題01_第4頁(yè)
中間件復(fù)習(xí)題01_第5頁(yè)
已閱讀5頁(yè),還剩4頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、中間件復(fù)習(xí)題一、 判斷題1. close()函數(shù)用于關(guān)閉套接字描述符,這個(gè)函數(shù)的調(diào)用會(huì)引發(fā)TCP的中止連接操作。(0)2. 在TCP的客戶(hù)端程序中,如果connect()函數(shù)調(diào)用失敗,則套接字符不能再使用,必須關(guān)閉。(1)3. shutdown(int sockfd, int howto)函數(shù),可以根據(jù)參數(shù)howto關(guān)閉指定方向的數(shù)據(jù)傳輸。(1)4. getsockname()函數(shù)返回套接字對(duì)應(yīng)的遠(yuǎn)程地址。(0)5. inet_addr()函數(shù)既可用于IPV4也可用于IPV6的地址轉(zhuǎn)換。(0)6. Linux支持多種套接字類(lèi)型,其中SOCKET_STREAM類(lèi)型對(duì)應(yīng)的是UDP協(xié)議。(0)7.

2、綁定地址時(shí),可以指定地址為通配地址:INADDR_ANY,其值一般為0,它通知內(nèi)核選擇IP地址。(1)8. 函數(shù)bind返回的一個(gè)常見(jiàn)錯(cuò)誤是:所綁定的地址已被其他進(jìn)程使用,我們可以通過(guò)設(shè)置套接字選項(xiàng)SO_REUSEADDR來(lái)避免產(chǎn)生這個(gè)錯(cuò)誤。(1)9. 在UDP套接字程序中,客戶(hù)端與服務(wù)器通信時(shí),必須使用sendto()和recvfrom()函數(shù)。(0)10. TCP的服務(wù)器端綁定地址時(shí),可以同時(shí)指定綁定的地址和端口號(hào),也可以指定其中之一,甚至一個(gè)也不指定。(1)11. 在TCP套接字程序中,當(dāng)read()函數(shù)收到FIN數(shù)據(jù)時(shí),其返回-1。(0)12. 在TCP套接字程序中,客戶(hù)端程序要生成二

3、個(gè)套接字描述符。(0)13. 在多線程并發(fā)服務(wù)器中,為了防止父子線程對(duì)描述符的操作造成混亂,在主線程創(chuàng)建子線程后,應(yīng)在父線程中關(guān)閉不用的已連接描述符。(0)14. 在線程專(zhuān)用數(shù)據(jù)中,如果一個(gè)進(jìn)程中有n個(gè)線程,就有n個(gè)關(guān)鍵字key。(0)15. 在多進(jìn)程執(zhí)行程序中,父進(jìn)程不能先于子進(jìn)程退出。(0)16. pthread_key_delete(pthread_key_t key)函數(shù)刪除進(jìn)程內(nèi)的TSD表示的關(guān)鍵字,該函數(shù)執(zhí)行時(shí)要先檢查T(mén)SD是否有綁定值。(0)17. tpthread_join()可以等待可分離線程的結(jié)束。(0)18. 線程專(zhuān)用數(shù)據(jù)是解決線程安全性的的唯一方法。(0)19. sel

4、ect()是一個(gè)阻塞函數(shù),它可以作為一個(gè)比sleep()更為精確的定時(shí)器。(1)20. 設(shè)置SO_LINGER選項(xiàng)后,可以周期性的探測(cè)連接是否存活。(0)21. 在異步I/O模型下,接收數(shù)據(jù)時(shí),等待數(shù)據(jù)到達(dá)和拷貝數(shù)據(jù)的操作都是由內(nèi)核開(kāi)完成。(1)22. flags|=O_NONBLOCK該語(yǔ)句的作用是將flags的值賦值為O_NONBLOCK。(0)23. 改變某個(gè)描述符的SO_KEEPALIVE選項(xiàng)值,不會(huì)影響到主機(jī)上打開(kāi)的其它描述符。(0)24. 由于異步I/O模型的效率最高,所以目前被廣泛使用。(0)25. 可以使用fcntl()函數(shù)設(shè)置和獲取套接字的選項(xiàng)。(1)26. 設(shè)置套接字的SO

5、_RCVTIMEO選項(xiàng)后,會(huì)影響write、send和sendto函數(shù)的I/O工作模式。(0)27. 綁定地址時(shí),可以指定地址為通配地址:INADDR_ANY,其值一般為0,它通知內(nèi)核選擇IP地址。(1)28. 線程調(diào)用exit()函數(shù)退出時(shí),不會(huì)影響同一進(jìn)程中的其他線程。(0)29.二、 問(wèn)答題1. 什么是中間件? 答:中間件是網(wǎng)絡(luò)環(huán)境中運(yùn)行于操作系統(tǒng)與應(yīng)用軟件之間可以簡(jiǎn)化應(yīng)用軟件的復(fù)雜性克服網(wǎng)絡(luò)環(huán)境多種挑戰(zhàn)的一類(lèi)系統(tǒng)軟件。2. 中間件規(guī)范有哪些? 答:OSF 的 DCE OMG 的OMA 微軟 的DNA SUN 的J2EE Gartner 的 SOA3. 簡(jiǎn)述基于TCP的多線程并發(fā)服務(wù)器服

6、務(wù)器程序的編程流程。 答:(1)使用socket()函數(shù)創(chuàng)建套接字;(2)將創(chuàng)建的套接字綁定到指定的地址結(jié)構(gòu);(3)listen()函數(shù)設(shè)置套接字為監(jiān)聽(tīng)模式,使服務(wù)器進(jìn)入被動(dòng)打開(kāi)的狀態(tài);(4)接收客戶(hù)端的連接請(qǐng)求,建立連接;(5)接收,應(yīng)答客戶(hù)端的數(shù)據(jù)請(qǐng)求(6)終止連接客戶(hù)端實(shí)現(xiàn)的步驟:(1) 使用socket()函數(shù)創(chuàng)建套接字(2) 調(diào)用connect()函數(shù)建立一個(gè)與TCP服務(wù)器的連接(3) 發(fā)送數(shù)據(jù)請(qǐng)求,接收服務(wù)器的數(shù)據(jù)應(yīng)答(4) 終止連接4. 基于TCP協(xié)議的套接字服務(wù)器程序中,會(huì)產(chǎn)生兩種套接字描述符,簡(jiǎn)述這兩種套接字描述符分別是什么?分別由什么函數(shù)創(chuàng)建?以及這兩種描述符各自的作用。

7、答:socket()創(chuàng)建的監(jiān)聽(tīng)描述符和accept()創(chuàng)建的已連接描述符。監(jiān)聽(tīng)描述符用來(lái)監(jiān)聽(tīng)一個(gè)端口,當(dāng)有一個(gè)客戶(hù)與服務(wù)器連接時(shí),它使用這個(gè)端口號(hào),而此時(shí)這個(gè)端口號(hào)正與這個(gè)套接字關(guān)聯(lián)。已連接描述符默認(rèn)會(huì)阻塞進(jìn)程,直到有一個(gè)客戶(hù)連接建立后返回,它返回的是一個(gè)新可用的套接字,這個(gè)套接字是連接套接字。5. 在基于UDP和TCP協(xié)議的套接字程序中調(diào)用connect()函數(shù)的作用分別是什么? 答:TCP中調(diào)用connect()函數(shù)的作用是激發(fā)TCP的三次握手過(guò)程,建立與遠(yuǎn)程服務(wù)器的連接;UDP中調(diào)用connect()函數(shù)的作用是指定與之通信的對(duì)方的IP地址和端口號(hào)。6. 請(qǐng)說(shuō)明TCP套接字listen(

8、int s, int backlog)函數(shù)中backlog參數(shù)的含義。 答:backlog參數(shù)規(guī)定了請(qǐng)求隊(duì)列中的最大連接數(shù),它對(duì)隊(duì)列中等待服務(wù)請(qǐng)求的數(shù)目進(jìn)行限制。7. 簡(jiǎn)述connect()激發(fā)TCP的三路握手過(guò)程,常見(jiàn)的三種錯(cuò)誤情況。 答:(1)如果客戶(hù)沒(méi)有收到SYN分節(jié)的響應(yīng)(總共75秒,這之間需要可能需要重發(fā)若干次SYN),返回ETIMEDOUT,這可能需要重發(fā)若干次SYN;(2)如果對(duì)客戶(hù)的SYN的響應(yīng)是RST,則表明該服務(wù)器主機(jī)在指定的端口上沒(méi)有進(jìn)程在等待與之相連。函數(shù)返回錯(cuò)誤ECONNREFUSED;(3)如果客戶(hù)發(fā)出的SYN在中間路由器上引發(fā)一個(gè)目的地不可達(dá)ICMP錯(cuò)誤,客戶(hù)端內(nèi)

9、核保存此消息,并按第一種情況,連續(xù)發(fā)送SYN,直到規(guī)定的超時(shí)時(shí)間,對(duì)方仍沒(méi)有響應(yīng),則返回保存的消息(即ICMP錯(cuò)誤)EHOSTUNREACH或ENETUNREACH錯(cuò)誤返回給進(jìn)程。8. 請(qǐng)簡(jiǎn)述fork和vfork的區(qū)別和聯(lián)系。 答:fork后,子進(jìn)程和父進(jìn)程繼續(xù)執(zhí)行fork()函數(shù)后的指令。子進(jìn)程是父進(jìn)程的副本。子進(jìn)程擁有父進(jìn)程的數(shù)據(jù)空間、堆棧的副本。但父、子進(jìn)程并不共享這些存儲(chǔ)空間部分。使用vfork()創(chuàng)建新進(jìn)程時(shí),父進(jìn)程將被暫時(shí)阻塞,而子進(jìn)程則可以借用父進(jìn)程的地址空間。這個(gè)奇特狀態(tài)將持續(xù)直到子進(jìn)程退出,至此父進(jìn)程才繼續(xù)執(zhí)行。9. 網(wǎng)絡(luò)編程中設(shè)計(jì)并發(fā)服務(wù)器,使用多進(jìn)程和多線程技術(shù)有什么區(qū)別

10、? 答:根本區(qū)別:用多進(jìn)程每個(gè)進(jìn)程有自己的地址空間(address space),線程則共享地址空間。所有其它區(qū)別都是由此而來(lái)的:1)速度:線程產(chǎn)生的速度快,線程間的通訊快、切換快等,因?yàn)樗麄冊(cè)谕粋€(gè)地址空間內(nèi)。2)資源利用率:線程的資源利用率比較好也是因?yàn)樗麄冊(cè)谕粋€(gè)地址空間內(nèi)。3)同步問(wèn)題:線程使用公共變量/內(nèi)存時(shí)需要使用同步機(jī)制還是因?yàn)樗麄冊(cè)谕粋€(gè)地址空間內(nèi)。10. 簡(jiǎn)述select()函數(shù)中timeout參數(shù)在不同的取值情況中,對(duì)select阻塞狀態(tài)的影響。 答:(1)永遠(yuǎn)等待下去:僅在有一個(gè)描述字準(zhǔn)備好I/O時(shí)才返回,因此可以將參數(shù)timeout設(shè)置為空指針。(2)等待固定時(shí)間:在有

11、一個(gè)描述字準(zhǔn)備好I/O時(shí)返回,但不超過(guò)由timeout()參數(shù)所指timeval結(jié)構(gòu)中指定的秒數(shù)和微秒數(shù)。(3)根本不用等待:檢查描述字后立即返回,這稱(chēng)為輪詢(xún)。11. 請(qǐng)說(shuō)明在Linux系統(tǒng)中阻塞I/O和I/O復(fù)用兩種模型的異同點(diǎn)。 答:i/o復(fù)用模型調(diào)用select或poll,進(jìn)程阻塞于這兩個(gè)系統(tǒng)調(diào)用上,而不是阻塞于真正的i/o系統(tǒng)調(diào)用上。與阻塞i/o模型相比,由于使用了系統(tǒng)調(diào)用select,似乎比阻塞i/o還差。但select的好處在于可以等待多個(gè)描述字準(zhǔn)備好。IO復(fù)用模型是多了一個(gè)select函數(shù),select函數(shù)有一個(gè)參數(shù)是文件描述符集合,意思就是對(duì)這些的文件描述符進(jìn)行循環(huán)監(jiān)聽(tīng),當(dāng)某個(gè)

12、文件描述符就緒的時(shí)候,就對(duì)這個(gè)文件描述符進(jìn)行處理。這種IO模型是屬于阻塞的IO。但是由于它可以對(duì)多個(gè)文件描述符12. 設(shè)置套接字選項(xiàng)時(shí),請(qǐng)指出SO_RCVBUF選項(xiàng)所在的層(網(wǎng)絡(luò)協(xié)議中的哪一層)?并具體說(shuō)明在服務(wù)器和客戶(hù)端設(shè)置該選項(xiàng)時(shí),必須在調(diào)用哪一網(wǎng)絡(luò)編程函數(shù)之前進(jìn)行設(shè)置及理由。答:應(yīng)用層 (1分)在客戶(hù)端必須,必須在調(diào)用connect之前進(jìn)行設(shè)置,因?yàn)門(mén)CP的窗口規(guī)則是在建立連接時(shí)用SYN與對(duì)方互換得來(lái)的。 (2分)在服務(wù)器端,在調(diào)用listen之前必須給監(jiān)聽(tīng)套接字設(shè)置,因?yàn)榉?wù)器端的連接套接字的接收緩沖區(qū)是從監(jiān)聽(tīng)套接字的接收緩沖區(qū)繼承而來(lái)。 (2分)三、填空題 1. select()函數(shù)

13、可以測(cè)試( 讀 )、( 寫(xiě) )和異常描述集合中的任意個(gè)描述符是否準(zhǔn)備好。2. socket提供的網(wǎng)絡(luò)編程接口位于TCP/IP模型的(應(yīng)用層)和(傳輸層)兩個(gè)層次之間。3. 在多進(jìn)程并發(fā)服務(wù)器中,為了防止父子進(jìn)程對(duì)描述符的操作造成混亂,在父進(jìn)程創(chuàng)建子進(jìn)程后,應(yīng)在父進(jìn)程中關(guān)閉不用的(已連接)描述符,在子進(jìn)程中關(guān)閉不用的(監(jiān)聽(tīng))描述符。4. pthread_detach(pthread_ttid)的作用是將一個(gè)(匯合)線程變成(分離)線程。5.基于TCP協(xié)議的套接字服務(wù)器程序中,會(huì)產(chǎn)生兩個(gè)描述,它們分別是由socket()函數(shù)創(chuàng)建的(監(jiān)聽(tīng))描述符和(accept())函數(shù)創(chuàng)建的(已連接)描述符。6.

14、 談話程序 雙方都可以從終端輸入一串字符(以回車(chē)結(jié)束),通過(guò)UDP的方式發(fā)送到對(duì)方,并顯示在對(duì)方的終端上。從命令行輸入目的地址、目的端口、源地址、源端口。使用I/O復(fù)用,進(jìn)程阻塞到select,當(dāng)標(biāo)準(zhǔn)輸入和socket有數(shù)據(jù)時(shí)返回。根據(jù)以下程序示例完成程序填空。fd_setinfds;For(;)/*重置句柄集*/*把標(biāo)準(zhǔn)輸入置入句柄集*/*把socket置入句柄集*/maxfd=max(fileno(stdin),sockfd)+1;if(select(maxfd,&infds,NULL,NULL,NULL)=-1)/*錯(cuò)誤處理*/if(FD_ISSET(sockfd,&infds)/*測(cè)試

15、socket是否可讀*/*讀socket*/if(FD_ISSET(fileno(stdin),&infds)/*測(cè)試標(biāo)準(zhǔn)輸入是否可讀*/*讀標(biāo)準(zhǔn)輸入*/7. 信號(hào)驅(qū)動(dòng)I/O的實(shí)現(xiàn) 信號(hào)驅(qū)動(dòng)I/O的實(shí)現(xiàn),要通過(guò)信號(hào)驅(qū)動(dòng)方式對(duì)多個(gè)句柄進(jìn)行復(fù)用,要通過(guò)如下幾個(gè)步驟:將這些句柄(描述符)的屬主都設(shè)為一個(gè)進(jìn)程。將這些句柄(描述符)的標(biāo)志位O_ASYNC打開(kāi),讓句柄(描述符)發(fā)生I/O事件時(shí)發(fā)送SIGIO信號(hào)。在屬主進(jìn)程中設(shè)置對(duì)SIGIO信號(hào)的處理。當(dāng)有I/O事件在任何一個(gè)句柄(描述符)上發(fā)生時(shí),系統(tǒng)都會(huì)向進(jìn)程發(fā)送SIGIO信號(hào)。進(jìn)程在對(duì)SIGIO的中斷處理中再查詢(xún)各個(gè)句柄(描述符)狀態(tài),進(jìn)行相應(yīng)的處理

16、。根據(jù)以上描述完成下面的程序填空。voidioaction(intsigno)/*定義信號(hào)處理程序*/.intmain()stdinfd=fileno(stdin);/*指定信號(hào)處理程序*/*句柄(描述符)所有者為當(dāng)前進(jìn)程*/inton=1;ioctl(sockfd,FIOASYNC,&on);/*sockfd發(fā)生I/O事件時(shí)發(fā)送SIGIO信號(hào)*/for(;)n=read(stdinfd,msg,BUFLEN);/*可能阻塞*/8. 非阻塞I/O的實(shí)現(xiàn) 非阻塞I/O的實(shí)現(xiàn),可以通過(guò)fcntl()來(lái)改變句柄(或描述符)的標(biāo)志來(lái)實(shí)現(xiàn)。將句柄(描述符)sockfd設(shè)置為非阻塞的代碼是。intflag

17、s:/*讀取句柄當(dāng)前標(biāo)志*/*加入非阻塞標(biāo)志*/*設(shè)置帶有非阻塞標(biāo)志的新標(biāo)志*/9. (根據(jù)程序?qū)戇\(yùn)行結(jié)果)線程問(wèn)題 #include #include #include #include int myglobal; pthread_mutex_t mymutex=PTHREAD_MUTEX_INITIALIZER;void *thread_function(void *arg) int i,j; for ( i=0; i6; i+) pthread_mutex_lock(&mymutex); j=myglobal; j=j+1; printf(.); fflush(stdout); slee

18、p(1); myglobal=j; pthread_mutex_unlock(&mymutex); return NULL; int main(void) pthread_t mythread; int i; if ( pthread_create( &mythread, NULL, thread_function, NULL) ) printf(error creating thread.); abort(); for ( i=0; i6; i+) pthread_mutex_lock(&mymutex); myglobal=myglobal+1; pthread_mutex_unlock(

19、&mymutex); printf(F); fflush(stdout); sleep(1); if ( pthread_join ( mythread, NULL ) ) printf(error joining thread.); abort(); printf(nmyglobal equals %dn,myglobal); exit(0); 運(yùn)行結(jié)果如下:.F.F.F.F.F.FMyglobal equals 1210. (根據(jù)程序?qū)戇\(yùn)行結(jié)果)線程問(wèn)題 #include #include pthread_once_t once=PTHREAD_ONCE_INIT;void once_ru

20、n(void) printf(once_run in thread %dn,pthread_self();void * child1(void *arg) int tid=pthread_self(); printf(thread %d entern,tid); pthread_once(&once,once_run); printf(thread %d returnsn,tid); void * child2(void *arg) int tid=pthread_self(); printf(thread %d entern,tid); pthread_once(&once,once_run

21、); printf(thread %d returnsn,tid); int main(void) int tid1,tid2; printf(hellon); pthread_create(&tid1,NULL,child1,NULL); pthread_create(&tid2,NULL,child2,NULL); sleep(10); printf(main thread exitn); return 0;運(yùn)行結(jié)果如下,線程的ID隨便用一個(gè)整數(shù)來(lái)代替。HelloThread 123456 enterOnce_run in thread 123456Thread 123456 return

22、sThread 654321 enterThread 654321 returnsMain thread exit11. (根據(jù)程序?qū)戇\(yùn)行結(jié)果)主機(jī)問(wèn)題 main(int argc, const char *argv) ulong_t addr; struct hostent *hp; char *p; if (argc != 2) printf(usage: %s IP-addressn, argv0); exit (1); if (addr = inet_addr(argv1) = -1) printf(IP-address must be of the form a.b.c.dn); e

23、xit (1); hp = gethostbyaddr(char *)&addr, sizeof (addr), AF_INET); if (hp = NULL) printf(host information for %s not foundn, argv1); exit (1); for (p = hp-h_addr_list; *p != 0; p+) struct in_addr in; char *q; memcpy(&in.s_addr, *p, sizeof (in.s_addr); printf(%st%s, inet_ntoa(in), hp-h_name); for (q = hp-h_aliases; *q != 0; q+) printf( %s, *q); exit (0

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論