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

下載本文檔

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

文檔簡介

1、中間件復(fù)習(xí)題一、 判斷題1. close()函數(shù)用于關(guān)閉套接字描述符,這個(gè)函數(shù)的調(diào)用會引發(fā)TCP的中止連接操作。(0)2. 在TCP的客戶端程序中,如果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ù)返回套接字對應(yīng)的遠(yuǎn)程地址。(0)5. inet_addr()函數(shù)既可用于IPV4也可用于IPV6的地址轉(zhuǎn)換。(0)6. Linux支持多種套接字類型,其中SOCKET_STREAM類型對應(yīng)的是UDP協(xié)議。(0)7.

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

3、個(gè)套接字描述符。(0)13. 在多線程并發(fā)服務(wù)器中,為了防止父子線程對描述符的操作造成混亂,在主線程創(chuàng)建子線程后,應(yīng)在父線程中關(guān)閉不用的已連接描述符。(0)14. 在線程專用數(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í)要先檢查TSD是否有綁定值。(0)17. tpthread_join()可以等待可分離線程的結(jié)束。(0)18. 線程專用數(shù)據(jù)是解決線程安全性的的唯一方法。(0)19. sel

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

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

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

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

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

9、核保存此消息,并按第一種情況,連續(xù)發(fā)送SYN,直到規(guī)定的超時(shí)時(shí)間,對方仍沒有響應(yīng),則返回保存的消息(即ICMP錯(cuò)誤)EHOSTUNREACH或ENETUNREACH錯(cuò)誤返回給進(jìn)程。8. 請簡述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)程并不共享這些存儲空間部分。使用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ū)別都是由此而來的:1)速度:線程產(chǎn)生的速度快,線程間的通訊快、切換快等,因?yàn)樗麄冊谕粋€(gè)地址空間內(nèi)。2)資源利用率:線程的資源利用率比較好也是因?yàn)樗麄冊谕粋€(gè)地址空間內(nèi)。3)同步問題:線程使用公共變量/內(nèi)存時(shí)需要使用同步機(jī)制還是因?yàn)樗麄冊谕粋€(gè)地址空間內(nèi)。10. 簡述select()函數(shù)中timeout參數(shù)在不同的取值情況中,對select阻塞狀態(tài)的影響。 答:(1)永遠(yuǎn)等待下去:僅在有一個(gè)描述字準(zhǔn)備好I/O時(shí)才返回,因此可以將參數(shù)timeout設(shè)置為空指針。(2)等待固定時(shí)間:在有

11、一個(gè)描述字準(zhǔn)備好I/O時(shí)返回,但不超過由timeout()參數(shù)所指timeval結(jié)構(gòu)中指定的秒數(shù)和微秒數(shù)。(3)根本不用等待:檢查描述字后立即返回,這稱為輪詢。11. 請說明在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ù)是文件描述符集合,意思就是對這些的文件描述符進(jìn)行循環(huán)監(jiān)聽,當(dāng)某個(gè)

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

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

14、描述符。6. 談話程序 雙方都可以從終端輸入一串字符(以回車結(jié)束),通過UDP的方式發(fā)送到對方,并顯示在對方的終端上。從命令行輸入目的地址、目的端口、源地址、源端口。使用I/O復(fù)用,進(jìn)程阻塞到select,當(dāng)標(biāo)準(zhǔn)輸入和socket有數(shù)據(jù)時(shí)返回。根據(jù)以下程序示例完成程序填空。fd_set infds;For(;)           /*重置句柄集 */         

15、0;/*把標(biāo)準(zhǔn)輸入置入句柄集*/          /*把socket置入句柄集*/      maxfd=max(fileno(stdin),sockfd)+1;     if(select(maxfd,&infds,NULL,NULL,NULL)=-1)       /*錯(cuò)誤處理*/  

