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

            focus on linux, c/c++, lua

            關(guān)于非阻塞的connect處理

            首先來看一段代碼,該代碼摘自http://www.cnblogs.com/yuxingfirst/archive/2013/03/08/2950281.html,感謝這位網(wǎng)友
            int select_version(int *fd) {
                int c_fd = *fd;
                fd_set rset, wset;
                struct timeval tval;
                FD_ZERO(&rset);
                FD_SET(c_fd, &rset);
                wset = rset;
                tval.tv_sec = 0;
                tval.tv_usec = 300 * 1000; //300毫秒
                int ready_n;
                if ((ready_n = select(c_fd + 1, &rset, &wset, NULL, &tval)) == 0) {
                    close(c_fd); /* timeout */
                    errno = ETIMEDOUT;
                    perror("select timeout.\n");
                    return (-1);
                }
                if (FD_ISSET(c_fd, &rset)) {
                    int error;
                    socklen_t len = sizeof (error);
                    // 這里沒出錯,所以errno值沒有改變
                    if (getsockopt(c_fd, SOL_SOCKET, SO_ERROR, &error, &len) < 0) {
                        cout << "getsockopt error." << endl;
                        return -1;
                    }          
                    cout << "in fire." << error << endl;       
                }
                if (FD_ISSET(c_fd, &wset)) {
                    int error;
                    socklen_t len = sizeof (error);
                    if (getsockopt(c_fd, SOL_SOCKET, SO_ERROR, &error, &len) < 0) {
                        cout << "getsockopt error." << endl;
                        return -1;
                    }
                    cout << "out fire." << error << endl;
                }
                return 0;
            }
            這段代碼主要處理的是在connect返回EINPROGRESS的情況下,在select中的連接成功的處理。
            網(wǎng)上的結(jié)論是:
             Posix 定義了兩條與 select 和 非阻塞 connect 相關(guān)的規(guī)定:
            1)連接成功建立時,socket 描述字變?yōu)榭蓪憽#ㄟB接建立時,寫緩沖區(qū)空閑,所以可寫)
            2)連接建立失敗時,socket 描述字既可讀又可寫。 (由于有未決的錯誤,從而可讀又可寫)
            隨便測試一個不可用端口,上面的代碼依然返回0,可見上面的代碼有點問題,在判斷
            FD_ISSET的時候,應(yīng)該判斷error是否大于0,應(yīng)該這么寫
             if (FD_ISSET(c_fd, &rset)) {
                    int error;
                    socklen_t len = sizeof (error);
                    // 這里沒出錯,所以errno值沒有改變
                    if (getsockopt(c_fd, SOL_SOCKET, SO_ERROR, &error, &len) < 0) {
                        cout << "getsockopt error." << endl;
                        return -1;
                    }          
                    cout << "in fire." << error << endl;
                    if (error > 0)    // 等于EINPROGRESS怎么辦?
                    {
                         return -1;
                    }
                }
            這里面還有個問題就是如果這個時候error大于0但是等于EINPROGRESS是否算連接成功。
            本例在linux2.6下測試沒問題,不知道在windows或是在mac os上對于非阻塞的connect處理是否有什么不同。

            posted on 2014-07-01 17:25 zuhd 閱讀(4226) 評論(0)  編輯 收藏 引用 所屬分類: server

            久久综合狠狠综合久久综合88| 国产免费福利体检区久久| 一本久久综合亚洲鲁鲁五月天亚洲欧美一区二区| 成人免费网站久久久| 99久久婷婷国产综合精品草原| 久久av高潮av无码av喷吹| 亚洲欧洲久久av| 国产亚洲精品自在久久| 久久精品无码一区二区三区日韩| 久久婷婷色香五月综合激情| 日本欧美久久久久免费播放网| 99热成人精品免费久久| 久久精品国产亚洲av麻豆蜜芽 | 中文字幕无码免费久久| 久久这里只有精品首页| 伊人久久大香线蕉AV一区二区 | 精品无码久久久久久久动漫| 久久国产欧美日韩精品| 精品国产一区二区三区久久蜜臀| 欧美牲交A欧牲交aⅴ久久| 久久久久这里只有精品 | 久久se精品一区二区影院| 浪潮AV色综合久久天堂| 日韩va亚洲va欧美va久久| 日本久久久精品中文字幕| 欧洲成人午夜精品无码区久久| 国内精品伊人久久久影院| 99久久成人18免费网站| 国产高潮国产高潮久久久| 亚洲国产精品无码久久久秋霞2 | 国内精品久久久久久久影视麻豆| 久久久av波多野一区二区| 亚洲国产精品高清久久久 | 国产精品久久网| 国产精品久久久久9999| 亚洲综合伊人久久综合| 99久久夜色精品国产网站| 亚洲中文字幕久久精品无码APP | 久久成人精品| 亚洲精品高清一二区久久| 色天使久久综合网天天|