socket通訊之read阻塞

2021-06-14 11:16:29 字數 1538 閱讀 2814

怎麼樣以非阻塞的方式從管道中讀取資料?因為我用read函式時,如果管道沒有資料就會阻塞住??? 

我的**是: 

char chbuff[32]; 

read(file_pipe[0], chbuff, 16); 

如果管道沒有資料我這個函式就永遠不返回,請問有沒有其它的方式,如果管道有資料就讀取,沒資料也立即返回??  

或者在open的時候,傳入o_nonblock引數,按非阻塞方式開啟 / fcntl(fd, f_setfl, o_nonblock)

在mode設定o_nonblock標誌

每乙個tcp套介面有乙個傳送緩衝區,可以用so_sndbuf套介面選項來改變這個緩衝區的大小。當應用程序呼叫 write時,核心從應用程序的緩衝區中拷貝所有資料到套介面的傳送緩衝區。如果套介面的傳送緩衝區容不下應用程式的所有資料(或是應用程序的緩衝區大於 套介面傳送緩衝區,或是套介面傳送緩衝區還有其他資料),應用程序將被掛起(睡眠)。這裡假設套介面是阻塞的,這是通常的預設設定。核心將不從write 系統呼叫返回,直到應用程序緩衝區中的所有資料都拷貝到套介面傳送緩衝區。因此從寫乙個tcp套介面的write呼叫成功返回僅僅表示我們可以重新使用應 用程序的緩衝區。它並不告訴我們對端的 tcp或應用程序已經接收了資料。 

tcp取套介面傳送緩衝區的資料並把它傳送給對端tcp,其過程基於tcp資料傳輸的所有規則。對端tcp必須確認收到的資料,只有收到對端的ack,本端tcp才能刪除套介面傳送緩衝區中已經確認的資料。tcp必須保留資料拷貝直到對端確認為止。

1 輸入操作: read、readv、recv、recvfrom、recvmsg

如果某個程序對乙個阻塞的tcp套介面呼叫這些輸入函式之一,而且該套介面的接收緩衝區中沒有資料可讀,該程序將被投入睡眠,直到到達一些資料。既然 tcp是位元組流協議,該程序的喚醒就是只要到達一些資料:這些資料既可能是單個位元組,也可以是乙個完整的tcp分節中的資料。如果想等到某個固定數目的數 據可讀為止,可以呼叫readn函式,或者指定msg_waitall標誌。

既然udp是資料報協議,如果乙個阻塞的udp套介面的接收緩衝區為空,對它呼叫輸入函式的程序將被投入睡眠,直到到達乙個udp資料報。

對於非阻塞的套介面,如果輸入操作不能被滿足(對於tcp套介面即至少有乙個位元組的資料可讀,對於udp套介面即有乙個完整的資料報可讀),相應呼叫將立即返回乙個ewouldblock錯誤。

2 輸出操作:write、writev、send、sendto、sendmsg

對於乙個tcp套介面,核心將從應用程序的緩衝區到該套介面的傳送緩衝區拷貝資料。對於阻塞的套介面,如果其傳送緩衝區中沒有空間,程序將被投入睡眠,直到有空間為止。

對於乙個非阻塞的tcp套介面,如果其傳送緩衝區中根本沒有空間,輸出函式呼叫將立即返回乙個ewouldblock錯誤。如果其傳送緩衝區中有一些空間,返回值將是核心能夠拷貝到該緩衝區中的位元組數。這個位元組數也稱為不足計數(short count)

udp套介面不才能在真正的傳送緩衝區。核心只是拷貝應用程序資料並把它沿協議棧向下傳送,漸次冠以udp頭部和ip頭部。因此對乙個阻塞的udp套介面,輸出函式呼叫將不會因為與tcp套介面一樣的原因而阻塞,不過有可能會因其他的原因而阻塞

socket非阻塞通訊

fd 非阻塞需要多執行緒程式設計 服務端方式1 使用threading庫實現多執行緒 基本方法和單程序基本寫法一致,將收發部分封裝為函式以便開啟其他執行緒 import socket import time import threading defhandle socket conn,addr wh...

Java 非阻塞 socket 通訊

前幾天我們公司c語言組的人需要乙個基於socket的報文接收器來方便他們測試專案,我花了小半天給他們做了個多執行緒的socket服務端,我寫好後在本機上測試後交給了他們,但是他們那邊能連上伺服器端,但是傳送訊息時沒響應,後來我看到他們用的都是tcp ip測試工具 乙個c s結構的socket除錯工具...

NIO實現非阻塞式Socket通訊

filechannel 由上圖可知道,該channel 只有阻塞模式。datagramchannel socketchannel serversocketchannel 三個網路channel 可以通過configureblocking 方法,設定非阻塞模式 nio 只有在 網路中,使用select...