linux网络编程--阻塞与非阻塞
linux網絡編程--阻塞與非阻塞
- 建立連接
- 接受連接
- 無阻塞的設置方式
- read() write()
- 讀操作
- 寫操作
- Linux fcntl函數詳解
- 功能描述
- 函數原型
- fcntl()函數五種功能
- F_DUPFD
- F_GETFD
- F_SETFD
- F_GETFL
- F_SETFL
- F_GETOWN
- F_SETOWN
- F_GETFL和F_SETFL的標志
- 與上面相同,如果一個fd本身就是sockfd的時候,可以直接這是socket標志
建立連接
種過程.
接受連接
無阻塞的設置方式
方法一:fcntl //文件控制函數
int flag; if (flag = fcntl(fd, F_GETFL, 0) <0)perror("get flag"); flag |= O_NONBLOCK; if (fcntl(fd, F_SETFL, flag) < 0)perror("set flag");方法二:ioctl //設備控制接口函數
int b_on = 1; ioctl (fd, FIONBIO, &b_on);read() write()
一篇文章完全搞清楚 scoket read/write 返回碼、阻塞與非阻塞、異常處理 等讓你頭疼已久的問題
讀操作
非阻塞read調用方式:
if ((nread = read(sock_fd, buffer, len)) < 0) {if (errno == EAGAIN) // EWOULDBLOCK{return 0; //表示沒有讀到數據}else return -1; //表示讀取失敗 } else return nread;讀到數據長度寫操作
非阻塞的write操作一般寫法是:
int write_pos = 0; int nLeft = nLen;while (nLeft > 0) {int nWrite = 0;if ((nWrite = write(sock_fd, data + write_pos, nLeft)) <= 0){if (errno == EAGAIN){nWrite = 0;}else return -1; //表示寫失敗}nLeft -= nWrite;write_pos += nWrite; } return nLen;Linux fcntl函數詳解
功能描述
根據【文件描述詞】來操作文件的特性。
fcntl()針對(文件)描述符提供控制.參數fd是被參數cmd操作(如下面的描述)的描述符. 針對cmd的值,fcntl能夠接受第三個參數(arg)
函數原型
#include <unistd.h> #include <fcntl.h>int fcntl(int fd, int cmd); int fcntl(int fd, int cmd, long arg); int fcntl(int fd, int cmd, struct flock *lock);fcntl()函數五種功能
F_DUPFD
返回一個如下描述的(文件)描述符:
F_GETFD
取得與文件描述符fd聯合close-on-exec標志,類似FD_CLOEXEC.如果返回值和FD_CLOEXEC進行與運算結果是0的話,文件保持交叉式訪問exec(),否則如果通過exec運行的話,文件將被關閉(arg被忽略)
F_SETFD
設置close-on-exec旗標。該旗標以參數arg的FD_CLOEXEC位決定。
F_GETFL
取得fd的文件狀態標志,如同下面的描述一樣(arg被忽略)
F_SETFL
設置給arg描述符狀態標志,可以更改的幾個標志是:O_APPEND, O_NONBLOCK,O_SYNC和O_ASYNC。
F_GETOWN
取得當前正在接收SIGIO或者SIGURG信號的進程id或進程組id,進程組id返回成負值(arg被忽略)
F_SETOWN
設置將接收SIGIO和SIGURG信號的進程id或進程組id,進程組id通過提供負值的arg來說明,否則,arg將被認為是進程id (《UNPV》P510)
fcntl(connfd, F_SETOWN, getpid()); // 為某個socket套接字connfd和當前線程建立屬主關系,主要是為了信號SIGIO and SIGURGF_GETFL和F_SETFL的標志
與上面相同,如果一個fd本身就是sockfd的時候,可以直接這是socket標志
注意:在修改文件描述符標志或文件狀態標志時必須謹慎,先要取得現在的標志值,然后按照希望修改它,最后設置新標志值。不能只是執行F_SETFD或F_SETFL命令,這樣會關閉以前設置的標志位。
總結
以上是生活随笔為你收集整理的linux网络编程--阻塞与非阻塞的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mlx rdma网卡指标参数简介
- 下一篇: linux性能优化--cpu篇