select函数(一)
生活随笔
收集整理的這篇文章主要介紹了
select函数(一)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);
參數:
- nfds:監控的文件描述符集里最大文件描述符加1,因為此參數會告訴內核檢測前多少個文件文件描述符
- readfs:監控有讀數據到達文件描述符集合,傳入傳出參數
- writefds:監控寫數據到達文件描述符集合,傳入傳出參數
- exceptfds:監控異常發生到達文件描述符集合,如帶外數據到達異常,傳入傳出參數
- timeout:定時阻塞監控時間。
?
#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函數用法圖解
三、實驗一
#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 發生在重傳(一定次數)失敗后,強制關閉套接字//EINTR 進程被信號中斷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- 服務端server.c
- 客戶端:clent.c
- 公共頭文件集程序:wrap.h、wrap.c
輸出結果:
客戶端:
服務端:
總結
以上是生活随笔為你收集整理的select函数(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 光遇手游雨林彩虹下的蜡烛位置在哪
- 下一篇: Makefile用法链接