青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

大龍的博客

常用鏈接

統(tǒng)計(jì)

最新評(píng)論

send或者write socket遭遇SIGPIPE信號(hào)(轉(zhuǎn))

當(dāng)服務(wù)器close一個(gè)連接時(shí),若client端接著發(fā)數(shù)據(jù)。根據(jù)TCP協(xié)議的規(guī)定,會(huì)收到一個(gè)RST響應(yīng),client再往這個(gè)服務(wù)器發(fā)送數(shù)據(jù)時(shí),系統(tǒng)會(huì)發(fā)出一個(gè)SIGPIPE信號(hào)給進(jìn)程,告訴進(jìn)程這個(gè)連接已經(jīng)斷開(kāi)了,不要再寫(xiě)了。

又或者當(dāng)一個(gè)進(jìn)程向某個(gè)已經(jīng)收到RST的socket執(zhí)行寫(xiě)操作是,內(nèi)核向該進(jìn)程發(fā)送一個(gè)SIGPIPE信號(hào)。該信號(hào)的缺省學(xué)位是終止進(jìn)程,因此進(jìn)程必須捕獲它以免不情愿的被終止。


根據(jù)信號(hào)的默認(rèn)處理規(guī)則SIGPIPE信號(hào)的默認(rèn)執(zhí)行動(dòng)作是terminate(終止、退出),所以client會(huì)退出。若不想客戶端退出可以把 SIGPIPE設(shè)為SIG_IGN

如:signal(SIGPIPE, SIG_IGN);
這時(shí)SIGPIPE交給了系統(tǒng)處理。

服務(wù)器采用了fork的話,要收集垃圾進(jìn)程,防止僵尸進(jìn)程的產(chǎn)生,可以這樣處理:
signal(SIGCHLD,SIG_IGN);
交給系統(tǒng)init去回收。
這里子進(jìn)程就不會(huì)產(chǎn)生僵尸進(jìn)程了。


在linux下寫(xiě)socket的程序的時(shí)候,如果嘗試send到一個(gè)disconnected socket上,就會(huì)讓底層拋出一個(gè)SIGPIPE信號(hào)。
這個(gè)信號(hào)的缺省處理方法是退出進(jìn)程,大多數(shù)時(shí)候這都不是我們期望的。因此我們需要重載這個(gè)信號(hào)的處理方法。調(diào)用以下代碼,即可安全的屏蔽SIGPIPE:
struct sigaction sa;
sa.sa_handler = SIG_IGN;
sigaction( SIGPIPE, &sa, 0 );

signal設(shè)置的信號(hào)句柄只能起一次作用,信號(hào)被捕獲一次后,信號(hào)句柄就會(huì)被還原成默認(rèn)值了。
sigaction設(shè)置的信號(hào)句柄,可以一直有效,值到你再次改變它的設(shè)置。

struct sigaction action;
action.sa_handler = handle_pipe;
sigemptyset(&action.sa_mask);
action.sa_flags = 0;
sigaction(SIGPIPE, &action, NULL);
void handle_pipe(int sig)
{
        //不做任何處理即可
}

RST的含義為“復(fù)位”,它是TCP在某些錯(cuò)誤情況下所發(fā)出的一種TCP分節(jié)。有三個(gè)條件可以產(chǎn)生RST:

1), SYN到達(dá)某端口但此端口上沒(méi)有正在監(jiān)聽(tīng)的服務(wù)器。
2), TCP想取消一個(gè)已有連接
3), TCP接收了一個(gè)根本不存在的連接上的分節(jié)。

1. Connect 函數(shù)返回錯(cuò)誤ECONNREFUSED:
如果對(duì)客戶的SYN的響應(yīng)是RST,則表明該服務(wù)器主機(jī)在我們指定的端口上沒(méi)有進(jìn)程在等待與之連接(例如服務(wù)器進(jìn)程也許沒(méi)有啟動(dòng)),這稱為硬錯(cuò)(hard error),客戶一接收到RST,馬上就返回錯(cuò)誤ECONNREFUSED.

TCP為監(jiān)聽(tīng)套接口維護(hù)兩個(gè)隊(duì)列。兩個(gè)隊(duì)列之和不超過(guò)listen函數(shù)第二個(gè)參數(shù)backlog。

