• <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>

            那誰(shuí)的技術(shù)博客

            感興趣領(lǐng)域:高性能服務(wù)器編程,存儲(chǔ),算法,Linux內(nèi)核
            隨筆 - 210, 文章 - 0, 評(píng)論 - 1183, 引用 - 0
            數(shù)據(jù)加載中……

            帶超時(shí)機(jī)制的DNS解析API

            根據(jù)域名解析出該域名所綁定的IP地址,這個(gè)是客戶(hù)端常做的工作,只有在解析成功之后,才能正確的與服務(wù)器端建立連接.

            一般常使用getaddrinfo,gethostbyname 之類(lèi)的API來(lái)完成這個(gè)工作,但是,這些API都有一個(gè)問(wèn)題,就是都不支持超時(shí)機(jī)制,假如客戶(hù)端調(diào)用這些API阻塞,給程序會(huì)帶來(lái)影響.

            現(xiàn)在想要達(dá)到的目標(biāo)就是:調(diào)用API去解析域名,如果在一個(gè)時(shí)間內(nèi)不能解析成功,就報(bào)錯(cuò)退出.

            我查了一下資料,有一些庫(kù)可以支持這樣的要求,但是都需要自己去做DNS解析的工作,也就是需要自己去封包/解包DNS協(xié)議報(bào)文.顯然,這樣的事情工作量太大了,不在我考慮的范圍之中.

            其實(shí)系統(tǒng)中有不少這樣的API,沒(méi)有阻塞機(jī)制,又不能設(shè)置超時(shí)參數(shù),有沒(méi)有一個(gè)好的策略,可以既使用這些API,又能給它們加上超時(shí)機(jī)制.

            我看了下APUE中關(guān)于sigsetjmp + alarm + siglongjmp的方式來(lái)處理這樣的問(wèn)題,自己寫(xiě)了一個(gè)簡(jiǎn)單的demo,看來(lái)是可以滿(mǎn)足的:
            #include <setjmp.h>
            #include 
            <stdio.h>
            #include 
            <sys/types.h>
            #include 
            <sys/socket.h>
            #include 
            <netdb.h>
            #include 
            <signal.h>
            #include 
            <string.h>

            int resolv_name(const char* url, int second);

            int main()
            {
                resolv_name(
            "www.test2test.com"1);
                
            return 0;
            }

            static sigjmp_buf                   jmpbuf;
            static volatile sig_atomic_t        canjump;

            static void
            sig_alrm(
            int signo)
            {
                
            if (!canjump)
                    
            return;

                siglongjmp(jmpbuf, 
            1);  /* jump back to main, don't return */
                canjump 
            = 0;
            }

            int resolv_name(const char* url, int second)
            {
                
            struct addrinfo *result = NULL;
                
            int ret;
                
            struct addrinfo addr;

                memset(
            &addr, 0 , sizeof(addr));
                addr.ai_socktype 
            = SOCK_STREAM;

                
            if (signal(SIGALRM, sig_alrm) == SIG_ERR)
                    printf(
            "signal(SIGALRM) error\n");
                canjump 
            = 1;
                
            if (sigsetjmp(jmpbuf, 1)) 
                {
                    printf(
            "ending main\n");
                    
            return -1;
                }

                alarm(second);

                ret 
            = getaddrinfo(url, NULL, &addr, &result);
                canjump 
            = 0;

                
            if (!ret)
                {
                    
            struct addrinfo *pCurr = result;
                    printf(
            "the \'%s\' ip is:\n", url);
                    
            for (; pCurr; pCurr = pCurr->ai_next)
                    {
                        printf(
            "%s\n", inet_ntoa(((struct sockaddr_in*)(pCurr->ai_addr))->sin_addr));
                    }
                }

                
            return 0;
            }


            不過(guò)這個(gè)策略還是有問(wèn)題的,這個(gè)API通過(guò)alarm函數(shù)設(shè)定了一個(gè)定時(shí)器,超時(shí)的時(shí)候發(fā)送一個(gè)SIGALARM信號(hào),如果系統(tǒng)中已經(jīng)存在了通過(guò)alarm定制的定時(shí)器,如果解決這些定時(shí)器可能發(fā)生的沖突問(wèn)題?如果有更好的辦法,歡迎提示.



            posted on 2009-11-07 19:28 那誰(shuí) 閱讀(9601) 評(píng)論(5)  編輯 收藏 引用 所屬分類(lèi): Linux/Unix

            評(píng)論

            # re: 帶超時(shí)機(jī)制的DNS解析API[未登錄](méi)  回復(fù)  更多評(píng)論   

            可以用libevent的那個(gè)dns庫(kù)...
            2009-11-09 01:20 | bobo

            # re: 帶超時(shí)機(jī)制的DNS解析API  回復(fù)  更多評(píng)論   

            關(guān)鍵問(wèn)題是有些 dns 解析失敗,有時(shí)返回 127.0.0.1 .

            2009-11-18 15:55 | hzh

            # re: 帶超時(shí)機(jī)制的DNS解析API  回復(fù)  更多評(píng)論   

            查了一下 可以通過(guò)alarm的返回值來(lái)判斷是否已經(jīng)通過(guò)alarm定制了定時(shí)器
            SYNOPSIS
            #include <unistd.h>
            unsigned alarm(unsigned seconds);

            RETURN VALUE
            If there is a previous alarm() request with time
            remaining, alarm() shall return a non-zero value that
            is the number of seconds until the previous request
            would have generated a SIGALRM signal. Otherwise,
            alarm() shall return 0.
            2010-04-14 15:47 | bryan

            # re: 帶超時(shí)機(jī)制的DNS解析API  回復(fù)  更多評(píng)論   

            多線(xiàn)程怎么辦
            2010-12-09 13:59 | sss

            # re: 帶超時(shí)機(jī)制的DNS解析API  回復(fù)  更多評(píng)論   

            超時(shí)后原來(lái)創(chuàng)建的socket套接字無(wú)法關(guān)閉,會(huì)造成句柄被用完的問(wèn)題。
            2014-12-01 14:51 | shifu
            久久久免费观成人影院| 伊人久久大香线焦综合四虎| 精品久久久无码人妻中文字幕| 午夜精品久久久久久毛片| 久久久久综合网久久| 99久久做夜夜爱天天做精品| 国产精品久久成人影院| 亚洲人AV永久一区二区三区久久| 久久国产色AV免费看| 人人狠狠综合久久亚洲高清| 久久永久免费人妻精品下载| 久久久久亚洲AV无码专区桃色 | 久久精品国产久精国产果冻传媒| 99久久精品毛片免费播放| 久久久久免费精品国产| 久久综合狠狠综合久久激情 | 色婷婷综合久久久久中文一区二区| 国产精品成人99久久久久91gav| 国产精品久久久亚洲| 亚洲国产精品无码久久一区二区 | 久久精品国产精品青草app| 伊人久久大香线蕉综合Av| 国产精品久久久久久五月尺| 国产精品青草久久久久福利99 | 国内精品久久久久| 精品久久8x国产免费观看| 伊人久久大香线蕉亚洲五月天| 人人妻久久人人澡人人爽人人精品| 久久精品综合一区二区三区| 精品欧美一区二区三区久久久| 久久精品国产亚洲沈樵| 国产∨亚洲V天堂无码久久久| 亚洲av成人无码久久精品| 囯产精品久久久久久久久蜜桃| 久久这里有精品| 久久久久久精品久久久久| 伊人久久大香线蕉AV色婷婷色| 久久亚洲精品无码AV红樱桃| 久久超碰97人人做人人爱| 久久精品中文闷骚内射| 国产精品久久波多野结衣|