一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

linux網(wǎng)絡(luò)編程之shutdown() 與 close()函數(shù)詳解

 lifei_szdz 2013-01-09

linux網(wǎng)絡(luò)編程之shutdown() 與 close()函數(shù)詳解

分類: linux 網(wǎng)絡(luò)編程 950人閱讀 評論(1) 收藏 舉報

1.close()函數(shù)

  1. <span style="font-size:13px;">#include<unistd.h>  
  2. int close(int sockfd);     //返回成功為0,出錯為-1.</span>  

    close 一個套接字的默認(rèn)行為是把套接字標(biāo)記為已關(guān)閉,然后立即返回到調(diào)用進(jìn)程,該套接字描述符不能再由調(diào)用進(jìn)程使用,也就是說它不能再作為read或write的第一個參數(shù),然而TCP將嘗試發(fā)送已排隊等待發(fā)送到對端的任何數(shù)據(jù),發(fā)送完畢后發(fā)生的是正常的TCP連接終止序列。

    在多進(jìn)程并發(fā)服務(wù)器中,父子進(jìn)程共享著套接字,套接字描述符引用計數(shù)記錄著共享著的進(jìn)程個數(shù),當(dāng)父進(jìn)程或某一子進(jìn)程close掉套接字時,描述符引用計數(shù)會相應(yīng)的減一,當(dāng)引用計數(shù)仍大于零時,這個close調(diào)用就不會引發(fā)TCP的四路握手?jǐn)噙B過程。

2.shutdown()函數(shù)

  1. <span style="font-size:13px;">#include<sys/socket.h>  
  2. int shutdown(int sockfd,int howto);  //返回成功為0,出錯為-1.</span>  

    該函數(shù)的行為依賴于howto的值

    1.SHUT_RD:值為0,關(guān)閉連接的讀這一半。

    2.SHUT_WR:值為1,關(guān)閉連接的寫這一半。

    3.SHUT_RDWR:值為2,連接的讀和寫都關(guān)閉。

    終止網(wǎng)絡(luò)連接的通用方法是調(diào)用close函數(shù)。但使用shutdown能更好的控制斷連過程(使用第二個參數(shù))。

3.兩函數(shù)的區(qū)別
    close與shutdown的區(qū)別主要表現(xiàn)在:
    close函數(shù)會關(guān)閉套接字ID,如果有其他的進(jìn)程共享著這個套接字,那么它仍然是打開的,這個連接仍然可以用來讀和寫,并且有時候這是非常重要的 ,特別是對于多進(jìn)程并發(fā)服務(wù)器來說。

    而shutdown會切斷進(jìn)程共享的套接字的所有連接,不管這個套接字的引用計數(shù)是否為零,那些試圖讀得進(jìn)程將會接收到EOF標(biāo)識,那些試圖寫的進(jìn)程將會檢測到SIGPIPE信號,同時可利用shutdown的第二個參數(shù)選擇斷連的方式。

    下面將展示一個客戶端例子片段來說明使用close和shutdown所帶來的不同結(jié)果:

     客戶端有兩個進(jìn)程,父進(jìn)程和子進(jìn)程,子進(jìn)程是在父進(jìn)程和服務(wù)器建連之后fork出來的,子進(jìn)程發(fā)送標(biāo)準(zhǔn)輸入終端鍵盤輸入數(shù)據(jù)到服務(wù)器端,知道接收到EOF標(biāo)識,父進(jìn)程則接受來自服務(wù)器端的響應(yīng)數(shù)據(jù)。

  1. /* First  Sample client fragment, 
  2.  * 多余的代碼及變量的聲明已略       */  
  3.    s=connect(...);  
  4.    if( fork() ){   /*      The child, it copies its stdin to the socket              */  
  5.        while( gets(buffer) >0)  
  6.            write(s,buf,strlen(buffer));  
  7.            close(s);  
  8.            exit(0);  
  9.    }  
  10.    else {          /* The parent, it receives answers  */  
  11.         while( (n=read(s,buffer,sizeof(buffer)){  
  12.             do_something(n,buffer);  
  13.             /* Connection break from the server is assumed  */  
  14.             /* ATTENTION: deadlock here                     */  
  15.          wait(0); /* Wait for the child to exit          */  
  16.          exit(0);  
  17.     }  

    對于這段代碼,我們所期望的是子進(jìn)程獲取完標(biāo)準(zhǔn)終端的數(shù)據(jù),寫入套接字后close套接字,并退出,服務(wù)器端接收完數(shù)據(jù)檢測到EOF(表示數(shù)據(jù)已發(fā)送完),也關(guān)閉連接,并退出。接著父進(jìn)程讀取完服務(wù)器端響應(yīng)的數(shù)據(jù),并退出。然而,事實會是這樣子的嘛,其實不然!子進(jìn)程close套接字后,套接字對于父進(jìn)程來說仍然是可讀和可寫的,盡管父進(jìn)程永遠(yuǎn)都不會寫入數(shù)據(jù)。因此,此socket的斷連過程沒有發(fā)生,因此,服務(wù)器端就不會檢測到EOF標(biāo)識,會一直等待從客戶端來的數(shù)據(jù)。而此時父進(jìn)程也不會檢測到服務(wù)器端發(fā)來的EOF標(biāo)識。這樣服務(wù)器端和客戶端陷入了死鎖(deadlock)。如果用shutdown代替close,則會避免死鎖的發(fā)生。

  1. if( fork() ) {  /* The child                    */  
  2.       while( gets(buffer)  
  3.          write(s,buffer,strlen(buffer));  
  4.       shutdown(s,1); /* Break the connection 
  5.                         *for writing, The server will detect EOF now. Note: reading from 
  6.                   *the socket is still allowed. The server may send some more data 
  7.                   *after receiving EOF, why not? */  
  8.       exit(0);  
  9.  }  

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    亚洲国产成人久久一区二区三区| 偷拍偷窥女厕一区二区视频| 国产日本欧美韩国在线| 欧美区一区二区在线观看| 91久久国产福利自产拍| 伊人久久青草地综合婷婷| 国产丝袜极品黑色高跟鞋| 免费高清欧美一区二区视频| 欧美日韩无卡一区二区| 人妻少妇av中文字幕乱码高清| 少妇视频一区二区三区| 黄色在线免费高清观看| 99久久精品一区二区国产| 青青操视频在线播放免费| 久久经典一区二区三区| 国产精品午夜福利在线观看| 国产日本欧美特黄在线观看| 日本欧美一区二区三区高清| 中文字幕日韩欧美理伦片| 九九热这里只有免费精品| 日本免费一区二区三女| 91亚洲熟女少妇在线观看| 色欧美一区二区三区在线| 国产水滴盗摄一区二区| 91久久精品在这里色伊人| 熟女高潮一区二区三区| 91播色在线免费播放| 中文字幕在线五月婷婷| 91欧美日韩中在线视频| 国产欧美一区二区三区精品视| 日本精品啪啪一区二区三区| 中文字幕乱码一区二区三区四区| 亚洲中文在线中文字幕91| 欧美成人免费夜夜黄啪啪| 欧洲一级片一区二区三区| 国产精品免费视频视频| 国产精品偷拍视频一区| 偷拍美女洗澡免费视频| 精品国产丝袜一区二区| 午夜福利精品视频视频| 成人午夜视频在线播放|