linux網路編程中阻塞和非阻塞socket的區別

來源:互聯網
上載者:User

linux網路編程中阻塞和非阻塞socket的區別 - slj_win的專欄 - 部落格頻道 - CSDN.NET

linux網路編程中阻塞和非阻塞socket的區別 分類: c 2012-01-12 14:59 358人閱讀 評論(0) 收藏 舉報socketlinux編程網路伺服器buffer

阻塞socket和非阻塞socket

讀操作
對於阻塞的socket,當socket的接收緩衝區中沒有資料時,read調用會一直阻塞住,直到有資料到來才返

回。當socket緩衝區中的資料量小於期望讀取的資料量時,返回實際讀取的位元組數。當sockt的接收緩衝

區中的資料大於期望讀取的位元組數時,讀取期望讀取的位元組數,返回實際讀取的長度。

對於非阻塞socket而言,socket的接收緩衝區中有沒有資料,read調用都會立刻返回。接收緩衝區中有
資料時,與阻塞socket有資料的情況是一樣的,如果接收緩衝區中沒有資料,則返回錯誤號碼為

EWOULDBLOCK,
表示該操作本來應該阻塞的,但是由於本socket為非阻塞的socket,因此立刻返回,遇到這樣的情況,可

以在下次接著去嘗試讀取。如果傳回值是其它負值,則表明讀取錯誤。
因此,非阻塞的rea調用一般這樣寫:

if ((nread = read(sock_fd, buffer, len)) < 0)
{
if (errno == EWOULDBLOCK)
{
return 0; //表示沒有讀到資料
}else return -1; //表示讀取失敗
}else return nread;讀到資料長度

寫操作

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

而對於阻塞Socket而言,如果發送緩衝區沒有空間或者空間不足的話,write操作會直接阻塞住,如果有

足夠空間,則拷貝所有資料到發送緩衝區,然後返回.
非阻塞的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 == EWOULDBLOCK)
{
nWrite = 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);

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.