16、              if(FD_ISSET(sockfd,&infds)  /*測試socket是否可讀*/               /* 讀socket */       

17、60;     if(FD_ISSET(fileno(stdin),&infds)  /*測試標(biāo)準(zhǔn)輸入是否可讀*/       /*讀標(biāo)準(zhǔn)輸入 */         7. 信號驅(qū)動I/O的實(shí)現(xiàn) 信號驅(qū)動I/O的實(shí)現(xiàn),要通過信號驅(qū)動方式對多個(gè)句柄進(jìn)行復(fù)用,要通過如下幾個(gè)步驟:將這些句柄(描述符)的屬主都設(shè)為一個(gè)進(jìn)程。將這些句柄(描述符)的標(biāo)志位O_AS

18、YNC打開,讓句柄(描述符)發(fā)生I/O事件時(shí)發(fā)送SIGIO信號。在屬主進(jìn)程中設(shè)置對SIGIO信號的處理。當(dāng)有I/O事件在任何一個(gè)句柄(描述符)上發(fā)生時(shí),系統(tǒng)都會向進(jìn)程發(fā)送SIGIO信號。進(jìn)程在對SIGIO的中斷處理中再查詢各個(gè)句柄(描述符)狀態(tài),進(jìn)行相應(yīng)的處理。根據(jù)以上描述完成下面的程序填空。void ioaction(int signo)  /*定義信號處理程序*/.int main()    stdinfd=fileno(stdin);/*指定信號處理程序*/*句柄(描述符)所有者為當(dāng)前進(jìn)程*/

19、60;   int on=1;    ioctl(sockfd,FIOASYNC,&on); /*sockfd發(fā)生I/O事件時(shí)發(fā)送SIGIO信號*/    for(;)                n=read(stdinfd,msg,BUFLEN);/*可能阻塞*/  

20、0; 8. 非阻塞I/O的實(shí)現(xiàn) 非阻塞I/O的實(shí)現(xiàn),可以通過fcntl()來改變句柄(或描述符)的標(biāo)志來實(shí)現(xiàn)。將句柄(描述符)sockfd設(shè)置為非阻塞的代碼是。int flags:/*讀取句柄當(dāng)前標(biāo)志*/*加入非阻塞標(biāo)志 */*設(shè)置帶有非阻塞標(biāo)志的新標(biāo)志*/9. (根據(jù)程序?qū)戇\(yùn)行結(jié)果)線程問題 #include <pthread.h>                              #inclu

21、de <stdlib.h>                               #include <unistd.h>                               #include <stdio.h>      

22、;                          int myglobal;                                     pthread_mutex_t mymutex=PTHREAD_MUTEX_INITIALIZER;void *thread_funct

23、ion(void *arg)                 int i,j;                                          for ( i=0; i<6; i+)               &#

24、160;                 pthread_mutex_lock(&mymutex);                       j=myglobal;                                 

25、0;       j=j+1;                                              printf(".");                         &#

26、160;              fflush(stdout);                                     sleep(1);                           

27、0;               myglobal=j;                                         pthread_mutex_unlock(&mymutex);                 

28、0;                                               return NULL;                                   

29、0;   int main(void)                                                                               &#

30、160;                  pthread_t mythread;                                               int i;             

31、60;                                              if ( pthread_create( &mythread, NULL, thread_function, NULL) )        printf("error creating thread.")

32、;                                  abort();                                                 

33、60;                                                                      for ( i=0; i<6; i+)         &

34、#160;                                      pthread_mutex_lock(&mymutex);                                     &#

35、160;myglobal=myglobal+1;                                               pthread_mutex_unlock(&mymutex);                     

36、60;              printf("F");                                                       fflush(stdout);     &

37、#160;                                              sleep(1);                                    

38、;                                                                                   if ( pthrea

39、d_join ( mythread, NULL ) )                               printf("error joining thread.");                                  &

40、#160;abort();                                                                                 

41、                                      printf("nmyglobal equals %dn",myglobal);                        exit(0);       

42、60;                                                    運(yùn)行結(jié)果如下:.F.F.F.F.F.FMyglobal equals 1210. (根據(jù)程序?qū)戇\(yùn)行結(jié)果)線程問題 #include <pthread.h>#include <stdio.h>pthread_

43、once_t  once=PTHREAD_ONCE_INIT;void once_run(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&

44、quot;,tid);   void * child2(void *arg)  int tid=pthread_self();  printf("thread %d entern",tid);  pthread_once(&once,once_run);  printf("thread %d returnsn",tid);   int main(void)   int tid1,tid2;   printf("hellon");

45、   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ù)來代替。HelloThread 123456 enterOnce_run in thread 123456Thread 123456 return

46、sThread 654321 enterThread 654321 returnsMain thread exit11. (根據(jù)程序?qū)戇\(yùn)行結(jié)果)主機(jī)問題 main(int argc, const char *argv)    ulong_t addr;    struct hostent *hp;    char *p;    if (argc != 2)        printf("usage: %s IP-addressn", argv0);

47、0;      exit (1);              if (addr = inet_addr(argv1) = -1)        printf("IP-address must be of the form a.b.c.dn");        exit (1);            hp = gethostbyaddr(char *)&addr, sizeof (addr), AF_INET);    if (hp = NULL) 

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論