導航:首頁 > 操作系統 > linuxtcp緩沖區

linuxtcp緩沖區

發布時間:2022-06-29 18:50:51

① 如何防範linux操作系統下緩沖區溢出攻擊

Linux下的緩沖區溢出攻擊威脅既來自於軟體的編寫機制,也來自於Linux(和Unix)系統本身的特性。實際上,緩沖區溢出攻擊及各種計算機病毒猖獗的根本原因在於現代計算機系統都是採用馮?諾依曼「存儲程序」的工作原理。這一基本原理使得程序和數據都可以在內存中被繁殖、拷貝和執行。因此,要想有效地防範緩沖區溢出攻擊就應該從這兩個方面雙管其下。
確保代碼正確安全
緩沖區溢出攻擊的根源在於編寫程序的機制。因此,防範緩沖區溢出漏洞首先應該確保在Linux系統上運行的程序(包括系統軟體和應用軟體)代碼的正確性,避免程序中有不檢查變數、緩沖區大小及邊界等情況存在。比如,使用grep工具搜索源代碼中容易產生漏洞的庫調用,檢測變數的大小、數組的邊界、對指針變數進行保護,以及使用具有邊界、大小檢測功能的C編譯器等。
基於一定的安全策略設置系統
攻擊者攻擊某一個Linux系統,必須事先通過某些途徑對要攻擊的系統做必要的了解,如版本信息等,然後再利用系統的某些設置直接或間接地獲取控制權。因此,防範緩沖區溢出攻擊的第二個方面就是對系統設置實施有效的安全策略。這些策略種類很多,由於篇幅有限只列舉幾個典型措施:
(1)在裝有Telnet服務的情況下,通過手工改寫「/etc/inetd.conf」文件中的Telnet設置,使得遠程登錄的用戶無法看到系統的提示信息。具體方法是將Telnet設置改寫為:
telnet stream tcp nowait root /usr/sbin/tcpd/in.telnetd -h
末尾加上「-h」參數可以讓守護進程不顯示任何系統信息,只顯示登錄提示。
(2)改寫「rc.local」文件。默認情況下,當登錄Linux系統時系統運行rc.local文件,顯示該Linux發行版本的名字、版本號、內核版本和伺服器名稱等信息,這使得大量系統信息被泄露。將「rc.local」文件中顯示這些信息的代碼注釋掉,可以使系統不顯示這些信息。
一種方法是在顯示這些信息的代碼行前加「#」:
……# echo "">/etc/issue# echo "$R">>/etc/issue# echo "Kernel $ (uname -r)on $a $(uname -m)">>/etc/issue## echo >>/etc/issue……
另一種方法是將保存有系統信息的文件/etc/issue.NET和issue刪除。這兩個文件分別用於在遠程登錄和本地登錄時向用戶提供相關信息。刪除這兩個文件的同時,仍需要完成方法一中的注釋工作,否則,系統在啟動時將會自動重新生成這兩個文件。
(3)禁止提供finger服務。在Linux系統中,使用finger命令可以顯示本地或遠程系統中目前已登錄用戶的詳細信息。禁止提供finger服務的有效方法是,通過修改該文件屬性、許可權(改為600)使得只有root用戶才可以執行該命令。
(4)處理「inetd.conf」文件。Linux系統通過inetd(超級伺服器)程序根據網路請求裝入網路程序。該程序通過「/etc/inetd.conf」文件獲得inetd在監聽哪些網路埠,為每個埠啟動哪些特定服務等信息。因此,該文件同樣會泄露大量的敏感信息。解決問題的方法是,通過將其許可權改為600隻允許root用戶訪問,並通過改寫「/etc/inetd.conf」文件將不需要的服務程序禁止掉,最後修改該文件的屬性使其不能被修改。
總結
緩沖區溢出攻擊之所以能成為一種常見的攻擊手段,其原因在於緩沖區溢出漏洞太普遍,且易於實現攻擊,因此緩沖區溢出問題一直是個難題。
所幸的是,OpenBSD開發組為解決這一安全難題採用了三種新的有效策略。相信不久的將來,Linux用戶可以不再為緩沖區溢出攻擊而寢食難安了。
RAR文件在Linux下用起來
要在Linux下處理.rar文件,需要安裝RAR for Linux。該軟體可以從網上下載,但要記住,它不是免費的。大家可從http://www.onlinedown.net/sort/125_1.htm下載RAR for Linux 3.2.0,然後用下面的命令安裝:
# tar -xzpvf rarlinux-3.2.0.tar.gz
# cd rar
# make
安裝後就有了rar和unrar這兩個程序,rar是壓縮程序,unrar是解壓程序。它們的參數選項很多,這里只做簡單介紹,依舊舉例說明一下其用法:
# rar a all *.mp3
這條命令是將所有.mp3的文件壓縮成一個rar包,名為all.rar,該程序會將.rar 擴展名將自動附加到包名後。
# unrar e all.rar
這條命令是將all.rar中的所有文件解壓出來。

