在學習嵌入式Linux網絡編程中,不少同窗都發現了一個問題,那就是調用connect函數時,若是服務端關閉,客戶 端調用connect()函數時,發現阻塞在那裏,並且利用ctrl+c信號去中止客戶端程序時,須要等待一個較爲長的時間才能響應了,這個時間若是你們 細心會發現,每次都是75秒的時間。那麼有沒有什麼比較好的辦法,能夠以用戶能接受的一個時間響應來中止掉一個正在connect鏈接的客戶端那?好比我 們在作一個網絡控制檯的程序,用戶須要隨時能夠中止掉任何一個網絡服務鏈接,那麼對於這樣一個須要等待75秒時間才能反饋出服務狀態的程序,用戶是沒法接 受的。編程
對於如何解決這個問題,咱們能夠分析下,要想完成用戶在一個能接受的時間裏迅速反饋出服務 端已經關閉的狀態,那麼咱們的程序應該作到在一個規定的時間片內,能夠捕獲到用戶發出的控制狀態,而後處理用戶的需求。那麼要作到能夠在規定的時間片內捕 獲用戶的控制狀態,就必須禁止讓咱們的connect()函數阻塞75秒的狀況發生,也就是說,要讓connect()函數變爲非阻塞狀態才行。服務器
好了,如今解決問題的關鍵就是如何把connect變爲非阻塞狀態了,咱們知道,socket編程的操做對象是socket,而socket他又屬於系統描述符類型,那麼對於系統描述符,咱們是怎麼操做他變爲非阻塞的那?是利用fcntl()函數或者ioctl()函數。網絡
想到這裏,好像問題應該已經解決了,可是咱們調試發現,在服務端出現錯誤的時候,connect確實立刻返回,可是,若是服務端正確那,connect仍是立刻返回,這樣,咱們沒法判斷connect函數是否成功了,那這個問題又該如何解決呢?socket
咱們是否想到了一個select函數那,他具有監聽文件描述符的功能,若是咱們把以前的socket讓select監聽他是否可寫,是否是問題也就解決了。函數
好了,那麼咱們總結下整個思路:學習
1.創建socket
那麼根據上面的6個步驟,咱們寫一個簡單的模塊程序來調試看下:調試
{