當(dāng) 一個(gè)客戶SYN到達(dá)時(shí),若兩個(gè)隊(duì)列都是滿的,TCP就忽略此分節(jié),且不發(fā)送RST.這個(gè)因?yàn)椋哼@種情況是暫時(shí)的,客戶TCP將重發(fā)SYN,期望不久就能在 隊(duì)列中找到空閑條目。要是TCP服務(wù)器發(fā)送了一個(gè)RST,客戶connect函數(shù)將立即發(fā)送一個(gè)錯(cuò)誤,強(qiáng)制應(yīng)用進(jìn)程處理這種情況,而不是讓TCP正常的重 傳機(jī)制來(lái)處理。還有,客戶區(qū)別不了這兩種情況:作為SYN的響應(yīng),意為“此端口上沒(méi)有服務(wù)器”的RST和意為“有服務(wù)器在此端口上但其隊(duì)列滿”的 RST.
Posix.1g允許以下兩種處理方法:忽略新的SYN,或?yàn)榇薙YN響應(yīng)一個(gè)RST.歷史上,所有源自Berkeley的實(shí)現(xiàn)都是忽略新的SYN。

2.如果殺掉服務(wù)器端處理客戶端的子進(jìn)程,進(jìn)程退出后,關(guān)閉它打開(kāi)的所有文件描述符,此時(shí),當(dāng)服務(wù)器TCP接收到來(lái)自此客戶端的數(shù)據(jù)時(shí),由于先前打開(kāi)的那個(gè)套接字接口的進(jìn)程已終止,所以以RST響應(yīng)。

經(jīng)常遇到的問(wèn)題:
如果不判斷read , write函數(shù)的返回值,就不知道服務(wù)器是否響應(yīng)了RST, 此時(shí)客戶端如果向接收了RST的套接口進(jìn)行寫(xiě)操作時(shí),內(nèi)核給該進(jìn)程發(fā)一個(gè)SIGPIPE信號(hào)。此信號(hào)的缺省行為就是終止進(jìn)程,所以,進(jìn)程必須捕獲它以免不情愿地被終止。

進(jìn)程不論是捕獲了該信號(hào)并從其信號(hào)處理程序返回,還是不理會(huì)該信號(hào),寫(xiě)操作都返回EPIPE錯(cuò)誤。


3. 服務(wù)器主機(jī)崩潰后重啟
如 果服務(wù)器主機(jī)與客戶端建立連接后崩潰,如果此時(shí),客戶端向服務(wù)器發(fā)送數(shù)據(jù),而服務(wù)器已經(jīng)崩潰不能響應(yīng)客戶端ACK,客戶TCP將持續(xù)重傳數(shù)據(jù)分節(jié),試圖從 服務(wù)器上接收一個(gè)ACK,如果服務(wù)器一直崩潰客戶端會(huì)發(fā)現(xiàn)服務(wù)器已經(jīng)崩潰或目的地不可達(dá),但可能需要比較長(zhǎng)的時(shí)間; 如果服務(wù)器在客戶端發(fā)現(xiàn)崩潰前重啟,服務(wù)器的TCP丟失了崩潰前的所有連接信息,所以服務(wù)器TCP對(duì)接收的客戶數(shù)據(jù)分節(jié)以RST響應(yīng)。

二、關(guān)于socket的recv:

對(duì)于TCP non-blocking socket, recv返回值== -1,但是errno == EAGAIN, 此時(shí)表示在執(zhí)行recv時(shí)相應(yīng)的socket buffer中沒(méi)有數(shù)據(jù),應(yīng)該繼續(xù)recv。

【If no messages are available at the socket and O_NONBLOCK is not set on the socket's file descriptor, recv() shall block until a message arrives. If no messages are available at the socket and O_NONBLOCK is set on the socket's file descriptor, recv() shall fail and set errno to [EAGAIN] or [EWOULDBLOCK].】

對(duì)于UDP recv 應(yīng)該一直讀取直到recv()==-1 && errno==EAGAIN,表示buffer中數(shù)據(jù)包被全部讀取。

 

 


    while(res != 0)
    {
        
//len = recv(sockfd, buff, MAXBUF, 0);


        len =recv(sockfd, buff, 5, 0);
        if(len < 0 ){
            if(errno== EAGAIN){
                printf("RE-Len:%d errno EAGAIN\n", len);
                return 12;
            }

            if (errno == EINTR)

               continue;          
            perror("recv error\n");
            break;
        }elseif(len > 0){
            printf("Recved:%s, and len is:%d \n", buff, len);
            len =send(sockfd, buff, len, 0);/* if the client socket was closed and the socketfd here in kernel has set the status as RST this process will recv a SIGPIPE, and the process will exit if we don't handle it to SIGING */
            if(len < 0){
                perror("send error");
                return-1;
            }
            memset(buff, 0, MAXBUF);
            continue;
        }else{
//==0

            printf("Disconnected by peer!\n");
            res = 0;
        }
    }