② Linux 下何時輸出緩沖區的問題

Linux下何時輸出緩沖區:當緩沖區滿或者程序中強制刷新緩沖區內容時。

③ linux緩沖區溢出攻擊與防禦

我是在防火牆上做了些設置 希望對你有幫助
-A OUTPUT -p tcp --sport 31337 -j DROP
-A OUTPUT -p tcp --dport 31337 -j DROP
-A FORWARD -f -m limit –limit 100/s –limit-burst 100 -j ACCEPT
-A FORWARD -p icmp -m limit –limit 1/s –limit-burst 10 -j ACCEPT
COMMIT

④ 怎麼檢測linux 內核 tcp發送緩沖區溢出

內核,是一個操作系統的核心。它負責管理系統的進程、內存、設備驅動程序、文件和網路系統,決定著系統的性能和穩定性。Linux作為一個自由軟體, 在廣大愛好者的支持下,內核版本不斷更新。新的內核修訂了舊內核的bug,並增加了許多新的特性。

⑤ 修改linux系統socket緩沖區大小

進行socket編程有時候可能需要修改下socket的接收緩沖區大小,這里可以使用 setsockopt 函數,但是如果需要修改的緩沖區很大(比如500MB),則還需要修改系統內核的TCP/IP參數,不然接收緩沖區大小會收到內核參數的限制,所以需要改兩個地方。下面以把socket接收緩沖區修改為500MB說明一下要作的修改。《Linux就該這么學》

在終端用sysctl命令修改socket最大緩沖區限制:

sudo sysctl -w net.core.rmem_max=5242880001

int recvbuff = 500*1024*1024;
if(setsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, (const char*)&recvbuff, sizeof(int)) == -1)
printf("setsocket error ");
else
printf("setsocket success ");12345

以上兩點,只改第1點,一個socket只會預留63個報文的接收緩沖;只改第2點,緩沖區大小會受到rmem_max的限制,如果需要的緩沖區很大的話,必須兩點都改。

⑥ 如何防範Linux操作系統下緩沖區溢出攻擊 黑客武林

雖然Linux病毒屈指可數,但是基於緩沖區溢出(BufferOverflow)漏洞的攻擊還是讓眾多Linux用戶大吃一驚。所謂「世界上第一個Linux病毒」??reman,嚴格地說並不是真正的病毒,它實質上是一個古老的、在Linux/Unix(也包括Windows等系統)世界中早已存在的「緩沖區溢出」攻擊程序。reman只是一個非常普通的、自動化了的緩沖區溢出程序,但即便如此,也已經在Linux界引起很大的恐慌。

緩沖區溢出漏洞是一個困擾了安全專家30多年的難題。簡單來說,它是由於編程機制而導致的、在軟體中出現的內存錯誤。這樣的內存錯誤使得黑客可以運行一段惡意代碼來破壞系統正常地運行,甚至獲得整個系統的控制權。

Linux系統特性

