UDP socket 設定為的非阻塞模式

2021-09-07 07:22:32 字數 1553 閱讀 2182

udp socket 設定為的非阻塞模式 

len = recvfrom(socketfd, szrecvbuf, sizeof(szrecvbuf), msg_dontwait, (struct sockaddr *)&sockaddr,&scokaddrlen);

udp socket 設定為的阻塞模式 

len = recvfrom(socketfd, szrecvbuf, sizeof(szrecvbuf), 0, (struct sockaddr *)&sockaddr,&scokaddrlen);

linux socket程式設計之阻塞套接字和非阻塞套接字

每乙個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套介面一樣的原因而阻塞,不過有可能會因其他的原因而阻塞。

設定非主鍵為unique

很多時候需要將某一欄位 非主鍵 設定為unique,以下提供3種方法 1.設定為主鍵 drop table product create table product id allint unsigned not null primary key,modelid allint unsigned not...

oracle如何設定為非歸檔

在這裡所有的操作要在資料庫的那台機器上操作,用sys使用者進行登入,首先設定歸檔程序關閉。alter system set log archive start false scope spfile 然後關閉資料庫 shutdown immediate 再後面把資料庫啟動到mount的模式 start...

socket設定為非阻塞模式

於 1,套接字的預設狀態是阻塞的。即當發出乙個不能立即完成的套接字呼叫時,該程序將被投入睡眠,等待相應操作完成。2,阻塞的套接字分為下面四類 輸入操作 包括read recv recvfrom和recvmsg。輸出操作 包括write send sendto和sendmsg。接受外來連線,accep...