外記:
accetp()是慢系統(tǒng)調(diào)用,在信號(hào)產(chǎn)生時(shí)會(huì)中斷其調(diào)用并將errno變量設(shè)置為EINTR,此時(shí)應(yīng)重新調(diào)用accept()。
所以使用時(shí)應(yīng)這樣:


 while(1){
  if((connfd =accept(....))==-1 ){
  if(errno== EINTR)
  continue;
  perror("accept()");
  exit(1);
  }


  /* do sth with "connfd" */
  }



signal 與 sigaction 區(qū)別:
    signal函數(shù)每次設(shè)置具體的信號(hào)處理函數(shù)(非SIG_IGN)只能生效一次,每次在進(jìn)程響應(yīng)處理信號(hào)時(shí),隨即將信號(hào)處理函數(shù)恢復(fù)為默認(rèn)處理方式.所以如果想多次相同方式處理某個(gè)信號(hào),通常的做法是,在響應(yīng)函數(shù)開(kāi)始,再次調(diào)用signal設(shè)置。

int sig_int();//My signal handler

    ...
    signal(SIGINT, sig_int);
    ...

int sig_int()
{

   signal(SIGINT, sig_int);
    ....
}

這種代碼段的一個(gè)問(wèn)題是:在信號(hào)發(fā)生之后到信號(hào)處理程序中調(diào)用s i g n a l函數(shù)之間有一個(gè)
時(shí)間窗口。在此段時(shí)間中,可能發(fā)生另一次中斷信號(hào)。第二個(gè)信號(hào)會(huì)造成執(zhí)行默認(rèn)動(dòng)作,而對(duì)
中斷信號(hào)則是終止該進(jìn)程。這種類型的程序段在大多數(shù)情況下會(huì)正常工作,使得我們認(rèn)為它們
正確,而實(shí)際上卻并不是如此。
另一個(gè)問(wèn)題是:在進(jìn)程不希望某種信號(hào)發(fā)生時(shí),它不能關(guān)閉該信號(hào)

sigaction:
1.在信號(hào)處理程序被調(diào)用時(shí),系統(tǒng)建立的新信號(hào)屏蔽字會(huì)自動(dòng)包括正被遞送的信號(hào)。因此保證了在處理一個(gè)
給定的信號(hào)時(shí),如果這種信號(hào)再次發(fā)生,那么它會(huì)被阻塞到對(duì)前一個(gè)信號(hào)的處理結(jié)束為止
2.響應(yīng)函數(shù)設(shè)置后就一直有效,不會(huì)重置
3.對(duì)除S I G A L R M以外的所有信號(hào)都企圖設(shè)置S A _ R E S TA RT標(biāo)志,于是被這些信號(hào)中斷
的系統(tǒng)調(diào)用(read,write)都能自動(dòng)再起動(dòng)。不希望再起動(dòng)由S I G A L R M信號(hào)中斷的系統(tǒng)調(diào)用的原因是希望對(duì)I / O操作可以設(shè)置時(shí)間限制。
 
所以希望能用相同方式處理信號(hào)的多次出現(xiàn),最好用sigaction.信號(hào)只出現(xiàn)并處理一次,可以用signal

posted on 2011-11-05 01:13 大龍 閱讀(2307) 評(píng)論(0)  編輯 收藏 引用