利用緩沖區溢出改寫相關內存的內容及函數的返回地址,從而改變代碼的執行流程,僅能在一定許可權范圍內有效。因為進程的運行與當前用戶的登錄許可權和身份有關,僅僅能夠製造緩沖區溢出是無法突破系統對當前用戶的許可權設置的。因此盡管可以利用緩沖區溢出使某一程序去執行其它被指定的代碼,但被執行的代碼只具有特定的許可權,還是無法完成超越許可權的任務。

但是,Linux(包括Unix)系統本身的一些特性卻可以被利用來沖破這種許可權的局限性,使得能夠利用緩沖區溢出獲得更高的、甚至是完全的許可權。主要體現在如下兩方面:

1.Linux(包括Unix)系統通過設置某可執行文件的屬性為SUID或SGID,允許其它用戶以該可執行文件擁有者的用戶ID或用戶組ID來執行它。如果該可執行文件的屬性是root,同時文件屬性被設置為SUID,則該可執行文件就存在可利用的緩沖區溢出漏洞,可以利用它以root的身份執行特定的、被另外安排的代碼。既然能夠使得一個具有root許可權的代碼得以執行,就能夠產生一個具有超級用戶root許可權的Shell,那麼掌握整個系統的控制權的危險就產生了。

2.Linux(包括Unix)中的許多守護進程都是以root許可權運行。如果這些程序存在可利用的緩沖區溢出,即可直接使它以root身份去執行另外安排的代碼,而無須修改該程序的SUID或SGID屬性。這樣獲得系統的控制權將更加容易。

隨著現代網路技術的發展和網路應用的深入,計算機網路所提供的遠程登錄機制、遠程調用及執行機制是必須的。這使得一個匿名的Internet用戶有機會利用緩沖區溢出漏洞來獲得某個系統的部分或全部控制權。實際上,以緩沖區溢出漏洞為攻擊手段的攻擊佔了遠程網路攻擊中的絕大多數,這給Linux系統帶來了極其嚴重的安全威脅。

途徑分析

通常情況下攻擊者會先攻擊root程序,然後利用緩沖區溢出時發生的內存錯誤來執行類似「exec(sh)」的代碼,從而獲得root的一個Shell。為了獲得root許可權的Shell,攻擊者需要完成如下的工作:

1.在程序的地址空間內安排適當的特定代碼。一般使用如下兩種方法在被攻擊的程序地址空間內安排攻擊代碼。

2.通過適當地初始化寄存器和存儲器,使程序在發生緩沖區溢出時不能回到原來的執行處,而是跳轉到被安排的地址空間執行。

當攻擊者找到一種途徑可以變原程序的執行代碼和流程時,攻擊的危險就產生了。

共2頁: 1 [2]

內容導航

第 1 頁:Linux系統特性

防範措施

Linux下的緩沖區溢出攻擊威脅既來自於軟體的編寫機制,也來自於Linux(和Unix)系統本身的特性。實際上,緩沖區溢出攻擊及各種計算機病毒猖獗的根本原因在於現代計算機系統都是採用馮?諾依曼「存儲程序」的工作原理。這一基本原理使得程序和數據都可以在內存中被繁殖、拷貝和執行。因此,要想有效地防範緩沖區溢出攻擊就應該從這兩個方面雙管其下。

確保代碼正確安全

緩沖區溢出攻擊的根源在於編寫程序的機制。因此,防範緩沖區溢出漏洞首先應該確保在Linux系統上運行的程序(包括系統軟體和應用軟體)代碼的正確性,避免程序中有不檢查變數、緩沖區大小及邊界等情況存在。比如,使用grep工具搜索源代碼中容易產生漏洞的庫調用,檢測變數的大小、數組的邊界、對指針變數進行保護,以及使用具有邊界、大小檢測功能的C編譯器等。

基於一定的安全策略設置系統

攻擊者攻擊某一個Linux系統,必須事先通過某些途徑對要攻擊的系統做必要的了解,如版本信息等,然後再利用系統的某些設置直接或間接地獲取控制權。因此,防範緩沖區溢出攻擊的第二個方面就是對系統設置實施有效的安全策略。這些策略種類很多,由於篇幅有限只列舉幾個典型措施:

