#include <sys/socket.h> int shutdown(int sockfd, int how); - sockfd: 須要關閉的socket的描述符 - how: 容許shutdown操做選擇如下幾種方式: - SHUT_RD(0): 關閉sockfd上的讀功能,該套接字再也不接收數據,任何在套接字接收緩衝區的數據都將被丟棄; - SHUT_WR(1): 關閉sockfd的寫功能,進程不能對此套接字發出寫操做; - SHUT_RDWR(2): 關閉讀寫功能,至關於調用shut down兩次,首先是SHUT_RD,而後是SHUT_WR. 1. 使用close(),若是多個進程共享一個套接字,close每調用一次,計數減1,直到計數爲0,也就是全部進程都調用了close,套接字被釋放。 2. 使用shutdown(),在多進程中若是一個進程調用了shutdown(sfd, SHUT_RDWR)後,其餘進程將沒法通訊。但若是一個進程close(sfd)將不會影響其餘進程。
// 設置套接字的屬性,包括端口複用 #include <sts/types.h> #include <sys/socket.h> int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen); - sockfd: 要操做的文件描述符 - level: 級別 - SOL_SOCKET(端口複用) - optname: 選項的名稱 - SO_REUSEADDR - SO_REUSEPORT - optval: 端口複用的值(整型) - 1: 能夠複用 - 0: 不能夠複用 - optlen: optval參數的大小,sizeof(optval)
#include <sys/times.h> #include <sys/types.h> #include <unistd.h> int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); // sizeof(fd_set) = 128 byte = 1024 bit - nfds: 委託內核檢測的最大文件描述符+1 - readfds: 要檢測的文件描述符的讀的集合,委託內核檢測哪些文件描述符的讀屬性, - 對應的是對方發送過來的數據, - 爲讀是被動接收數據,檢測的就是讀緩衝區 - 是一個傳入傳出參數 - writefds: 要檢測的文件描述符的寫的集合,委託內核檢測哪些文件描述符的寫屬性 - 委託內核檢測寫緩衝區是否還能夠寫數據 - exceptefds: 檢測發生異常的文件描述符的集合 - timeout: 設置的超時時間, NULL 永久阻塞,直到檢測到了文件描述符有變化;tv_sec = 0 tv_usec = 0 不阻塞;tv_sec > 0 tv_usec > 0 阻塞對應時間 - 返回值:失敗返回-1;成功返回>0(n)的數,表示檢測的集合中有n個文件描述符發生了變化 struct timeval { long tv_sec; long tv_usec; } void FD_CLR(int fd, fd_set *set); - 做用:將參數文件描述符fd對應的標誌位設置爲0 void FD_ISSET(int fd, fd_set *set); - 做用:判斷fd對應的標誌位是0仍是1, - 返回值:fd對應的標誌位的值 void FD_SET(int fd, fd_set *set); - 做用:將參數文件描述符fd對應的標誌位設置爲1 void FD_ZERO(fd_set *set); - 做用:fd_set一共有1024位,初始化全部位爲0
#include <poll.h> struct pollfd { int fd; // 委託內核檢測的文件描述符 short events; // 委託內核檢測文件描述符的什麼事件 POLLIN 讀 POLLOUT 寫 short revents; // 內核返回的文件描述符發生的事件 }; int poll(struct pollfd *fds, nfds_t nfds, int timeout); - fds: 須要檢測的文件描述符的集合 - nfds: 委託內核檢測的最大文件描述符+1 - timeout: 阻塞時長, NULL 永久阻塞,-1 阻塞,當檢測到須要檢測的文件描述符發生變化時解除阻塞;0 不阻塞;>0 阻塞時長 - 返回值:失敗返回-1;成功返回>0(n)的數,表示檢測的集合中有n個文件描述符發生了變化
#include <sys/epoll.h> int epoll_create(int size); - 做用:建立一個新的epoll實例。在內核中建立一個數據,包括須要檢測的文件描述符(RBT),和就緒列表存放檢測到數據發生改變的文件描述符信息(雙鏈表) - size: >0, 無心義;之前底層hashmap實現時須要 - 返回值:成功返回文件描述符,操做epoll實例;失敗返回-1並設置errno int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event); - epfd: epoll實例對應的文件描述符 - op: 要進行什麼操做,EPOLL_CTL_ADD 添加;EPOLL_CTL_MOD 修改;EPOLL_CTL_DEL 刪除 - fd: 要檢測的文件描述符 - event: 檢測文件描述符什麼事件,常見的epoll檢測事件:EPOLLIN、EPOLLOUT、EPOLLERR int epoll_wait(nt epfd, struct epoll_event *events, int maxevents, int timeout); - epfd: epoll實例對應的文件描述符 - events: 傳出參數,保存了發生了變化的文件描述符的信息 - maxevents: 第二參數結構體數組的大小 - timeout: 阻塞時長, NULL 永久阻塞,-1 阻塞,當檢測到須要檢測的文件描述符發生變化時解除阻塞;0 不阻塞;>0 阻塞時長 - 返回值:失敗返回-1;成功返回>0(n)的數,表示檢測的集合中有n個文件描述符發生了變化