accept和select的區別

參考:https://blog.csdn.net/lsgqjh/article/details/65629609

select:查看指定fd_set中socket狀態,如果fd_set中有套接字準備就緒(觸發(讀、寫或執行)),則會返回,返回值爲觸發的套接字個數

accept:經過創建套接字socket()綁定bind()以及listen()之後,將監聽socket和客戶端socket建立一個全新連接,並返回client的socket信息;

判斷是否有客戶端發起鏈接請求,   一般用select(),然後accept()。

應該先select,可以測一下超時。

如果先accept,select就沒必要了。
還有select後,可以測一下資源,如果fd用完了,可以等歸還;直接的accept,發生這事這個連接就丟了。

 

一般模型如下
初始化 (socket,bind,listen);
while(1)
{
  設置監聽讀寫文件描述符 (FD_SET*);
  調用 select;

  如果是傾聽套接字就緒 , 說明一個新的連接請求建立
  {
    建立連接 (accept);
    將accept返回的client fd加入到監聽文件描述符中去 ;
  }
  否則說明是一個已經連接過的描述符
  {
    進行操作 (read 或者 write);
  }
}

 

select主要監聽的的是過來的狀態,如果一個客戶端給服務器端發數據(會通過socket發送,通過地址能找到服務器端的socket),select監聽收的就會有接收。可以用接收到的socket進行讀操作。()

accept 在連接的時候就會將客戶端的socket和服務端的socket進行連接,返回對端的socket,可以進行讀或寫操作。select監聽到讀事件,可以讀。但是要寫需要accept進行寫操作。

 

轉載於:https://www.cnblogs.com/zhchy89/p/8850048.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章