2015-10-18 64 views
0

我有一個用於接收和發送數據包的套接字。而僞代碼是:如何正確處理用非阻塞套接字發送/寫入?

setnonblock(fd); 
    add_event(event_base, recv_ev); 
    while("I have packets to write"){ 
     send(fd, packet); 
     .... 
    } 

    .... 

現在的問題是,由於fd是非阻塞的,在發送數據包之前發送(fd)許多返回。但我希望它可以在程序運行到下一步之前成功發送數據包,或者爲它註冊一個事件。但是,如果我爲它註冊一個事件,即使沒有可用的數據包(請注意,這些數據包不是來自僞代碼中的recv(),而是來自其他地方),可能會頻繁地觸發事件。

那麼如何處理用它?

回答

1

這一切都回到前面。套接字幾乎都是可寫的。所以,你應該:

  • 當你有數據發送到發送
  • 呼叫循環每次發送到t完成或返回零
  • 如果它返回零,然後上的可寫性選擇,而簡歷當它發生時發送,然後停止選擇可寫性。
+0

是否有第二個項目的任何示例代碼(調用每個發送循環,直到t完成或返回零)?我不明白你的第三項(如果它返回零,然後選擇可寫性,並在它發生時繼續發送,然後停止選擇可寫性)什麼是「選擇可寫性」?謝謝 – lily

+0

選擇可寫性是你的僞代碼已經在做什麼。 (2)的例子比比皆是。 – EJP