select函数(一)
生活随笔
收集整理的這篇文章主要介紹了
select函数(一)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);
參數(shù):
- nfds:監(jiān)控的文件描述符集里最大文件描述符加1,因?yàn)榇藚?shù)會(huì)告訴內(nèi)核檢測前多少個(gè)文件文件描述符
- readfs:監(jiān)控有讀數(shù)據(jù)到達(dá)文件描述符集合,傳入傳出參數(shù)
- writefds:監(jiān)控寫數(shù)據(jù)到達(dá)文件描述符集合,傳入傳出參數(shù)
- exceptfds:監(jiān)控異常發(fā)生到達(dá)文件描述符集合,如帶外數(shù)據(jù)到達(dá)異常,傳入傳出參數(shù)
- timeout:定時(shí)阻塞監(jiān)控時(shí)間。
?
#include <sys/select.h> void FD_CLR(int fd, fd_set *set); // 把文件描述符集里fd位清0 int FD_ISSET(int fd, fd_set *set); // 測試文件描述符集里fd是否置1 void FD_SET(int fd, fd_set *set); // 把文件描述符集合里fd位置1 void FD_ZERO(fd_set *set); // 把文件描述符集合里所有位清0二、select函數(shù)用法圖解
三、實(shí)驗(yàn)一
#include <stdlib.h> #include <stdio.h> #include <unistd.h> #include <errno.h> #include <sys/socket.h>void perr_exit(const char *s) {perror(s);exit(-1); }int Accept(int fd, struct sockaddr *sa, socklen_t *salenptr) {int n;again:if ((n = accept(fd, sa, salenptr)) < 0) {//ECONNABORTED 發(fā)生在重傳(一定次數(shù))失敗后,強(qiáng)制關(guān)閉套接字//EINTR 進(jìn)程被信號(hào)中斷if ((errno == ECONNABORTED) || (errno == EINTR)){goto again; }else{perr_exit("accept error");}}return n; }int Bind(int fd, const struct sockaddr *sa, socklen_t salen) {int n;if ((n = bind(fd, sa, salen)) < 0){perr_exit("bind error");}return n; }int Connect(int fd, const struct sockaddr *sa, socklen_t salen) {int n;n = connect(fd, sa, salen);if (n < 0) {perr_exit("connect error");}return n; }int Listen(int fd, int backlog) {int n;if ((n = listen(fd, backlog)) < 0){perr_exit("listen error");}return n; }int Socket(int family, int type, int protocol) {int n;if ((n = socket(family, type, protocol)) < 0){perr_exit("socket error");}return n; }ssize_t Read(int fd, void *ptr, size_t nbytes) {ssize_t n;again:if ( (n = read(fd, ptr, nbytes)) == -1) {if (errno == EINTR)goto again;elsereturn -1;}return n; }ssize_t Write(int fd, const void *ptr, size_t nbytes) {ssize_t n;again:if ((n = write(fd, ptr, nbytes)) == -1) {if (errno == EINTR)goto again;elsereturn -1;}return n; }int Close(int fd) {int n;if ((n = close(fd)) == -1)perr_exit("close error");return n; }?
#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- 服務(wù)端server.c
- 客戶端:clent.c
- 公共頭文件集程序:wrap.h、wrap.c
輸出結(jié)果:
客戶端:
服務(wù)端:
總結(jié)
以上是生活随笔為你收集整理的select函数(一)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 光遇手游雨林彩虹下的蜡烛位置在哪
- 下一篇: 成都欢乐谷交了门票.里面玩还要钱吗