(1)在裝有Telnet服務的情況下,通過手工改寫「/etc/inetd.conf」文件中的Telnet設置,使得遠程登錄的用戶無法看到系統的提示信息。具體方法是將Telnet設置改寫為:

telnet stream tcp nowait root /usr/sbin/tcpd/in.telnetd -h

末尾加上「-h」參數可以讓守護進程不顯示任何系統信息,只顯示登錄提示。

(2)改寫「rc.local」文件。默認情況下,當登錄Linux系統時系統運行rc.local文件,顯示該Linux發行版本的名字、版本號、內核版本和伺服器名稱等信息,這使得大量系統信息被泄露。將「rc.local」文件中顯示這些信息的代碼注釋掉,可以使系統不顯示這些信息。

一種方法是在顯示這-些信息的代碼行前加「#」:

……# echo 「」>/etc/issue# echo 「$R」>>/etc/issue#echo」Kernel $ (uname -r)on $a $(uname -m)」>>/etc/issue##echo>>/etc/issue……

另一種方法是將保存有系統信息的文件/etc/issue.net和issue刪除。這兩個文件分別用於在遠程登錄和本地登錄時向用戶提供相關信息。刪除這兩個文件的同時,仍需要完成方法一中的注釋工作,否則,系統在啟動時將會自動重新生成這兩個文件。

(3)禁止提供finger服務。在Linux系統中,使用finger命令可以顯示本地或遠程系統中目前已登錄用戶的詳細信息。禁止提供finger服務的有效方法是,通過修改該文件屬性、許可權(改為600)使得只有root用戶才可以執行該命令。

(4)處理「inetd.conf」文件。Linux系統通過inetd(超級伺服器)程序根據網路請求裝入網路程序。該程序通過「/etc/inetd.conf」文件獲得inetd在監聽哪些網路埠,為每個埠啟動哪些特定服務等信息。因此,該文件同樣會泄露大量的敏感信息。解決問題的方法是,通過將其許可權改為600隻允許root用戶訪問,並通過改寫「/etc/inetd.conf」文件將不需要的服務程序禁止掉,最後修改該文件的屬性使其不能被修改。

總結

緩沖區溢出攻擊之所以能成為一種常見的攻擊手段,其原因在於緩沖區溢出漏洞太普遍,且易於實現攻擊,因此緩沖區溢出問題一直是個難題。

所幸的是,OpenBSD開發組為解決這一安全難題採用了三種新的有效策略。相信不久的將來,Linux用戶可以不再為緩沖區溢出攻擊而寢食難安了。

RAR文件在Linux下用起來

要在Linux下處理.rar文件,需要安裝RARforLinux。該軟體可以從網上下載,但要記住,它不是免費的。大家可從http://www.onlinedown.net/sort/125_1.htm下載RARforLinux 3.2.0,然後用下面的命令安裝:

# tar -xzpvf rarlinux-3.2.0.tar.gz

# cd rar

# make

安裝後就有了rar和unrar這兩個程序,rar是壓縮程序,unrar是解壓程序。它們的參數選項很多,這里只做簡單介紹,依舊舉例說明一下其用法:

# rar a all *.mp3

這條命令是將所有.mp3的文件壓縮成一個rar包,名為all.rar,該程序會將.rar 擴展名將自動附加到包名後。

# unrar e all.rar

這條命令是將all.rar中的所有文件解壓出來。

⑦ linux下怎麼獲取tcp發送緩沖區還有多少空閑

int getsockopt(int sockfd, int level, int optname, void *optval, socklen_t *optlen);

參數
sockfd:一個標識套介面的描述字。
level:選項定義的層次。支持的層次僅有SOL_SOCKET和IPPROTO_TCP。
optname:需獲取的套介面選項。
optval:指針,指向存放所獲得選項值的緩沖區。
optlen:指針,指向optval緩沖區的長度值。

