讀操作
對於阻塞的socket,當socket的接收緩衝區中沒有資料時,read呼叫會一直阻塞住,直到有資料到來才返
回。當socket緩衝區中的資料量小於期望讀取的資料量時,返回實際讀取的位元組數。當sockt的接收緩衝
區中的資料大於期望讀取的位元組數時,讀取期望讀取的位元組數,返回實際讀取的長度。
對於非阻塞socket而言,socket的接收緩衝區中有沒有資料,read呼叫都會立刻返回。接收緩衝區中有
資料時,與阻塞socket有資料的情況是一樣的,如果接收緩衝區中沒有資料,則返回錯誤號為
ewouldblock,
表示該操作本來應該阻塞的,但是由於本socket為非阻塞的socket,因此立刻返回,遇到這樣的情況,可
以在下次接著去嘗試讀取。如果返回值是其它負值,則表明讀取錯誤。
因此,非阻塞的rea呼叫一般這樣寫:
if ((nread = read(sock_fd, buffer, len)) < 0)
else return -1; //表示讀取失敗
}else return nread;讀到資料長度
寫操作
對於寫操作write,原理是類似的,非阻塞socket在傳送緩衝區沒有空間時會直接返回錯誤號ewouldblock,
表示沒有空間可寫資料,如果錯誤號是別的值,則表明傳送失敗。如果傳送緩衝區中有足夠空間或者
是不足以拷貝所有待傳送資料的空間的話,則拷貝前面n個能夠容納的資料,返回實際拷貝的位元組數。
而對於阻塞socket而言,如果傳送緩衝區沒有空間或者空間不足的話,write操作會直接阻塞住,如果有
足夠空間,則拷貝所有資料到傳送緩衝區,然後返回.
非阻塞的write操作一般寫法是:
int write_pos = 0;
int nleft = nlen;
while (nleft > 0)
else return -1; //表示寫失敗
}nleft -= nwrite;
write_pos += nwrite;
}return nlen;
建立連線
阻塞方式下,connect首先傳送syn請求道伺服器,當客戶端收到伺服器返回的syn的確認時,則
connect
返回.否則的話一直阻塞.
非阻塞方式,connect將啟用tcp協議的三次握手,但是connect函式並不等待連線建立好才返回,而是
立即返回。返回的錯誤碼為einprogress,表示正在進行某種過程.
接收連線
對於阻塞方式的傾聽socket,accept在連線佇列中沒有建立好的連線時將阻塞,直到有可用的連線,才返
回。非阻塞傾聽socket,在有沒有連線時都立即返回,沒有連線時,返回的錯誤碼為ewouldblock,表示本來應
該阻塞。
無阻塞的設定方法
方法一: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);
windows select
超時設定
socket程式設計 阻塞和非阻塞
阻塞方式下,connect首先傳送syn請求道伺服器,當客戶端收到伺服器返回的syn的確認時,則connect返回.否則的話一直阻塞.非阻塞方式,connect將啟用tcp協議的三次握手,但是connect函式並不等待連線建立好才返回,而是立即返回。返回的錯誤碼為einprogress,表示正在進行...
socket阻塞與非阻塞
何為阻塞?在以上過程中若連線還沒到來,那麼接受阻塞,程式執行到這裡不得不掛起,cpu轉而執行其他執行緒。在以上過程中若資料還沒準備好,請閱讀會一樣也會阻塞。阻塞式網路io的特點 多執行緒處理多個連線。每個執行緒擁有自己的棧空間並且占用一些cpu時間。每個執行緒遇到外部為準備好的時候,都會阻塞掉。阻塞...
Socket 阻塞模式和非阻塞模式
阻塞i o模型 簡介 程序會 一直阻塞 直到資料拷貝 完成 應用程式呼叫乙個io函式,導致應用程式阻塞,等待資料準備好。如果資料沒有準備好,一直等待 資料準備好了,從核心拷貝到使用者空間,io函式返回成功指示。阻塞i o模型圖 在呼叫recv recvfrom 函式時,發生在核心中等待資料和複製資料...