網路程式設計學習 io模型之io多路復用

2021-08-10 14:20:02 字數 1463 閱讀 7393

簡而言之,就是將準備要用的檔案描述符新增到一張表裡,然後讓select等待表裡的任一描述符準備就緒(就是可以執行了),然後執行那個已經準備就緒的檔案描述符,然後把其他的沒有準備好的檔案描述符全都刪除;

援引知乎上的乙個解釋:

int select(int maxfdpl, fd_set *readset, fd_set *writeset, fd_set exceptset, const struct timeval *timeout);

功能:允許乙個程序去操作多個檔案描述符,阻塞等待乙個或多個檔案描述符就緒,當有乙個或者多個檔案描述符準備就緒,則函式立即返回;

引數:

maxfdpl:指定待測試的描述符個數,它的值是描述符集合中最大值加1(因為描述符是從0開始的,例如:集合裡有,此時描述符的個數為5(即最大值4加1));

readset:讀檔案描述符集合;

writeset:寫檔案描述法集合;

exceptset:異常條件的描述符集合;

timeout:它告知核心等待所指定的描述符中的任何乙個多長時間,即用作超時檢測;

返回值:

成功:

如果timeout == null,則返回準備就緒的檔案描述的個數;

如果timeout != null,超時後返回0;

失敗:

返回-1;

伺服器端

#include "select.h"

int main(int argc, const

char *argv)

servaddr.sin_family = af_inet;

servaddr.sin_port = htons(atoi(argv[2]));

if(inet_pton(af_inet, argv[1], &servaddr.sin_addr) <= 0)

if(bind(listenfd, (struct sockaddr *)&servaddr, addrlen) < 0)

if(listen(listenfd, listenq) < 0)

int maxfd;

fd_set readfds, middlefds;

//清空集合

fd_zero(&readfds);

maxfd = listenfd;

while(1)

//檢測readfds集合中0號檔案描述符準備好了沒有,準備好了的話則返回1;

if(fd_isset(0, &readfds))

if(fd_isset(listenfd, &readfds))

printf("%s--%d is coming\n", inet_ntoa(cliaddr.sin_addr), ntohs(cliaddr.sin_port));}}

close(listenfd);

close(connfd);

return

0;}

併發程式設計 網路IO模型 IO多路復用

網路io模型 一 網路io 輸入 recv recvfrom accept 阻塞io 輸出 send sendto sendall connect 會等待一段時間,但是卻是非阻塞io,因為是乙個主動的過程 二 網路io模型 跟socket有關 blocking io 阻塞io 平時用的 tcp ud...

Linux網路程式設計 IO模型,IO多路復用思想

io多路復用 參考書籍 後台開發 核心技術與應用實踐 linux高效能伺服器程式設計 apue 之前嘮到了socket,嘮到了怎麼建立連線。這篇文章就嘮一下,怎麼向socket中寫資料,怎麼從socket中讀出資料以及高效的讀寫 多路io復用技術 門口坐著瞅 阻塞 一直到 來了老弟 辦事 呼叫者呼叫...

IO模型 IO多路復用

用socket 一定會用到accept recv recvfrom這些方法 正常情況下 accept recv recvfrom都是阻塞的 如果setblocking false 整個程式就變成乙個非阻塞的程式了非阻塞的特點 沒有併發程式設計的機制 是乙個同步的程式 程式不會在某乙個連線的recv或...