socket程式設計 阻塞和非阻塞

2022-05-04 03:18:09 字數 2137 閱讀 9133

**:

阻塞方式下,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);

對於阻塞的socket,當socket的接收緩衝區中沒有資料時,read呼叫會一直阻塞住,直到有資料到來才返回。當socket緩衝區中的資料量小於期望讀取的資料量時,返回實際讀取的位元組數。當sockt的接收緩衝區中的資料大於期望讀取的位元組數時,讀取期望讀取的位元組數,返回實際讀取的長度。

對於非阻塞socket而言,socket的接收緩衝區中有沒有資料,read呼叫都會立刻返回。接收緩衝區中有資料時,與阻塞socket有資料的情況是一樣的,如果接收緩衝區中沒有資料,則返回錯誤號為ewouldblock,表示該操作本來應該阻塞的,但是由於本socket為非阻塞的socket,因此立刻返回,遇到這樣的情況,可以在下次接著去嘗試讀取。如果返回值是其它負值,則表明讀取錯誤。

因此,非阻塞的read呼叫一般這樣寫:

if ((nread = read(sock_fd, buffer, len)) < 0)

else return -1; //表示讀取失敗

}else return nread;讀到資料長度

而對於阻塞socket而言,如果傳送緩衝區沒有空間或者空間不足的話,write操作會直接阻塞住,如果有足夠空間,則拷貝所有資料到傳送緩衝區,然後返回.

對於寫操作write,原理是類似的,非阻塞socket在傳送緩衝區沒有空間時會直接返回錯誤號ewouldblock,表示沒有空間可寫資料,如果錯誤號是別的值,則表明傳送失敗。如果傳送緩衝區中有足夠空間或者是不足以拷貝所有待傳送資料的空間的話,則拷貝前面n個能夠容納的資料,返回實際拷貝的位元組數。

非阻塞的write操作一般寫法是:

int write_pos = 0;

int nleft = nlen;

while (nleft > 0)

else return -1; //表示寫失敗

} nleft -= nwrite;

write_pos += nwrite;

}return nlen;

error in progress 

error would block

功能描述:根據【檔案描述詞】來操作檔案的特性。

標頭檔案:

#include

#include

函式原型:          

int fcntl(int fd, int cmd);

int fcntl(int fd, int cmd, long arg);         

int fcntl(int fd, int cmd, struct flock *lock);

描述:fcntl()針對(檔案)描述符提供控制.引數fd是被引數cmd操作(如下面的描述)的描述符. 針對cmd的值,fcntl能夠接受第三個引數(arg)

fcntl的返回值:  與命令有關。如果出錯,所有命令都返回-1,如果成功則返回某個其他值。

下列三個命令有特定返回值:f_dupfd,f_getfd,f_getfl以及f_getown。第乙個返回新的檔案描述符,第二個返回相應標誌,最後乙個返回乙個正的程序id或負的程序組id。

轉阻塞socket和非阻塞socket

讀操作 對於阻塞的socket,當socket的接收緩衝區中沒有資料時,read呼叫會一直阻塞住,直到有資料到來才返 回。當socket緩衝區中的資料量小於期望讀取的資料量時,返回實際讀取的位元組數。當sockt的接收緩衝 區中的資料大於期望讀取的位元組數時,讀取期望讀取的位元組數,返回實際讀取的長...

非阻塞socket程式設計

socket程式設計中可能出現阻塞的呼叫有4個 1.write send sendto sendmsg sendv等,如果某個程序呼叫乙個阻塞的tcp套接字 預設設定 如果傳送緩衝區沒有空間,呼叫程序將會睡眠,直到有空間為止。如果tcp套接字是非阻塞的,且沒有空間可寫,則會返回乙個ewouleblo...

非阻塞socket程式設計

阻塞 阻塞呼叫是指呼叫結果返回之前,當前執行緒會被掛起。該程序被標記為睡眠狀態並被排程出去。函式只有在得到結果之後才會返回。當socket工作在阻塞模式的時候,如果沒有資料的情況下呼叫該函式,則當前執行緒就會被掛起,直到有資料為止。非阻塞 非阻塞和阻塞的概念相對應,指在不能立刻得到結果之前,該函式不...