返回值:
若無錯誤發生,getsockopt()返回0。否則的話,返回SOCKET_ERROR錯誤,應用程序可通過WSAGetLastError()獲取相應錯誤代碼。
錯誤代碼:
WSANOTINITIALISED:在使用此API之前應首先成功地調用WSAStartup()。
WSAENETDOWN:WINDOWS套介面實現檢測到網路子系統失效。
WSAEFAULT:optlen參數非法。
WSAEINPROGRESS:一個阻塞的WINDOWS套介面調用正在運行中。
WSAENOPROTOOPT:未知或不支持選項。其中,SOCK_STREAM類型的套介面不支持SO_BROADCAST選項,SOCK_DGRAM類型的套介面不支持SO_ACCEPTCONN、SO_DONTLINGER 、SO_KEEPALIVE、SO_LINGER和SO_OOBINLINE選項。
WSAENOTSOCK:描述字不是一個套介面。

注釋:
編輯
getsockopt()函數用於獲取任意類型、任意狀態套介面的選項當前值,並把結果存入optval。在不同協議層上存在選項,但往往是在最高的「套介面」層次上,設置選項影響套介面的操作,諸如操作的阻塞與否、包的選徑方式、帶外數據的傳送等。
被選中選項的值放在optval緩沖區中。optlen所指向的整形數在初始時包含緩沖區的長度,在調用返回時被置為實際值的長度。對SO_LINGER選項而言,相當於linger結構的大小,對其他選項來說,是一個整形數的大小。
如果未進行setsockopt()調用,則getsockopt()返回系統預設值。
getsockopt()支持下列選項。其中「類型」欄指出了optval所指向的值。僅有TCP_NODELAY選項使用了IPPROTO_TCP層;其餘選項均使用SOL_SOCKET層。
選項 類型 意義
SO_ACCEPTCONN BOOL 套介面正在用listen()監聽。
SO_BROADCAST BOOL 套介面設置為傳送廣播信息。
SO_DEBUG BOOL 允許調試。
SO_DONTLINER BOOL 若為真,則SO_LINGER選項被禁止。
SO_DONTROUTE BOOL 禁止選徑。
SO_ERROR int 獲取錯誤狀態並清除。
SO_KEEPALIVE BOOL 發送「保持活動」信息。
SO_LINGER struct linger FAR* 返回當前各linger選項。
SO_OOBINLINE BOOL 在普通數據流中接收帶外數據。
SO_RCVBUF int 接收緩沖區大小。
SO_REUSEADDR BOOL 套介面能和一個已在使用中的地址捆綁。
SO_SNDBUF int 發送緩沖區大小。
SO_TYPE int 套介面類型(如SOCK_STREAM)。
TCP_NODELAY BOOL 禁止發送合並的Nagle演算法
getsockopt()不支持的BSD選項有:
選項名 類型 意義
SO_RCVLOWAT int 接收低級水印。
SO_RCVTIMEO int 接收超時。
SO_SNDLOWAT int 發送低級水印。
SO_SNDTIMEO int 發送超時。
IP_OPTIONS 獲取IP頭中選項。
TCP_MAXSEG int 獲取TCP最大段的長度。
用一個未被支持的選項去調用getsockopt()將會返回一個WSAENOPROTOOPT錯誤代碼(可用WSAGetLastError()獲取)。

⑧ 請教Linux關於UDP最大緩沖區設置

