欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
TCP/IP編程基礎——超時(shí)、多路復用、非阻塞

TCP/IP編程基礎——超時(shí)、多路復用、非阻塞

在TCP連接中,recv等函數默認為阻塞模式(block),即直到有數據到來(lái)之前函數不會(huì )返回,而我們有時(shí)則需要一種超時(shí)機制使其在一定時(shí)間后返回而不管是否有數據到來(lái),這里我們就會(huì )用到setsockopt()函數:
    int  setsockopt(int  s, int level, int optname, void* optval, socklen_t* optlen);
    這里我們要涉及到一個(gè)結構:
    struct timeval
    {
            time_t tv_sec;
            time_t tv_usec;
    };
    這里第一個(gè)域的單位為秒,第二個(gè)域的單位為微秒。
    struct timeval tv_out;
    tv_out.tv_sec = 1;
    tv_out.tv_usec = 0;
    填充這個(gè)結構后,我們就可以以如下的方式調用這個(gè)函數:
    setsockopt(fd, SOL_SOCKET, SO_RCVTIMEO, &tv_out, sizeof(tv_out));(具體參數可以man一下,或查看MSDN)
    這樣我們就設定了recv()函數的超時(shí)機制,當超過(guò)tv_out設定的時(shí)間而沒(méi)有數據到來(lái)時(shí)recv()就會(huì )返回0值。

    第二個(gè)我們要介紹的是多路復用機制,也就是同時(shí)監聽(tīng)多個(gè)套接字連接。
    int select(int n, fd_set* readfds, fd_set* writefds, fd_set* exceptfds, struct timeval* timeout);
    這里涉及到了fd_set結構:
    typedef struct fd_set
    {
            u_int fd_count;
            int fd_array[FD_SETSIZE];
    }
    fd_count為fd_set結構中包含的套接字個(gè)數,fd_array唯一個(gè)int 數組,包含了我們要監聽(tīng)的套接字。
    首先我們需要使用FD_SET將我們要監聽(tīng)的套接字添加到fd_set結構中:
    fd_set readfd;
    FD_SET(fd, &readfd);
    然后我們這樣調用select函數:
    select(max_fd + 1, &readfd, NULL, NULL, NULL);(具體參數可以man一下,或查看MSDN)
    FD_ISSET(fd, &readfd);
    其中max_fd為我們要監聽(tīng)的套接字中值最大的一個(gè),同時(shí)在調用select是要將其加1,readfd即為我們監聽(tīng)的要進(jìn)行讀操作的套接字連接,第三個(gè)參數是我們監聽(tīng)的要進(jìn)行寫(xiě)操作的套接字連接,第四個(gè)參數用于異常,而最后一個(gè)參數可以用來(lái)設定超時(shí),這里同樣使用了struct timeval結構,可以實(shí)現與前面介紹的同樣的效果。這里如果連接進(jìn)來(lái)的話(huà)select即返回一個(gè)大于零的值,然后我們調用FD_ISSET宏來(lái)檢測具體是那一個(gè)套接字有數據進(jìn)來(lái)(FD_ISSET返回非零值)。

    最后介紹的是另一種實(shí)現非阻塞的方法,這種方法在有些應用中會(huì )起到一定作用,尤其是在select()函數監聽(tīng)的套接字個(gè)數超過(guò)1024個(gè)時(shí)(因為fd_set結構在大部分UNIX系統中都對其可以監聽(tīng)的套接字個(gè)數作了1024的限制,如果要突破這個(gè)限制,必須修改頭文件并重新編譯內核),我們就不能使用select多路復用機制。
    拿recv()函數來(lái)說(shuō),我們可以這樣進(jìn)行調用:
    recv(fd, buf, sizeof(buf), MSG_DONTWAIT);
    注意到我們這里采用了MSG_DONTWAIT標志,它的作用是告訴recv()函數如果有數據到來(lái)的話(huà)就接受全部數據并立刻返回,沒(méi)有數據的話(huà)也是立刻返回,而不進(jìn)行任何的等待。采用這個(gè)機制就可以在多于1024個(gè)套接字連接時(shí)使用for()循環(huán)對全部的連接進(jìn)行監聽(tīng)。
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
聊一聊 Python 的 socket,以及 select、poll、epoll 又是怎么一回事?
徹底理解 IO多路復用
面向連接的tcp/ip流程圖 - kenlistian - C++博客
快速學(xué)習C語(yǔ)言三: 開(kāi)發(fā)環(huán)境, VIM配置, TCP基礎,Linux開(kāi)發(fā)基礎,Socket開(kāi)發(fā)基礎
unix下網(wǎng)絡(luò )編程之I/O復用(三)
深入理解 Linux socket
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久