国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 操作系統 > 正文

select使用實例——str_cli函數(修訂版)

2024-06-28 13:27:28
字體:
來源:轉載
供稿:網友
select使用實例——str_cli函數(修訂版)

我們可以使用select函數重寫http://www.CUOXin.com/nufangrensheng/p/3587962.html中的str_cli函數,這樣服務器進程一終止,客戶就能馬上得到通知。早先那個版本的問題在于:當套接口上發生某些事件時,客戶可能阻塞于fgets調用。新版本改為阻塞于select調用,等待要么標準輸入可讀,要么套接口可讀。下圖展示了調用select所處理的各種條件。

image

客戶的套接口上的三個條件處理如下:

燈泡(i)如果對端TCP發送數據,那么該套接口變為可讀,并且read返回一個大于0的值(即讀入數據的字節數)。

燈泡(ii)如果對端TCP發送一個FIN(對端進程終止),那么該頭接口變為可讀,并且read返回0(EOF)。

燈泡(iii)如果對端TCP發送一個RST(對端主機崩潰并重新啟動),那么該套接口變為可讀,并且read返回-1,而errno中含有確切的錯誤代碼。

新版本源代碼:

#include <stdio.h>#include <sys/select.h>#include <sys/time.h>#include <errno.h>#include <stdlib.h>#include <string.h>int max(int a, int b){    return(a >= b ? a : b);}voidstr_cli(FILE *fp, int sockfd){    int       maxfdpl;    fd_set    rset;    char      sendline[4096], recvline[4096];    FD_ZERO(&rset);    for(;;)    {        FD_SET(fileno(fp), &rset);        FD_SET(sockfd, &rset);        maxfdpl = max(fileno(fp), sockfd) + 1;        if(select(maxfdpl, &rset, NULL, NULL, NULL) < 0)        {            perror("select");            exit(1);        }                if(FD_ISSET(sockfd, &rset))    /* socket is readable */        {            if(readline(sockfd, recvline, 4096) == 0)            {                PRintf("str_cli: server terminated prematurely/n");                exit(1);            }            fputs(recvline, stdout);        }        if(FD_ISSET(fileno(fp), &rset)) /* input is readable */        {            if(fgets(sendline, 4096, fp) == NULL)                return;            writen(sockfd, sendline, strlen(sendline));        }    }}

調用select

我們只需要一個用于檢查可讀性的描述字集。該集合由FD_ZERO初始化,并用FD_SET打開兩位:一位對應于標準I/O文件指針fp,一位對應于套接口sockfd。fileno函數把標準I/O文件指針轉換為對應的描述字。select和poll只工作在描述字上。

計算出兩個描述字中的較大值后,調用select。在該調用中,寫集合指針和異常集合指針都是空指針。最后一個參數(時間限制)也是空指針,因為我們希望本調用阻塞到某個描述字就緒為止。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 绥滨县| 邳州市| 三门峡市| 新巴尔虎右旗| 永丰县| 定边县| 雷山县| 牟定县| 衡南县| 鱼台县| 临澧县| 乡宁县| 黔西县| 郎溪县| 麻城市| 柳林县| 隆昌县| 祥云县| 岳普湖县| 监利县| 科尔| 大田县| 永寿县| 建瓯市| 文山县| 苏尼特右旗| 综艺| 富宁县| 九龙县| 泸定县| 恭城| 枣强县| 米脂县| 贵溪市| 新兴县| 万载县| 晋州市| 延吉市| 吴旗县| 东至县| 都安|