1. tcp 收發緩沖區默認值 [root@ ]# cat /proc/sys/net/ipv4/tcp_rmem 4096 87380 4161536 87380 :tcp接收緩沖區的默認值 [root@ ]# cat /proc/sys/net/ipv4/tcp_wmem 4096 16384 4161536 16384 : tcp 發送緩沖區的默認值 2. tcp 或udp收發緩沖區最大值 [root@ ]# cat /proc/sys/net/core/rmem_max 131071 131071:tcp 或 udp 接收緩沖區最大可設置值的一半。 也就是說調用 setsockopt(s, SOL_SOCKET, SO_RCVBUF, &rcv_size, &optlen); 時rcv_size 如果超過 131071,那麼 getsockopt(s, SOL_SOCKET, SO_RCVBUF, &rcv_size, &optlen); 去到的值就等於 131071 * 2 = 262142 [root@ ]# cat /proc/sys/net/core/wmem_max 131071 131071:tcp 或 udp 發送緩沖區最大可設置值得一半。 跟上面同一個道理 3. udp收發緩沖區默認值 [root@ ]# cat /proc/sys/net/core/rmem_default 111616:udp接收緩沖區的默認值 [root@ ]# cat /proc/sys/net/core/wmem_default 111616 111616:udp發送緩沖區的默認值 4. tcp 或udp收發緩沖區最小值 tcp 或udp接收緩沖區的最小值為 256 bytes,由內核的宏決定; tcp 或udp發送緩沖區的最小值為 2048 bytes,由內核的宏決定

⑨ 如何設置 linux cp緩沖區大小

幀緩沖(framebuffer)是 Linux 為顯示設備提供的一個介面,把顯存抽象後的一種設備,他允許上層應用程序在圖形模式下直接對顯示緩沖區進行讀寫操作。這種操作是抽象的,統一的。用戶不必關心物理顯存的位置、換頁機制等等具體細節。這些都是由Framebuffer 設備驅動來完成的。幀緩沖驅動的應用廣泛,在 linux 的桌面系統中,Xwindow 伺服器就是利用幀緩沖進行窗口的繪制。尤其是通過幀緩沖可顯示漢字點陣,成為 Linux漢化的唯一可行方案。
幀緩沖設備對應的設備文件為/dev/fb*,如果系統有多個顯示卡,Linux 下還可支持多個幀緩沖設備,最多可達 32個,分別為/dev/fb0 到/dev/fb31,而/dev/fb 則為當前預設的幀緩沖設備,通常指向/dev/fb0。當然在嵌入式系統中支持一個顯示設備就夠了。幀緩沖設備為標准字元設備,主設備號為29,次設備號則從0到31。分別對應/dev/fb0-/dev/fb31。
通過/dev/fb,應用程序的操作主要有這幾種:
1.讀/寫(read/write)/dev/fb:相當於讀/寫屏幕緩沖區。例如用 cp /dev/fb0 tmp 命令可將當前屏幕的內容拷貝到一個文件中,而命令 cp tmp > /dev/fb0 則將圖形文件tmp顯示在屏幕上。
2.映射(map)操作:由於 Linux工作在保護模式,每個應用程序都有自己的虛擬地址空間,在應用程序中是不能直接訪問物理緩沖區地址的。為此,Linux 在文件操作file_operations 結構中提供了 mmap函數,可將文件的內容映射到用戶空間。對於幀緩沖設備,則可通過映射操作,可將屏幕緩沖區的物理地址映射到用戶空間的一段虛擬地址中,之後用戶就可以通過讀寫這段虛擬地址訪問屏幕緩沖區,在屏幕上繪圖了。
3.I/O控制:對於幀緩沖設備,對設備文件的 ioctl操作可讀取/設置顯示設備及屏幕的參數,如解析度,顯示顏色數,屏幕大小等等。ioctl 的操作是由底層的驅動程序來完成的。
在應用程序中,操作/dev/fb的一般步驟如下:
1.打開/dev/fb設備文件。
2.用 ioctrl 操作取得當前顯示屏幕的參數,如屏幕解析度,每個像素點的比特數。根據屏幕參數可計算屏幕緩沖區的大小。
3.將屏幕緩沖區映射到用戶空間(mmap)。
4.映射後就可以直接讀寫屏幕緩沖區,進行繪圖和圖片顯示了。

⑩ Linux如何清空Socket緩沖區

