select多路IO轉接

2021-09-23 13:31:16 字數 4225 閱讀 4285

void fd_zero(fd_set *set);	--- 清空乙個檔案描述符集合。

fd_set rset;

fd_zero(&rset);

void fd_set(int fd, fd_set *set); --- 將待監聽的檔案描述符,新增到監聽集合中

fd_set(3, &rset); fd_set(5, &rset); fd_set(6, &rset);

void fd_clr(int fd, fd_set *set); --- 將乙個檔案描述符從監聽集合中 移除。

fd_clr(4, &rset);

int fd_isset(int fd, fd_set *set); --- 判斷乙個檔案描述符是否在監聽集合中。

返回值: 在:1;不在:0;

fd_isset(4, &rset);

int select(int nfds, fd_set *readfds, fd_set *writefds,fd_set *exceptfds, struct timeval *timeout);

nfds:監聽的所有檔案描述符中,最大檔案描述符+1

readfds: 讀 檔案描述符監聽集合。 傳入、傳出引數

writefds:寫 檔案描述符監聽集合。 傳入、傳出引數 null

exceptfds:異常 檔案描述符監聽集合 傳入、傳出引數 null

timeout: > 0: 設定監聽超時時長。

null: 阻塞監聽

0: 非阻塞監聽,輪詢

返回值:

> 0: 所有監聽集合(3個)中, 滿足對應事件的總數。

0: 沒有滿足監聽條件的檔案描述符

-1: errno

int maxfd = 0;

lfd = socket() ; 建立套接字

maxfd = lfd;

bind(); 繫結位址結構

listen(); 設定監聽上限

fd_set rset, allset; 建立r監聽集合

fd_zero(&allset); 將r監聽集合清空

fd_set(lfd, &allset); 將 lfd 新增至讀集合中。

while(1)

for (i = lfd+1; i <= 最大檔案描述符; i++)

}}

缺點: 監聽上限受檔案描述符限制。 最大 1024.

檢測滿足條件的fd, 自己新增業務邏輯提高效率。 提高了編碼難度。

優點: 跨平台。win、linux、macos、unix、類unix、mips

server.c

#include #include #include #include #include #include #include "wrap.h"

#define serv_port 8965

int main(int argc, char *ar**)

if (fd_isset(listenfd, &rset))

for (i = listenfd+1; i <= maxfd; i++) else if (n == -1)

for (j = 0; j < n; j++)

buf[j] = toupper(buf[j]);

write(i, buf, n);

write(stdout_fileno, buf, n);}}

}close(listenfd);

return 0;

}

client.c
/* client.c */

#include #include #include #include #include #include "wrap.h"

#define maxline 80

#define serv_port 8965

int main(int argc, char *ar**)

else

write(stdout_fileno, buf, n);

}close(sockfd);

return 0;

}

wrap.h
#ifndef __wrap_h_

#define __wrap_h_

void perr_exit(const char *s);

int accept(int fd, struct sockaddr *sa, socklen_t *salenptr);

int bind(int fd, const struct sockaddr *sa, socklen_t salen);

int connect(int fd, const struct sockaddr *sa, socklen_t salen);

int listen(int fd, int backlog);

int socket(int family, int type, int protocol);

ssize_t read(int fd, void *ptr, size_t nbytes);

ssize_t write(int fd, const void *ptr, size_t nbytes);

int close(int fd);

ssize_t readn(int fd, void *vptr, size_t n);

ssize_t writen(int fd, const void *vptr, size_t n);

ssize_t my_read(int fd, char *ptr);

ssize_t readline(int fd, void *vptr, size_t maxlen);

#endif

wrap.c
#include #include #include #include #include void perr_exit(const char *s)

int accept(int fd, struct sockaddr *sa, socklen_t *salenptr)

return n;

}int bind(int fd, const struct sockaddr *sa, socklen_t salen)

int connect(int fd, const struct sockaddr *sa, socklen_t salen)

int listen(int fd, int backlog)

int socket(int family, int type, int protocol)

ssize_t read(int fd, void *ptr, size_t nbytes)

return n;

}ssize_t write(int fd, const void *ptr, size_t nbytes)

return n;

}int close(int fd)

/*參三: 應該讀取的位元組數*/

I O多路轉接(select

一.基本概念 二.函式原型 includeint select int nfds,fd set readfds,fd set writefds,fd set exceptions,struct timeval timeout fd set 介面 void fd clr int fd,fd set s...

IO 多路轉接 select

select多路io轉接 原理 借助核心,select來監聽,客戶端連線 資料通訊事件 void fd clr int fd,fd set set 將乙個檔案描述符從監聽集合中 移除 fd clr 4,rset int fd isset int fd,fd set set 判斷乙個檔案描述符是否在監...

I O多路轉接之select

什麼是i o多路轉接技術 先構建一張有關描述符的列表,然後呼叫乙個函式,直到這些描述符中的乙個已準備好進行i o時,該函式才返回,在返回時,他告訴程序哪些描述符已準備好可以進行i o。上述呼叫的函式,有select,poll,pselect及poll的增強版epoll等,本文主要介紹select。函...