只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲电影av在线| 久久亚洲视频| 亚洲人成高清| 亚洲欧美日韩成人| 亚洲一区二区日本| 欧美激情一区二区三区| 免费观看成人网| 国产日韩欧美综合| 亚洲天天影视| 亚洲一区在线免费| 欧美日韩一区二区三| 亚洲国产一区视频| 亚洲区在线播放| 久久午夜电影| 欧美成人黄色小视频| 黑人巨大精品欧美黑白配亚洲| 国产精品99久久不卡二区| 亚洲图片在线| 国产精品观看| 亚洲午夜一区| 午夜亚洲福利| 国产午夜精品久久久久久免费视| 亚洲午夜精品久久| 欧美亚洲一级| 国产亚洲在线| 久久精品国产一区二区三区| 久久久久网址| 亚洲丁香婷深爱综合| 麻豆国产精品va在线观看不卡| 欧美99在线视频观看| 亚洲成色777777在线观看影院| 久久字幕精品一区| 亚洲欧洲中文日韩久久av乱码| 日韩视频免费| 欧美网站在线观看| 亚洲免费在线视频| 久久久久久穴| 最近看过的日韩成人| 欧美日韩免费高清一区色橹橹| 日韩视频免费观看高清完整版| 一区二区三区四区在线| 国产精品二区三区四区| 性亚洲最疯狂xxxx高清| 麻豆91精品91久久久的内涵| 亚洲激情中文1区| 欧美日韩1区2区| 亚洲欧美日韩国产一区二区三区| 久久久视频精品| 亚洲国产日韩在线| 国产精品jizz在线观看美国| 欧美一区二区日韩| 欧美国产日韩一区| 午夜综合激情| 亚洲成色777777在线观看影院| 欧美久久久久久| 欧美亚洲在线播放| 91久久在线观看| 欧美在线欧美在线| 亚洲国产精品久久久| 欧美午夜精品| 久久久久一区| 亚洲视频精选在线| 欧美大胆a视频| 新67194成人永久网站| 91久久精品国产91性色| 国产麻豆9l精品三级站| 欧美大学生性色视频| 性欧美暴力猛交69hd| 亚洲人体影院| 美女福利精品视频| 亚洲欧美电影院| 亚洲欧洲一级| 红桃视频国产一区| 国产精品视频精品视频| 欧美极品一区| 久久免费视频一区| 午夜精品久久久久久久99热浪潮| 亚洲黄色av一区| 美女视频黄免费的久久| 亚洲欧美国产高清va在线播| 亚洲激情国产| 红桃视频成人| 国产三级欧美三级| 国产精品porn| 欧美日韩免费看| 欧美1区2区3区| 久久在线免费| 久久精品一本| 欧美一区二区性| 亚洲欧美网站| 午夜精品久久久久久久蜜桃app | 伊人久久亚洲美女图片| 国产精品电影在线观看| 欧美美女喷水视频| 欧美顶级艳妇交换群宴| 免费不卡中文字幕视频| 久久久99国产精品免费| 欧美一区二区三区婷婷月色| 亚洲一区网站| 亚洲欧美福利一区二区| 中文国产一区| 亚洲欧美高清| 亚洲欧美视频一区| 午夜精品亚洲一区二区三区嫩草| 亚洲一区二区综合| 亚洲性av在线| 欧美一区二区免费| 久久动漫亚洲| 久久久999国产| 猫咪成人在线观看| 你懂的一区二区| 欧美精品一卡二卡| 欧美精品在线视频| 欧美三级网址| 国产精品夜夜夜| 国产一区二区三区不卡在线观看| 国内精品一区二区| 伊人夜夜躁av伊人久久| 亚洲国产日韩欧美一区二区三区| 亚洲国产精品日韩| 日韩视频免费观看高清在线视频 | 久久综合伊人77777麻豆| 久久人91精品久久久久久不卡| 久久亚洲精品一区二区| 欧美成人精品一区二区三区| 欧美精品播放| 国产精品日韩电影| 激情自拍一区| 亚洲精品视频在线看| 中文精品99久久国产香蕉| 午夜精品久久久久久久99黑人| 亚洲欧美成人在线| 久久综合九色欧美综合狠狠| 亚洲国产精品成人va在线观看| 亚洲精品中文字| 午夜国产欧美理论在线播放| 久久成人18免费网站| 欧美成人激情视频| 国产精品久久久久一区| 激情国产一区二区| 99riav国产精品| 久久久精品一区二区三区| 亚洲国产精品久久人人爱蜜臀| 在线一区二区三区四区| 久久国产精品电影| 欧美日韩一级大片网址| 国产欧美日韩综合| 一本高清dvd不卡在线观看| 欧美制服第一页| 亚洲日本免费电影| 久久精品国产一区二区三| 欧美日韩在线免费观看| 影音先锋久久久| 亚洲欧美日韩国产一区二区| 欧美韩日视频| 欧美在线观看视频在线 | 欧美黄免费看| 国产亚洲精品bv在线观看| 一本色道久久综合亚洲精品婷婷 | 亚洲国产精品久久久久秋霞不卡 | 欧美成人在线网站| 午夜激情综合网| 欧美日韩一区精品| 亚洲国语精品自产拍在线观看| 欧美一级午夜免费电影| 亚洲精品网址在线观看| 欧美1区2区3区| 韩国三级电影久久久久久| 亚洲欧美精品suv| 亚洲国产欧美不卡在线观看| 久久不射2019中文字幕| 国产日本欧美在线观看| 亚洲午夜一级| 亚洲日产国产精品| 男同欧美伦乱| 在线播放中文字幕一区| 久久免费精品日本久久中文字幕| 亚洲图片在区色| 欧美视频在线观看免费网址| 亚洲免费成人av| 亚洲国产精品综合| 噜噜噜噜噜久久久久久91| 原创国产精品91| 另类成人小视频在线| 欧美影片第一页| 国产亚洲成av人在线观看导航| 亚洲一区二区不卡免费| 日韩图片一区| 欧美午夜免费影院| 亚洲男人第一av网站| 亚洲一区二区三区高清不卡| 欧美午夜电影完整版| 亚洲免费视频网站| 亚洲一区视频| 国产一区91精品张津瑜| 久久男人资源视频| 久久久久久香蕉网| 亚洲精品乱码久久久久| 亚洲区一区二| 国产精品成人在线观看|