做法當然很簡單,就是先清除接收區的緩沖數據,可是如何清除? 網上有很多這樣的問題,但都沒什麼規范的解決辦法,有的甚至為了達到清空的目的,建議先close一下socket,這個太大手筆了,為了解決一個小問題而大動干戈,根本不是個合理的解決辦法。 還有就是用recv讀取,但是由於不知道緩存里有多少數據,如果是阻塞模式,到最後必然等到超時才知道數據已經讀取完畢,這是個問題。 另一個是用fgetc,通過返回判斷是否是feof: whlie (1) { a=fgetc(f);if (feof(f)) break;//… b=fgetc(f);if (feof(f)) break;//… } 當然,我不知道讀取完畢後最後一次調用fgetc會不會堵塞,需要測試。 在非阻塞模式下,我們用recv就可以輕松搞定了,但是阻塞模式下,由於我們不知道緩沖區有多少數據,不能直接調用recv嘗試清除。 使用一個小小的技巧,利用select函數,我們可以輕松搞定這個問題: select函數用於監視一個文件描述符集合,如果集合中的描述符沒有變化,則一直阻塞在這里,直到超時時間到達;在超時時間內,一旦某個描述符觸發了你所關心的事件,select立即返回,通過檢索文件描述符集合處理相應事件;select函數出錯則返回小於零的值,如果有事件觸發,則返回觸發事件的描述符個數;如果超時,返回0,即沒有數據可讀。 重點在於:我們可以用select的超時特性,將超時時間設置為0,通過檢測select的返回值,就可以判斷緩沖是否被清空。通過這個技巧,使一個阻塞的socket成了『非阻塞』socket. 現在就可以得出解決方案了:使用select函數來監視要清空的socket描述符,並把超時時間設置為0,每次讀取一個位元組然後丟棄(或者按照業務需要進行處理,隨你便了),一旦select返回0,說明緩沖區沒數據了(「超時」了)。 struct timeval tmOut;tmOut.tv_sec = 0;tmOut.tv_usec = 0;fd_set fds;FD_ZEROS(&fds);FD_SET(skt, &fds); int nRet; char tmp[2]; memset(tmp, 0, sizeof(tmp)); while(1) { nRet= select(FD_SETSIZE, &fds, NULL, NULL, &tmOut);if(nRet== 0) break;recv(skt, tmp, 1,0);} 這種方式的好處是,不再需要用recv、recvfrom等阻塞函數直接去讀取,而是使用select,利用其超時特性檢測緩沖區是否為空來判斷是否有數據,有數據時才調用recv進行清除。 有人說同樣可以用recv和socket的超時設置去清空啊,這個沒錯,但是你需要直接對socket描述符設置超時時間,而為了清空數據而直接修改socket描述符的屬性,可能會影響到其他地方的使用,造成系統奇奇怪怪的問題,所以,不推薦使用。

閱讀全文

與linuxtcp緩沖區相關的資料

熱點內容
麗水四軸加工中心編程 瀏覽:689
國產系統怎麼解壓 瀏覽:552
戰雙程序員 瀏覽:483
him觸摸編程軟體 瀏覽:931
植物大戰僵屍存檔怎麼轉移安卓 瀏覽:852
java棧的元素 瀏覽:737
程序員與籃球事件 瀏覽:675
app反編譯不完整 瀏覽:788
電腦上的文件夾怎麼調整 瀏覽:7
伺服器無響應是什麼原因呀 瀏覽:984
wd文檔里的app怎麼製作 瀏覽:513
電腦里的文件夾沒有了一般能恢復嗎 瀏覽:418
哪裡有配加密鑰匙的 瀏覽:210
伺服器開不了機怎麼把數據弄出來 瀏覽:958
gif動態圖片怎麼壓縮 瀏覽:521
黑猴子棒球壓縮文件解壓密碼 瀏覽:631
如何讓app適應不同的手機屏幕大小 瀏覽:10
蘋果手機如何給安卓手機分享軟體 瀏覽:761
蘋果電腦怎麼運行騰訊雲伺服器 瀏覽:59
明日之後沙石堡命令助手 瀏覽:261