深入理解阻塞socket和非阻塞socket
什么是阻塞socket,什么是非阻塞socket。對于這個問題,我們要先弄清什么是阻塞/非阻塞。阻塞與非阻塞是對一個文件描述符指定的文件或設備的兩種工作方式。?阻塞的意思是指,當試圖對該文件描述符進行讀寫時,如果當時沒有東西可讀或者暫時不可寫,程序就進入等待狀態(tài),直到有東西可讀或者可寫為止。?非阻塞的意思是,當沒有東西可讀或者不可寫時,讀寫函數(shù)就馬上返回,而不會等待。
現(xiàn)在來理解什么是阻塞socket,什么是非阻塞socket。每個通過socket()函數(shù)創(chuàng)建的socket,本質(zhì)就是一個文件描述符,所以對該文件描述符的IO操作方式不同,就有了阻塞socket和非阻塞socket。?那是不是說阻塞socket下的所以socket api函數(shù)都是阻塞的呢,如果你還不能正確的回答這個問題,說明上面簡短的說明并沒有讓你真正的明白什么是阻塞socket和非阻塞socket。這個問題的答案是否定的,為什么是否定的,因為并不是每個socket的api都會涉及到對文件描述符的IO操作。
?
?這里我列舉了,哪些socket api會阻塞:
accept,connect,recv(recvfrom),send(sendto),closesocket,select(poll或epoll)
1)accept在阻塞模式下,沒有新連接時,線程會進入睡眠狀態(tài);非阻塞模式下,沒有新連接時,立即返回WOULDBLOCK錯誤。
2)connect在阻塞模式下,僅TCP連接建立成功或出錯時才返回,分幾種具體的情況,這里不再敘述;非阻塞模式下,該函數(shù)會立即返回INPROCESS錯誤(需用select檢測該連接是否建立成功)
3)recv/recvfrom/send/sendto很好理解,因為這兩類函數(shù)讀寫socket文件描述符的接收/發(fā)送緩沖區(qū)。?
4)?select/poll/epoll并不是真正意義上的阻塞,它們的阻塞是由于它們最后一個timeout參數(shù)決定的,timeout大于0時,它們會一直等待直到超時才退出(相等于阻塞了吧,^_^),而timeout=-1即永遠等待
總結(jié)
以上是生活随笔為你收集整理的深入理解阻塞socket和非阻塞socket的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux下如何让自己的程序在开机时自动
- 下一篇: echo服务器(回显服务器)